mirror of https://github.com/VLSIDA/OpenRAM.git
Respect the bus spacing parameter in predecoder.
This commit is contained in:
parent
5b556e6ef5
commit
439003e203
|
|
@ -85,7 +85,6 @@ class hierarchical_predecode(design.design):
|
||||||
|
|
||||||
self.bus_layer = layer_props.hierarchical_predecode.bus_layer
|
self.bus_layer = layer_props.hierarchical_predecode.bus_layer
|
||||||
self.bus_directions = layer_props.hierarchical_predecode.bus_directions
|
self.bus_directions = layer_props.hierarchical_predecode.bus_directions
|
||||||
|
|
||||||
if self.column_decoder:
|
if self.column_decoder:
|
||||||
# Column decoders may be routed on M2/M3 if there's a write mask
|
# Column decoders may be routed on M2/M3 if there's a write mask
|
||||||
self.bus_pitch = self.m3_pitch
|
self.bus_pitch = self.m3_pitch
|
||||||
|
|
@ -119,7 +118,8 @@ class hierarchical_predecode(design.design):
|
||||||
self.input_rails = self.create_vertical_bus(layer=self.bus_layer,
|
self.input_rails = self.create_vertical_bus(layer=self.bus_layer,
|
||||||
offset=offset,
|
offset=offset,
|
||||||
names=input_names,
|
names=input_names,
|
||||||
length=self.height - 2 * self.bus_pitch)
|
length=self.height - 2 * self.bus_pitch,
|
||||||
|
pitch=self.bus_pitch)
|
||||||
|
|
||||||
invert_names = ["Abar_{}".format(x) for x in range(self.number_of_inputs)]
|
invert_names = ["Abar_{}".format(x) for x in range(self.number_of_inputs)]
|
||||||
non_invert_names = ["A_{}".format(x) for x in range(self.number_of_inputs)]
|
non_invert_names = ["A_{}".format(x) for x in range(self.number_of_inputs)]
|
||||||
|
|
@ -128,7 +128,8 @@ class hierarchical_predecode(design.design):
|
||||||
self.decode_rails = self.create_vertical_bus(layer=self.bus_layer,
|
self.decode_rails = self.create_vertical_bus(layer=self.bus_layer,
|
||||||
offset=offset,
|
offset=offset,
|
||||||
names=decode_names,
|
names=decode_names,
|
||||||
length=self.height - 2 * self.bus_pitch)
|
length=self.height - 2 * self.bus_pitch,
|
||||||
|
pitch=self.bus_pitch)
|
||||||
|
|
||||||
def create_input_inverters(self):
|
def create_input_inverters(self):
|
||||||
""" Create the input inverters to invert input signals for the decode stage. """
|
""" Create the input inverters to invert input signals for the decode stage. """
|
||||||
|
|
@ -180,10 +181,12 @@ class hierarchical_predecode(design.design):
|
||||||
mirror=mirror)
|
mirror=mirror)
|
||||||
|
|
||||||
def route(self):
|
def route(self):
|
||||||
|
|
||||||
self.route_input_inverters()
|
self.route_input_inverters()
|
||||||
|
self.route_output_inverters()
|
||||||
self.route_inputs_to_rails()
|
self.route_inputs_to_rails()
|
||||||
self.route_and_to_rails()
|
self.route_input_ands()
|
||||||
self.route_output_and()
|
self.route_output_ands()
|
||||||
self.route_vdd_gnd()
|
self.route_vdd_gnd()
|
||||||
|
|
||||||
def route_inputs_to_rails(self):
|
def route_inputs_to_rails(self):
|
||||||
|
|
@ -215,7 +218,7 @@ class hierarchical_predecode(design.design):
|
||||||
to_layer=self.bus_layer,
|
to_layer=self.bus_layer,
|
||||||
offset=[self.decode_rails[a_pin].cx(), y_offset])
|
offset=[self.decode_rails[a_pin].cx(), y_offset])
|
||||||
|
|
||||||
def route_output_and(self):
|
def route_output_ands(self):
|
||||||
"""
|
"""
|
||||||
Route all conections of the outputs and gates
|
Route all conections of the outputs and gates
|
||||||
"""
|
"""
|
||||||
|
|
@ -230,12 +233,40 @@ class hierarchical_predecode(design.design):
|
||||||
|
|
||||||
def route_input_inverters(self):
|
def route_input_inverters(self):
|
||||||
"""
|
"""
|
||||||
Route all conections of the inputs inverters [Inputs, outputs, vdd, gnd]
|
Route all conections of the inverter inputs
|
||||||
|
"""
|
||||||
|
for inv_num in range(self.number_of_inputs):
|
||||||
|
in_pin = "in_{}".format(inv_num)
|
||||||
|
|
||||||
|
# route input
|
||||||
|
pin = self.inv_inst[inv_num].get_pin("A")
|
||||||
|
inv_in_pos = pin.center()
|
||||||
|
in_pos = vector(self.input_rails[in_pin].cx(), inv_in_pos.y)
|
||||||
|
self.add_path(self.input_layer, [in_pos, inv_in_pos])
|
||||||
|
|
||||||
|
# Inverter input pin
|
||||||
|
self.add_via_stack_center(from_layer=pin.layer,
|
||||||
|
to_layer=self.input_layer,
|
||||||
|
offset=inv_in_pos)
|
||||||
|
# Input rail pin position
|
||||||
|
via=self.add_via_stack_center(from_layer=self.input_layer,
|
||||||
|
to_layer=self.bus_layer,
|
||||||
|
offset=in_pos,
|
||||||
|
directions=self.bus_directions)
|
||||||
|
|
||||||
|
# Create the input pin at this location on the rail
|
||||||
|
self.add_layout_pin_rect_center(text=in_pin,
|
||||||
|
layer=self.bus_layer,
|
||||||
|
offset=in_pos,
|
||||||
|
height=via.mod.second_layer_height,
|
||||||
|
width=via.mod.second_layer_width)
|
||||||
|
|
||||||
|
def route_output_inverters(self):
|
||||||
|
"""
|
||||||
|
Route all conections of the inverter outputs
|
||||||
"""
|
"""
|
||||||
for inv_num in range(self.number_of_inputs):
|
for inv_num in range(self.number_of_inputs):
|
||||||
out_pin = "Abar_{}".format(inv_num)
|
out_pin = "Abar_{}".format(inv_num)
|
||||||
in_pin = "in_{}".format(inv_num)
|
|
||||||
|
|
||||||
inv_out_pin = self.inv_inst[inv_num].get_pin("Z")
|
inv_out_pin = self.inv_inst[inv_num].get_pin("Z")
|
||||||
|
|
||||||
# add output so that it is just below the vdd or gnd rail
|
# add output so that it is just below the vdd or gnd rail
|
||||||
|
|
@ -255,31 +286,11 @@ class hierarchical_predecode(design.design):
|
||||||
offset=rail_pos,
|
offset=rail_pos,
|
||||||
directions=self.bus_directions)
|
directions=self.bus_directions)
|
||||||
|
|
||||||
# route input
|
def route_input_ands(self):
|
||||||
pin = self.inv_inst[inv_num].get_pin("A")
|
"""
|
||||||
inv_in_pos = pin.center()
|
Route the different permutations of the NAND/AND decocer cells.
|
||||||
in_pos = vector(self.input_rails[in_pin].cx(), inv_in_pos.y)
|
"""
|
||||||
self.add_path(self.input_layer, [in_pos, inv_in_pos])
|
|
||||||
self.add_via_stack_center(from_layer=pin.layer,
|
|
||||||
to_layer=self.input_layer,
|
|
||||||
offset=inv_in_pos)
|
|
||||||
via=self.add_via_stack_center(from_layer=self.input_layer,
|
|
||||||
to_layer=self.bus_layer,
|
|
||||||
offset=in_pos)
|
|
||||||
# Create the input pin at this location on the rail
|
|
||||||
self.add_layout_pin_rect_center(text=in_pin,
|
|
||||||
layer=self.bus_layer,
|
|
||||||
offset=in_pos,
|
|
||||||
height=via.mod.second_layer_height,
|
|
||||||
width=via.mod.second_layer_width)
|
|
||||||
|
|
||||||
# This is a hack to fix via-to-via spacing issues, but it is currently
|
|
||||||
# causing its own DRC problems.
|
|
||||||
# if layer_props.hierarchical_predecode.vertical_supply:
|
|
||||||
# below_rail = vector(self.decode_rails[out_pin].cx(), y_offset - (self.cell_height / 2))
|
|
||||||
# self.add_path(self.bus_layer, [rail_pos, below_rail], width=self.li_width + self.m1_enclose_mcon * 2)
|
|
||||||
|
|
||||||
def route_and_to_rails(self):
|
|
||||||
# This 2D array defines the connection mapping
|
# This 2D array defines the connection mapping
|
||||||
and_input_line_combination = self.get_and_input_line_combination()
|
and_input_line_combination = self.get_and_input_line_combination()
|
||||||
for k in range(self.number_of_outputs):
|
for k in range(self.number_of_outputs):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue