mirror of
https://github.com/VLSIDA/OpenRAM.git
synced 2026-09-07 03:20:39 +02:00
Merge branch 'dev' into multibank
This commit is contained in:
@@ -78,7 +78,7 @@ class design(hierarchy_design):
|
||||
for pin_name in self.pins:
|
||||
pins = self.get_pins(pin_name)
|
||||
for pin in pins:
|
||||
print(pin_name, pin)
|
||||
debug.info(0, "{0} {1}".format(pin_name, pin))
|
||||
|
||||
def setup_multiport_constants(self):
|
||||
"""
|
||||
|
||||
@@ -359,7 +359,7 @@ class instance(geometry):
|
||||
for offset in range(len(normalized_br_offsets)):
|
||||
for port in range(len(br_names)):
|
||||
cell_br_meta.append([br_names[offset], row, col, port])
|
||||
|
||||
|
||||
if normalized_storage_nets == []:
|
||||
debug.error("normalized storage nets should not be empty! Check if the GDS labels Q and Q_bar are correctly set on M1 of the cell",1)
|
||||
Q_x = normalized_storage_nets[0][0]
|
||||
|
||||
@@ -141,30 +141,28 @@ class layout():
|
||||
layout.active_space)
|
||||
|
||||
# These are for debugging previous manual rules
|
||||
if False:
|
||||
print("poly_width", layout.poly_width)
|
||||
print("poly_space", layout.poly_space)
|
||||
print("m1_width", layout.m1_width)
|
||||
print("m1_space", layout.m1_space)
|
||||
print("m2_width", layout.m2_width)
|
||||
print("m2_space", layout.m2_space)
|
||||
print("m3_width", layout.m3_width)
|
||||
print("m3_space", layout.m3_space)
|
||||
print("m4_width", layout.m4_width)
|
||||
print("m4_space", layout.m4_space)
|
||||
print("active_width", layout.active_width)
|
||||
print("active_space", layout.active_space)
|
||||
print("contact_width", layout.contact_width)
|
||||
print("poly_to_active", layout.poly_to_active)
|
||||
print("poly_extend_active", layout.poly_extend_active)
|
||||
print("poly_to_contact", layout.poly_to_contact)
|
||||
print("active_contact_to_gate", layout.active_contact_to_gate)
|
||||
print("poly_contact_to_gate", layout.poly_contact_to_gate)
|
||||
print("well_enclose_active", layout.well_enclose_active)
|
||||
print("implant_enclose_active", layout.implant_enclose_active)
|
||||
print("implant_space", layout.implant_space)
|
||||
import sys
|
||||
sys.exit(1)
|
||||
level=99
|
||||
debug.info(level, "poly_width".format(layout.poly_width))
|
||||
debug.info(level, "poly_space".format(layout.poly_space))
|
||||
debug.info(level, "m1_width".format(layout.m1_width))
|
||||
debug.info(level, "m1_space".format(layout.m1_space))
|
||||
debug.info(level, "m2_width".format(layout.m2_width))
|
||||
debug.info(level, "m2_space".format(layout.m2_space))
|
||||
debug.info(level, "m3_width".format(layout.m3_width))
|
||||
debug.info(level, "m3_space".format(layout.m3_space))
|
||||
debug.info(level, "m4_width".format(layout.m4_width))
|
||||
debug.info(level, "m4_space".format(layout.m4_space))
|
||||
debug.info(level, "active_width".format(layout.active_width))
|
||||
debug.info(level, "active_space".format(layout.active_space))
|
||||
debug.info(level, "contact_width".format(layout.contact_width))
|
||||
debug.info(level, "poly_to_active".format(layout.poly_to_active))
|
||||
debug.info(level, "poly_extend_active".format(layout.poly_extend_active))
|
||||
debug.info(level, "poly_to_contact".format(layout.poly_to_contact))
|
||||
debug.info(level, "active_contact_to_gate".format(layout.active_contact_to_gate))
|
||||
debug.info(level, "poly_contact_to_gate".format(layout.poly_contact_to_gate))
|
||||
debug.info(level, "well_enclose_active".format(layout.well_enclose_active))
|
||||
debug.info(level, "implant_enclose_active".format(layout.implant_enclose_active))
|
||||
debug.info(level, "implant_space".format(layout.implant_space))
|
||||
|
||||
@classmethod
|
||||
def setup_layer_constants(layout):
|
||||
@@ -202,21 +200,19 @@ class layout():
|
||||
"{}_nonpref_pitch".format(layer_id),
|
||||
layout.compute_pitch(layer_id, False))
|
||||
|
||||
if False:
|
||||
for name in tech_layer_indices:
|
||||
if name == "active":
|
||||
continue
|
||||
try:
|
||||
print("{0} width {1} space {2}".format(name,
|
||||
getattr(layout, "{}_width".format(name)),
|
||||
getattr(layout, "{}_space".format(name))))
|
||||
level=99
|
||||
for name in tech_layer_indices:
|
||||
if name == "active":
|
||||
continue
|
||||
try:
|
||||
debug.info(level, "{0} width {1} space {2}".format(name,
|
||||
getattr(layout, "{}_width".format(name)),
|
||||
getattr(layout, "{}_space".format(name))))
|
||||
|
||||
print("pitch {0} nonpref {1}".format(getattr(layout, "{}_pitch".format(name)),
|
||||
getattr(layout, "{}_nonpref_pitch".format(name))))
|
||||
except AttributeError:
|
||||
pass
|
||||
import sys
|
||||
sys.exit(1)
|
||||
debug.info(level, "pitch {0} nonpref {1}".format(getattr(layout, "{}_pitch".format(name)),
|
||||
getattr(layout, "{}_nonpref_pitch".format(name))))
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def compute_pitch(layer, preferred=True):
|
||||
@@ -1317,7 +1313,7 @@ class layout():
|
||||
return None
|
||||
|
||||
intermediate_layers = self.get_metal_layers(from_layer, to_layer)
|
||||
|
||||
|
||||
via = None
|
||||
cur_layer = from_layer
|
||||
while cur_layer != to_layer:
|
||||
|
||||
@@ -75,7 +75,7 @@ class lef:
|
||||
# return
|
||||
|
||||
# To maintain the indent level easily
|
||||
self.indent = ""
|
||||
self.indent = ""
|
||||
|
||||
if OPTS.detailed_lef:
|
||||
debug.info(3, "Writing detailed LEF to {0}".format(lef_name))
|
||||
@@ -88,7 +88,7 @@ class lef:
|
||||
|
||||
for pin_name in self.pins:
|
||||
self.lef_write_pin(pin_name)
|
||||
|
||||
|
||||
self.lef_write_obstructions(OPTS.detailed_lef)
|
||||
self.lef_write_footer()
|
||||
self.lef.close()
|
||||
@@ -220,4 +220,3 @@ class lef:
|
||||
round(item[1],
|
||||
self.round_grid)))
|
||||
self.lef.write(" ;\n")
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class pin_layout:
|
||||
if self.same_lpp(layer_name_pp, lpp):
|
||||
self._layer = layer_name
|
||||
break
|
||||
|
||||
|
||||
else:
|
||||
try:
|
||||
from tech import layer_override
|
||||
@@ -57,7 +57,7 @@ class pin_layout:
|
||||
return
|
||||
except:
|
||||
debug.error("Layer {} is not a valid routing layer in the tech file.".format(layer_name_pp), -1)
|
||||
|
||||
|
||||
self.lpp = layer[self.layer]
|
||||
self._recompute_hash()
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ class timing_graph():
|
||||
# If at the last output, include the final output load
|
||||
if i == len(path) - 2:
|
||||
cout += load
|
||||
|
||||
|
||||
if params["model_name"] == "cacti":
|
||||
delays.append(path_edge_mod.cacti_delay(corner, cur_slew, cout, params))
|
||||
cur_slew = delays[-1].slew
|
||||
@@ -130,14 +130,14 @@ class timing_graph():
|
||||
return_value=1)
|
||||
|
||||
return delays
|
||||
|
||||
|
||||
def get_edge_mods(self, path):
|
||||
"""Return all edge mods associated with path"""
|
||||
|
||||
|
||||
if len(path) == 0:
|
||||
return []
|
||||
|
||||
return [self.edge_mods[(path[i], path[i+1])] for i in range(len(path)-1)]
|
||||
|
||||
return [self.edge_mods[(path[i], path[i+1])] for i in range(len(path)-1)]
|
||||
|
||||
def __str__(self):
|
||||
""" override print function output """
|
||||
@@ -153,4 +153,3 @@ class timing_graph():
|
||||
""" override print function output """
|
||||
|
||||
return str(self)
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ def get_gds_pins(pin_names, name, gds_filename, units):
|
||||
if layer_override[pin_name]:
|
||||
lpp = layer_override[pin_name.textString]
|
||||
except:
|
||||
pass
|
||||
pass
|
||||
lpp = (lpp[0], None)
|
||||
cell[str(pin_name)].append(pin_layout(pin_name, rect, lpp))
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ class wire(wire_path):
|
||||
This is contact direction independent pitch,
|
||||
i.e. we take the maximum contact dimension
|
||||
"""
|
||||
|
||||
|
||||
# This is here for the unit tests which may not have
|
||||
# initialized the static parts of the layout class yet.
|
||||
from base import layout
|
||||
|
||||
Reference in New Issue
Block a user