diff --git a/DanubeRiver/__init__.py b/DanubeRiver/__init__.py index 666cfac42ea6f73daf65672fd3fc01adfb47689a..c0e9c6ca59362cba9846ab27ffbc1f97303deb83 100644 --- a/DanubeRiver/__init__.py +++ b/DanubeRiver/__init__.py @@ -135,6 +135,10 @@ def make_wafers(args_config, no_doc, no_csv): ar = DanubeRiver.fet.generate(config) if ar is not None: structures+=ar + if config.have_fingered_mosfets(): + ar = DanubeRiver.fet.generate(config, fingered=True) + if ar is not None: + structures+=ar def sortStructure(val): return val.xsize*val.ysize structures.sort(key=sortStructure,reverse=True) @@ -152,16 +156,16 @@ def make_wafers(args_config, no_doc, no_csv): r = [] spacing = lph.to_nm(config, config.get_structure_spacing()) for i, st in enumerate(structures): - if w+st.xsize+spacing>maxw or i==len(rows)-1: + r.append(st) + w += st.xsize+spacing + h = st.ysize if st.ysize>h else h + next_w = structures[i+1].xsize if i+1<len(structures) else structures[i].xsize + if i+1==len(structures) or w+next_w+spacing>maxw: h += spacing rows.append({'r':r, 'w':w, 'h':h}) r = [] h = w = 0 - r.append(st) - w += st.xsize+spacing - h = st.ysize if st.ysize>h else h - - have_index = sum(r['h'] for r in rows)>maxh + have_index = sum(r['h'] for r in rows) > maxh # organize ret=[] @@ -169,13 +173,13 @@ def make_wafers(args_config, no_doc, no_csv): h = 0 cnt = 0 for i, r in enumerate(rows): - if h+r['h']>=maxh or i+1==len(rows): + structures.append(r) + h += r['h'] + next_h = rows[i+1]['h'] if i+1 < len(rows) else rows[i]['h'] + if h+next_h>=maxh or i+1==len(rows): cnt = cnt+1 if have_index else None ret.append(DanubeTestWafer(config, structures, no_doc, no_csv, index=cnt)) # create wafer # reset structures.clear() h = 0 - h += r['h'] - structures.append(r) - return ret diff --git a/DanubeRiver/config.py b/DanubeRiver/config.py index e69924ce7780d6240fdd19ccfc989fff3b841152..7bbf8b30d796eb6b82696f32065947e93d9bd796 100644 --- a/DanubeRiver/config.py +++ b/DanubeRiver/config.py @@ -172,14 +172,28 @@ class DanubeConfig(Config): dimensions = self.get_section_value('mosfet', 'dimensions') if dimensions is None: return ret - dimensions = dimensions.strip().split(',') for i in dimensions: i = i.split(':') w = float(i[0]) h = float(i[1]) - ret.append((w,h)) + ret.append((1,w,h)) + return ret + def get_finger_fet_dimensions(self): + ret=[] + dimensions = self.get_section_value('mosfet', 'fingerdimensions') + if dimensions is None: + return ret + dimensions = dimensions.strip().split(',') + for i in dimensions: + i = i.split('x') + n = int(i[0]) + if len(i) > 1: + i = i[1].split(':') + w = float(i[0]) + h = float(i[1]) + ret.append((n,w,h)) return ret def get_resistor_max_current(self): @@ -204,6 +218,12 @@ class DanubeConfig(Config): res = res.strip() return (res == 'true') + def have_fingered_mosfets(self): + res = self.get_section_value('flags', 'fingeredmosfet') + if res is not None: + res = res.strip() + return (res == 'true') + def have_power_mosfets(self): res = self.get_section_value('flags', 'powermosfet') if res is not None: diff --git a/DanubeRiver/fet.py b/DanubeRiver/fet.py index 80ebf0aae707b89df245fc5ba9b1ed4a7c56e479..6d7e9d0ee3d56671bcc9c683ccf80e9783d0e90c 100644 --- a/DanubeRiver/fet.py +++ b/DanubeRiver/fet.py @@ -36,10 +36,12 @@ class DanubeTestMOSFET(AbstractDanubeStructure): elif mtype == ChannelType.NMOS: ret += "N_" - ret += "W" ret += str(int(dims[0])) - ret += "/L" + ret += "x" + ret += "W" ret += str(int(dims[1])) + ret += "/L" + ret += str(int(dims[2])) return ret @@ -60,9 +62,11 @@ class DanubeTestMOSFET(AbstractDanubeStructure): self.connect_rect(self.pads[0].ports["e4"], fet.ports["e1_3"], self.conlayer_name) # connect drain self.connect_rect(self.pads[2].ports["e2"], fet.ports["e3_4"], self.conlayer_name) # connect bulk -def generate(config): +def generate(config, fingered=False): ret = [] - dimensions = config.get_fet_dimensions() + dimensions = config.get_finger_fet_dimensions() if fingered else config.get_fet_dimensions() + if dimensions is None: + return ret for dims in dimensions: s = DanubeTestMOSFET(config, ChannelType.PMOS, dims) ret.append(s) diff --git a/configs/kacst-ls1u.cfg b/configs/kacst-ls1u.cfg index 41495692ba25e9bca99b7eda78f5cb8a77b00339..a01937753b94cf877c2e67f7dd2b6b7957519a85 100644 --- a/configs/kacst-ls1u.cfg +++ b/configs/kacst-ls1u.cfg @@ -26,6 +26,7 @@ Lambda = 500nm Resistance = true Capacitance = true MOSFET = true +#FingeredMOSFET = true [Resistor] Layers = nwell, pwell, ndiffusion, pdiffusion, poly, metal1, metal2 @@ -38,4 +39,4 @@ LayerPairs= poly:nwell, poly:pwell, metal1:nwell, metal1:pwell, metal2:metal1 [MOSFET] Dimensions = 3:2, 4:2, 5:2, 5:3, 5:4, 5:5, 10:3, 10:4, 10:5, 10:10, 20:10, 20:20, 40:10, 40:20 - +FingerDimensions = 5x5:5, 5x5:10