def _add_generators(self): for layer_name, layer in self.pdk.layers.items(): if isinstance(layer, LayerMetal): self._add_metal_generator(layer) elif isinstance(layer, LayerVia): self._add_via_generator(layer) v_grid_pitch = sum(self.pdk.layers['M1'].width) + sum(self.pdk.layers['M1'].space) h_grid_pitch = sum(self.pdk.layers['M2'].width) + sum(self.pdk.layers['M2'].space) setattr(self, 'BB', self.addGen(Region('boundary', 'Boundary', h_grid=SingleGrid(pitch=h_grid_pitch), v_grid=SingleGrid(pitch=v_grid_pitch))))
def _add_generators(self): for layer_name, layer in self.pdk.layers.items(): if layer_name.startswith('M'): self._add_metal_generator(layer) elif layer_name.startswith('V'): self._add_via_generator(layer.default_via) v_grid_pitch = sum(self.pdk.layers['M1'].width) + sum( self.pdk.layers['M1'].space) h_grid_pitch = sum(self.pdk.layers['M2'].width) + sum( self.pdk.layers['M2'].space) setattr( self, 'BB', self.addGen( Region('boundary', 'Boundary', h_grid=SingleGrid(pitch=h_grid_pitch), v_grid=SingleGrid(pitch=v_grid_pitch))))
def __init__(self): super().__init__() self.finsPerUnitCell = 12 # Must be a multiple of 2 assert self.finsPerUnitCell % 2 == 0 # Should be a multiple of 4 for maximum utilization assert self.finsPerUnitCell % 4 == 0 self.m2PerUnitCell = self.finsPerUnitCell // 2 + 3 m2Pitch = 720 unitCellHeight = self.m2PerUnitCell * m2Pitch pcPitch = unitCellHeight // 2 m1Pitch = 720 m3Pitch = 720 plPitch = m1Pitch plOffset = plPitch // 2 dcPitch = 2 * m1Pitch pcWidth = 200 m1Width = 400 m2Width = 400 m3Width = 400 dcWidth = 200 plWidth = 200 ndWidth = 120 ndPitch = 360 self.nd = self.addGen( Wire('nd', 'ndiff', 'h', clg=UncoloredCenterLineGrid(pitch=ndPitch, width=ndWidth, repeat=2 * self.m2PerUnitCell), spg=SingleGrid(pitch=dcPitch))) self.pc = self.addGen( Wire('pc', 'polycon', 'h', clg=UncoloredCenterLineGrid(width=pcWidth, pitch=pcPitch), spg=EnclosureGrid(pitch=dcPitch, stoppoint=plOffset - plWidth // 2))) self.m1 = self.addGen( Wire('m1', 'M1', 'v', clg=UncoloredCenterLineGrid(width=m1Width, pitch=m1Pitch, repeat=2), spg=EnclosureGrid(pitch=unitCellHeight, stoppoint=unitCellHeight // 2 - m2Pitch))) self.m3 = self.addGen( Wire('m3', 'M3', 'v', clg=UncoloredCenterLineGrid(width=m3Width, pitch=m3Pitch, repeat=2), spg=EnclosureGrid(pitch=unitCellHeight, stoppoint=unitCellHeight // 2 - m2Pitch))) self.m2 = self.addGen( Wire('m2', 'M2', 'h', clg=UncoloredCenterLineGrid(width=m2Width, pitch=m2Pitch, repeat=self.m2PerUnitCell), spg=EnclosureGrid(pitch=2 * m1Pitch, stoppoint=m1Pitch // 2))) self.pl = self.addGen( Wire('pl', 'poly', 'v', clg=UncoloredCenterLineGrid(width=plWidth, pitch=plPitch, offset=plOffset, repeat=2), spg=EnclosureGrid(pitch=unitCellHeight, stoppoint=m1Pitch // 2))) self.dc = self.addGen( Wire('dc', 'diffcon', 'v', clg=UncoloredCenterLineGrid(width=dcWidth, pitch=dcPitch), spg=Grid())) stoppoint = m1Pitch // 2 self.dc.spg.addGridLine(0, False) self.dc.spg.addGridLine(stoppoint, True) self.dc.spg.addGridLine(unitCellHeight // 2 - stoppoint, True) self.dc.spg.addGridLine(unitCellHeight // 2, False) self.dc.spg.addGridLine(unitCellHeight // 2 + stoppoint, True) self.dc.spg.addGridLine(unitCellHeight - stoppoint, True) self.dc.spg.addGridLine(unitCellHeight, False)
def __init__(self): super().__init__() self.finsPerUnitCell = 14 self.m2PerUnitCell = 7 ndPitch = 360 pdPitch = 360 m2Pitch = 720 self.unitCellHeight = self.m2PerUnitCell * m2Pitch pcPitch = self.unitCellHeight // 2 m1Pitch = 864 m3Pitch = 720 self.unitCellWidth = 2 * m1Pitch plPitch = m1Pitch plOffset = plPitch // 2 dcPitch = m1Pitch pcWidth = 200 m1Width = 400 m2Width = 400 m3Width = 400 dcWidth = 200 plWidth = 200 ndWidth = 120 ndPitch = 360 self.pl = self.addGen( Wire('pl', 'poly', 'v', clg=CenterLineGrid(), spg=EnclosureGrid(pitch=m2Pitch // 2, stoppoint=16))) for i in range(5): self.pl.clg.addCenterLine(i * plPitch // 2, plWidth, i % 2 == 1) self.pl.clg.semantic() self.nd = self.addGen( Region('nd', 'ndiff', h_grid=SingleGrid(pitch=ndPitch), v_grid=self.pl.clg)) self.pd = self.addGen( Region('pd', 'pdiff', h_grid=SingleGrid(pitch=pdPitch), v_grid=self.pl.clg)) self.pc = self.addGen( Wire('pc', 'polycon', 'h', clg=UncoloredCenterLineGrid(width=pcWidth, pitch=pcPitch), spg=EnclosureGrid(pitch=dcPitch, stoppoint=plOffset - plWidth // 2))) self.m1 = self.addGen( Wire('m1', 'M1', 'v', clg=UncoloredCenterLineGrid(width=m1Width, pitch=m1Pitch, repeat=2), spg=EnclosureGrid(pitch=m2Pitch, stoppoint=m2Width // 2))) self.m2 = self.addGen( Wire('m2', 'M2', 'h', clg=UncoloredCenterLineGrid(width=m2Width, pitch=m2Pitch, repeat=self.m2PerUnitCell), spg=EnclosureGrid(pitch=2 * m1Pitch, stoppoint=m1Pitch // 2))) self.m3 = self.addGen( Wire('m3', 'M3', 'v', clg=UncoloredCenterLineGrid(width=m3Width, pitch=m3Pitch), spg=EnclosureGrid(pitch=self.unitCellHeight, stoppoint=self.unitCellHeight // 2 - m2Pitch))) self.dc = self.addGen( Wire('dc', 'diffcon', 'v', clg=CenterLineGrid(), spg=EnclosureGrid(pitch=m2Pitch // 2, stoppoint=0))) for i in range(5): self.dc.clg.addCenterLine(i * dcPitch // 2, dcWidth, i % 2 == 0) self.dc.clg.semantic() self.v0 = self.addGen( Via('v0', 'via0', v_clg=self.m1.clg, h_clg=self.pc.clg)) self.v1 = self.addGen( Via('v1', 'via1', v_clg=self.m1.clg, h_clg=self.m2.clg)) self.v2 = self.addGen( Via('v2', 'via2', v_clg=self.m3.clg, h_clg=self.m2.clg))
def __init__(self, gate_u, fin_u, fin_u1): super().__init__() ##### PDK Abstraction ##### self.plPitch = 80 ### Use from DRM self.plWidth = 14 self.finPitch = 42 ### finPitch from DRM self.finWidth = 10 self.m0Pitch = self.plPitch self.m0Width = 34 self.m1Pitch = self.plPitch ### Distance between Source and Drain self.m1Width = 32 self.m2Pitch = 84 ### Can be directly used from DRM (usually twice of the fin pitch) self.m2Width = 32 self.m3Pitch = self.plPitch ### Use same as for m1 self.m3Width = 32 self.v0Pitch = 3 * self.finPitch ### V0 spacing rule self.v0Width = 32 self.plActive_s = 73 ### Active horizontal extension over the Gate self.plActive = 7 self.v_enclosure = 20 self.fin_enclosure = (self.finPitch - self.finWidth) // 2 ### Fin enclosure by active self.active_enclosure = 42 self.finOffset = 0 self.plOffset = 0 self.finDummy = 5 ### Number of dummy fins self.gateDummy = 3 ### Number of dummy gates self.gate = int( round(gate_u + 2 * self.gateDummy)) #### Total number of gates per unit cell self.extension_x = ( self.plPitch - self.plWidth ) // 2 ### Minimum horizontal extension of GCUT past GATE self.activeWidth = self.finPitch * fin_u1 self.activeWidth_h = ( (gate_u - 1) * self.plPitch) + (self.plActive_s * 2) + self.plWidth self.activePitch = self.finPitch * (fin_u + 2 * self.finDummy) self.activeOffset = ( self.activeWidth // 2 ) + self.finDummy * self.finPitch - self.fin_enclosure - self.finWidth // 2 + self.finOffset self.RVTWidth = self.activeWidth + 2 * self.active_enclosure self.RVTPitch = self.activePitch self.RVTOffset = ( self.RVTWidth // 2 ) + self.finDummy * self.finPitch - self.fin_enclosure - self.active_enclosure - self.finWidth // 2 + self.finOffset self.m0 = self.addGen( Wire('m0', 'M0', 'v', clg=UncoloredCenterLineGrid(pitch=self.m0Pitch, width=self.m0Width, offset=self.m0Pitch // 2), spg=EnclosureGrid(pitch=self.activePitch, offset=self.activeOffset, stoppoint=self.activeWidth // 2, check=True))) self.m1 = self.addGen( Wire('m1', 'M1', 'v', clg=ColoredCenterLineGrid(colors=['c1', 'c2'], pitch=self.m1Pitch, width=self.m1Width, offset=self.m1Pitch // 2), spg=EnclosureGrid(pitch=self.m2Pitch, offset=self.m2Pitch // 2, stoppoint=self.m2Width // 2 + self.v_enclosure, check=True))) self.m2 = self.addGen( Wire('m2', 'M2', 'h', clg=ColoredCenterLineGrid(colors=['c2', 'c1'], pitch=self.m2Pitch, width=self.m2Width, offset=self.m2Pitch // 2), spg=EnclosureGrid(pitch=self.m1Pitch, offset=self.m1Pitch // 2, stoppoint=self.m1Width // 2 + self.v_enclosure, check=True))) self.m3 = self.addGen( Wire('m3', 'M3', 'v', clg=ColoredCenterLineGrid(colors=['c1', 'c2'], pitch=self.m3Pitch, width=self.m3Width, offset=self.m3Pitch // 2), spg=EnclosureGrid(pitch=self.m2Pitch, offset=self.m2Pitch // 2, stoppoint=self.m2Width // 2 + self.v_enclosure, check=True))) self.pl = self.addGen( Wire('pl', 'poly', 'v', clg=UncoloredCenterLineGrid(pitch=self.plPitch, width=self.plWidth, offset=self.plOffset), spg=EnclosureGrid(pitch=self.finPitch, stoppoint=self.m2Pitch // 2))) self.fin = self.addGen( Wire('fin', 'fin', 'h', clg=UncoloredCenterLineGrid(pitch=self.finPitch, width=self.finWidth, offset=self.finOffset), spg=CenteredGrid(pitch=self.plPitch))) self.active = self.addGen( Wire('active', 'active', 'h', clg=UncoloredCenterLineGrid(pitch=self.activePitch, width=self.activeWidth, offset=self.activeOffset), spg=SingleGrid(pitch=self.plPitch))) self.RVT = self.addGen( Wire('RVT', 'polycon', 'h', clg=UncoloredCenterLineGrid(pitch=self.RVTPitch, width=self.RVTWidth, offset=self.RVTOffset), spg=SingleGrid(pitch=self.plPitch))) self.nselect = self.addGen( Region('nselect', 'nselect', v_grid=CenteredGrid(pitch=self.plPitch), h_grid=self.fin.clg)) v0x_offset = self.finDummy * self.finPitch - self.fin_enclosure - self.finWidth // 2 + self.finOffset + self.v0Width // 2 self.v0 = self.addGen( Via('v0', 'via0', h_clg=UncoloredCenterLineGrid(pitch=self.v0Pitch, width=self.v0Width, offset=v0x_offset), v_clg=self.m1.clg)) self.v1 = self.addGen( Via('v1', 'via1', h_clg=self.m2.clg, v_clg=self.m1.clg)) self.v2 = self.addGen( Via('v2', 'via2', h_clg=self.m2.clg, v_clg=self.m3.clg))