Can redefine number of ports in custom_cell_properties

This commit is contained in:
mrg 2020-11-21 08:05:49 -08:00
parent aa03eec943
commit 95573c858c
2 changed files with 54 additions and 20 deletions

View File

@ -7,7 +7,10 @@
# #
class _cell: class _cell:
def __init__(self, port_order, port_types, port_map=None, hard_cell=True, boundary_layer="boundary"): def __init__(self, port_order, port_types, port_map=None, body_bias=None, hard_cell=True, boundary_layer="boundary"):
# Some cells may have body bias (well taps) exposed as ports
self._body_bias = body_bias
# Specifies if this is a hard (i.e. GDS) cell # Specifies if this is a hard (i.e. GDS) cell
self._hard_cell = hard_cell self._hard_cell = hard_cell
@ -47,14 +50,24 @@ class _cell:
return self._port_order return self._port_order
@port_order.setter @port_order.setter
def port_order(self, x): def port_order(self, port_order):
self._port_order = x # If we are going to redefine more ports (i.e. well biases) don't init stuff
old_port_len = len(self._port_order)
if old_port_len == len(port_order):
self._port_order = port_order
# Update ordered name list in the new order # Update ordered name list in the new order
self._port_names = [self._port_map[x] for x in self._port_order] self._port_names = [self._port_map[x] for x in self._port_order]
# Update ordered type list in the new order # Update ordered type list in the new order
self._port_types = [self._port_types_map[x] for x in self._port_order] self._port_types = [self._port_types_map[x] for x in self._port_order]
# Update the index array # Update the index array
self._port_indices = [self._port_order.index(x) for x in self._original_port_order] self._port_indices = [self._port_order.index(x) for x in self._original_port_order]
else:
# Do the default constructor again except for types stuff which hasn't been set yet
self._port_order = port_order
self._original_port_order = self._port_order
self._port_map = {x: x for x in self._port_order}
self._port_indices = [self._port_order.index(x) for x in self._original_port_order]
self._port_names = [self._port_map[x] for x in self._port_order]
@property @property
def port_indices(self): def port_indices(self):
@ -65,15 +78,36 @@ class _cell:
return self._port_map return self._port_map
@port_map.setter @port_map.setter
def port_map(self, x): def port_map(self, port_map):
self._port_map = x self._port_map = port_map
# Update ordered name list to use the new names # Update ordered name list to use the new names
self._port_names = [self.port_map[x] for x in self._port_order] self._port_names = [self.port_map[x] for x in self._port_order]
@property
def body_bias(self):
return self._body_bias
@body_bias.setter
def body_bias(self, body_bias):
# It is assumed it is [nwell, pwell]
self._body_bias = body_bias
self._port_map['vnb'] = body_bias[0]
self._port_types['vnb'] = "POWER"
self._port_map['vpb'] = body_bias[1]
self._port_types['vpb'] = "GROUND"
@property @property
def port_types(self): def port_types(self):
return self._port_types return self._port_types
@port_types.setter
def port_types(self, port_types):
self._port_types = port_types
# Specifies the port directions
self._port_types_map = {x: y for (x, y) in zip(self._port_order, self._port_types)}
# Update ordered type list
self._port_types = [self._port_types_map[x] for x in self._port_order]
@property @property
def boundary_layer(self): def boundary_layer(self):
return self._boundary_layer return self._boundary_layer

View File

@ -167,8 +167,8 @@ class design(hierarchy_design):
from tech import layer_indices from tech import layer_indices
import tech import tech
for layer in layer_indices: for layer_id in layer_indices:
key = "{}_stack".format(layer) key = "{}_stack".format(layer_id)
# Set the stack as a local helper # Set the stack as a local helper
try: try:
@ -177,24 +177,24 @@ class design(hierarchy_design):
except AttributeError: except AttributeError:
pass pass
# Skip computing the pitch for active # Skip computing the pitch for non-routing layers
if layer == "active": if layer_id in ["active", "nwell"]:
continue continue
# Add the pitch # Add the pitch
setattr(design, setattr(design,
"{}_pitch".format(layer), "{}_pitch".format(layer_id),
design.compute_pitch(layer, True)) design.compute_pitch(layer_id, True))
# Add the non-preferrd pitch (which has vias in the "wrong" way) # Add the non-preferrd pitch (which has vias in the "wrong" way)
setattr(design, setattr(design,
"{}_nonpref_pitch".format(layer), "{}_nonpref_pitch".format(layer_id),
design.compute_pitch(layer, False)) design.compute_pitch(layer_id, False))
if False: if False:
from tech import preferred_directions from tech import preferred_directions
print(preferred_directions) print(preferred_directions)
from tech import layer, layer_indices from tech import layer_indices
for name in layer_indices: for name in layer_indices:
if name == "active": if name == "active":
continue continue