diff --git a/compiler/modules/bitcell_array.py b/compiler/modules/bitcell_array.py index 83a0e236..e6494bb5 100644 --- a/compiler/modules/bitcell_array.py +++ b/compiler/modules/bitcell_array.py @@ -1,201 +1,202 @@ -import debug -import design -from tech import drc, spice -from vector import vector -from globals import OPTS - - - -class bitcell_array(design.design): - """ - Creates a rows x cols array of memory cells. Assumes bit-lines - and word line is connected by abutment. - Connects the word lines and bit lines. - """ - - def __init__(self, cols, rows, name="bitcell_array"): - design.design.__init__(self, name) - debug.info(1, "Creating {0} {1} x {2}".format(self.name, rows, cols)) - - - self.column_size = cols - self.row_size = rows - - c = reload(__import__(OPTS.bitcell)) - self.mod_bitcell = getattr(c, OPTS.bitcell) - self.cell = self.mod_bitcell() - self.add_mod(self.cell) - - # We increase it by a well enclosure so the precharges don't overlap our wells - self.height = self.row_size*self.cell.height + drc["well_enclosure_active"] - self.width = self.column_size*self.cell.width - - self.add_pins() - self.create_layout() - self.add_layout_pins() - - self.DRC_LVS() - - - def add_pins(self): - row_list = self.cell.list_row_pins() - column_list = self.cell.list_column_pins() - for col in range(self.column_size): - for cell_column in column_list: - self.add_pin(cell_column+"[{0}]".format(col)) - for row in range(self.row_size): - for cell_row in row_list: - self.add_pin(cell_row+"[{0}]".format(row)) - self.add_pin("vdd") - self.add_pin("gnd") - - - def create_layout(self): - xoffset = 0.0 - self.cell_inst = {} - for col in range(self.column_size): - yoffset = 0.0 - for row in range(self.row_size): - name = "bit_r{0}_c{1}".format(row, col) - - if row % 2: - tempy = yoffset + self.cell.height - dir_key = "MX" - else: - tempy = yoffset - dir_key = "" - - self.cell_inst[row,col]=self.add_inst(name=name, - mod=self.cell, - offset=[xoffset, tempy], - mirror=dir_key) - self.connect_inst(self.cell.list_bitcell_pins(col, row)) - - yoffset += self.cell.height - xoffset += self.cell.width - - - def add_layout_pins(self): - - # Our cells have multiple gnd pins for now. - # FIXME: fix for multiple vdd too - vdd_pin = self.cell.get_pin("vdd") - - # shift it up by the overlap amount (gnd_pin) too - # must find the lower gnd pin to determine this overlap - lower_y = self.cell.height - gnd_pins = self.cell.get_pins("gnd") - for gnd_pin in gnd_pins: - if gnd_pin.layer=="metal2" and gnd_pin.by()