first commit

This commit is contained in:
FriedrichWu 2024-06-26 17:40:22 +02:00
parent 3ee769a771
commit f69f8de000
3 changed files with 133 additions and 112 deletions

View File

@ -105,6 +105,7 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.row_addr_size): for bit in range(self.row_addr_size):
#input #input
self.add_pin("addr{}[{}]".format(port, bit + self.col_addr_size), "INPUT") self.add_pin("addr{}[{}]".format(port, bit + self.col_addr_size), "INPUT")
print("addr{}[{}]".format(port, bit), "INPUT")
#output #output
self.add_pin("a{}_{}".format(port, bit + self.col_addr_size), "OUTPUT") self.add_pin("a{}_{}".format(port, bit + self.col_addr_size), "OUTPUT")
#clk_buf, regard as input #clk_buf, regard as input
@ -492,7 +493,7 @@ class sram_1bank(design, verilog, lef):
# Must create the control logic before pins to get the pins # Must create the control logic before pins to get the pins
self.add_modules() self.add_modules()
self.add_pin_data_dff() self.add_pin_data_dff()
self.bank_inst = self.create_col_addr_dff() # be aware, multi-insts possible self.data_dff_insts = self.create_data_dff() # be aware, multi-insts possible
# This is for the lib file if we don't create layout # This is for the lib file if we don't create layout
self.width=0 self.width=0
@ -510,7 +511,7 @@ class sram_1bank(design, verilog, lef):
self.add_modules() self.add_modules()
if self.write_size != self.word_size: if self.write_size != self.word_size:
self.add_pin_wmask_dff() self.add_pin_wmask_dff()
self.bank_inst = self.create_wmask_dff() # be aware, multi-insts possible, or none self.wmask_dff_insts = self.create_wmask_dff() # be aware, multi-insts possible, or none
# This is for the lib file if we don't create layout # This is for the lib file if we don't create layout
self.width=0 self.width=0
@ -612,8 +613,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.control_pos[port] = vector(0,0) self.control_logic_insts[port].place(vector(0,0))
self.control_logic_insts[port].place(self.control_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("Control Placement", datetime.datetime.now(), start_time) print_time("Control Placement", datetime.datetime.now(), start_time)
@ -648,8 +648,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.row_addr_pos[port] = vector(0,0) self.row_addr_dff_insts[port].place(vector(0,0))
self.row_addr_dff_insts[port].place(self.row_addr_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("row_addr_dff Placement", datetime.datetime.now(), start_time) print_time("row_addr_dff Placement", datetime.datetime.now(), start_time)
@ -684,8 +683,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.col_addr_pos[port] = vector(0,0) self.col_addr_dff_insts[port].place(vector(0,0))
self.col_addr_dff_insts[port].place(self.col_addr_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("col_addr_dff Placement", datetime.datetime.now(), start_time) print_time("col_addr_dff Placement", datetime.datetime.now(), start_time)
@ -720,8 +718,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.data_pos[port] = vector(0,0) self.data_dff_insts[port].place(vector(0,0))
self.data_dff_insts[port].place(self.data_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("data_dff Placement", datetime.datetime.now(), start_time) print_time("data_dff Placement", datetime.datetime.now(), start_time)
@ -756,8 +753,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.wmask_pos[port] = vector(0,0) self.wmask_dff_insts[port].place(vector(0,0))
self.wmask_dff_insts[port].place(self.wmask_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("wmask_dff Placement", datetime.datetime.now(), start_time) print_time("wmask_dff Placement", datetime.datetime.now(), start_time)
@ -792,8 +788,7 @@ class sram_1bank(design, verilog, lef):
# Placement # Placement
# We will generate different layout for different port(if there are multi-port) # We will generate different layout for different port(if there are multi-port)
port = instance_index port = instance_index
self.spare_wen_pos[port] = vector(0,0) self.spare_wen_dff_insts[port].place(vector(0,0))
self.spare_wen_dff_insts[port].place(self.spare_wen_pos[port])
if not OPTS.is_unit_test: if not OPTS.is_unit_test:
print_time("spare_wen_dff Placement", datetime.datetime.now(), start_time) print_time("spare_wen_dff Placement", datetime.datetime.now(), start_time)
@ -1005,7 +1000,7 @@ class sram_1bank(design, verilog, lef):
if OPTS.route_supplies: if OPTS.route_supplies:
self.route_supplies(init_bbox) self.route_supplies(init_bbox)
def add_layout_spare_wen_dff_only_pins(self, instance_index=0): def add_pins_to_route_spare_wen_dff(self, instance_index=0):
#only contains signal pins, no power pins #only contains signal pins, no power pins
""" Adding to route pins for spare wen dff """ """ Adding to route pins for spare wen dff """
pins_to_route = [] pins_to_route = []
@ -1021,7 +1016,7 @@ class sram_1bank(design, verilog, lef):
return pins_to_route return pins_to_route
def add_pins_to_route_spare_wen_dff(self, add_vias=True, instance_index=0): def add_layout_spare_wen_dff_only_pins(self, add_vias=True, instance_index=0):
""" """
Add the top-level pins for a single bank SRAM with control. Add the top-level pins for a single bank SRAM with control.
""" """
@ -1039,17 +1034,17 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.num_spare_cols): for bit in range(self.num_spare_cols):
# input # input
self.add_io_pin(self.spare_wen_dff_insts[port], self.add_io_pin(self.spare_wen_dff_insts[port],
"spare_wen{}[{}]".format(port, bit), # old name "din_{}".format(bit), # old name
"spare_wen{}[{}]".format(port, bit), # new name "spare_wen{}[{}]".format(port, bit), # new name
start_layer=pin_layer) start_layer=pin_layer)
# output # output
self.add_io_pin(self.spare_wen_dff_insts[port], self.add_io_pin(self.spare_wen_dff_insts[port],
"bank_spare_wen{}_{}".format(port, bit), "dout_{}".format(port, bit),
"bank_spare_wen{}_{}".format(port, bit), "bank_spare_wen{}_{}".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
#clk_buf, regard as input #clk_buf, regard as input
self.add_io_pin(self.spare_wen_dff_insts[port], self.add_io_pin(self.spare_wen_dff_insts[port],
"clk_buf{}".format(port), "clk",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
@ -1086,17 +1081,17 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.num_wmasks): for bit in range(self.num_wmasks):
# input # input
self.add_io_pin(self.wmask_dff_insts[port], self.add_io_pin(self.wmask_dff_insts[port],
"wmask{}[{}]".format(port, bit), "din_{}".format(bit),
"wmask{}[{}]".format(port, bit), "wmask{}[{}]".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
# output # output
self.add_io_pin(self.wmask_dff_insts[port], self.add_io_pin(self.wmask_dff_insts[port],
"bank_wmask{}_{}".format(port, bit), "dout_{}".format(bit),
"bank_wmask{}_{}".format(port, bit), "bank_wmask{}_{}".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
#clk_buf, regard as input #clk_buf, regard as input
self.add_io_pin(self.wmask_dff_insts[port], self.add_io_pin(self.wmask_dff_insts[port],
"clk_buf{}".format(port), "clk",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
@ -1133,17 +1128,17 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.word_size + self.num_spare_cols): for bit in range(self.word_size + self.num_spare_cols):
# input # input
self.add_io_pin(self.data_dff_insts[port], self.add_io_pin(self.data_dff_insts[port],
"din{}[{}]".format(port, bit), "din_{}".format(bit),
"din{}[{}]".format(port, bit), "din{}[{}]".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
# output # output
self.add_io_pin(self.data_dff_insts[port], self.add_io_pin(self.data_dff_insts[port],
"bank_din{}_{}".format(port, bit), "dout_{}".format(bit),
"bank_din{}_{}".format(port, bit), "bank_din{}_{}".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
#clk_buf, regard as input #clk_buf, regard as input
self.add_io_pin(self.data_dff_insts[port], self.add_io_pin(self.data_dff_insts[port],
"clk_buf{}".format(port), "clk",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
@ -1180,17 +1175,17 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.col_addr_size): for bit in range(self.col_addr_size):
#input #input
self.add_io_pin(self.col_addr_dff_insts[port], self.add_io_pin(self.col_addr_dff_insts[port],
"addr{}[{}]".format(port, bit), # old name "din_{}".format(bit), # old name
"addr{}[{}]".format(port, bit), # new name "addr{}[{}]".format(port, bit), # new name
start_layer=pin_layer) start_layer=pin_layer)
#output #output
self.add_io_pin(self.col_addr_dff_insts[port], self.add_io_pin(self.col_addr_dff_insts[port],
"a{}_{}".format(port, bit), "dout_{}".format(bit),
"a{}_{}".format(port, bit), "a{}_{}".format(port, bit),
start_layer=pin_layer) start_layer=pin_layer)
#clk_buf, regard as input #clk_buf, regard as input
self.add_pin(self.col_addr_dff_insts[port], self.add_pin(self.col_addr_dff_insts[port],
"clk_buf{}".format(port), "clk",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
@ -1226,18 +1221,21 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.row_addr_size): for bit in range(self.row_addr_size):
#input #input
#debug
print("this is port number:{0}".format(port))
print("insts:{0}".format(self.row_addr_dff_insts[port]))
self.add_io_pin(self.row_addr_dff_insts[port], self.add_io_pin(self.row_addr_dff_insts[port],
"addr{}[{}]".format(port, bit + self.col_addr_size), # old name "din_{}".format(bit + self.col_addr_size), # old name
"addr{}[{}]".format(port, bit + self.col_addr_size), # new name "addr{}[{}]".format(port, bit + self.col_addr_size), # new name
start_layer=pin_layer) start_layer=pin_layer)
#output #output
self.add_io_pin(self.row_addr_dff_insts[port], self.add_io_pin(self.row_addr_dff_insts[port],
"a{}_{}".format(port, bit + self.col_addr_size), "dout_{}".format(bit + self.col_addr_size),
"a{}_{}".format(port, bit + self.col_addr_size), "a{}_{}".format(port, bit + self.col_addr_size),
start_layer=pin_layer) start_layer=pin_layer)
#clk_buf, regard as input #clk_buf, regard as input
self.add_io_pin(self.row_addr_dff_insts[port], self.add_io_pin(self.row_addr_dff_insts[port],
"clk_buf{}".format(port), "clk",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
@ -1280,45 +1278,45 @@ class sram_1bank(design, verilog, lef):
pin_layer = self.pwr_grid_layers[0] pin_layer = self.pwr_grid_layers[0]
# Inputs # Inputs
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"csb{}".format(port), #old name "csb", #old name
"csb{}".format(port), #new name "csb{}".format(port), #new name
start_layer=pin_layer) start_layer=pin_layer)
if port in self.readwrite_ports: if port in self.readwrite_ports:
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"web{}".format(port), "web",
"web{}".format(port), "web{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"clk{}".format(port), "clk",
"clk{}".format(port), "clk{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
if self.has_rbl: if self.has_rbl:
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"rbl_bl{}".format(port), "rbl_bl",
"rbl_bl{}".format(port), "rbl_bl{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
# Outputs # Outputs
if port in self.read_ports: if port in self.read_ports:
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"s_en{}".format(port), "s_en",
"s_en{}".format(port), "s_en{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
if port in self.write_ports: if port in self.write_ports:
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"w_en{}".format(port), "w_en",
"w_en{}".format(port), "w_en{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"p_en_bar{}".format(port), "p_en_bar",
"p_en_bar{}".format(port), "p_en_bar{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"wl_en{}".format(port), "wl_en",
"wl_en{}".format(port), "wl_en{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)
self.add_io_pin(self.control_insts[port], self.add_io_pin(self.control_logic_insts[port],
"clk_buf{}".format(port), "clk_buf",
"clk_buf{}".format(port), "clk_buf{}".format(port),
start_layer=pin_layer) start_layer=pin_layer)

View File

@ -184,70 +184,69 @@ class sram():
print_time("Extended Config", datetime.datetime.now(), start_time) print_time("Extended Config", datetime.datetime.now(), start_time)
def save(self): def save(self, mod=0):
""" Save all the output files while reporting time to do it as well. """ """ Save all the output files while reporting time to do it as well. """
for i in range(7): if mod == 0:
if i == 0: self.s.create_netlist_bank()
self.s.create_netlist_bank() if not OPTS.netlist_only:
if not OPTS.netlist_only: self.s.create_layout_bank_only()
self.s.create_layout_bank_only() self.generate_files("_bank")
self.generate_files("bank") elif mod == 1:
elif i == 1: self.s.create_netlist_control()
self.s.create_netlist_control() if not OPTS.netlist_only:
if not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.s.create_layout_control_only(instance_index=port)
self.s.create_layout_control_only(self, instance_index=port) self.generate_files("_control_" + str(port))
self.generate_files("control_" + port) else:
else: for port in self.s.all_ports:
for port in self.s.all_ports: self.generate_files("_control_" + str(port))
self.generate_files("control_" + port) elif mod == 2:
elif i == 2: self.s.create_netlist_row_addr_dff()
self.s.create_netlist_row_addr_dff() if not OPTS.netlist_only:
if not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.s.create_layout_row_addr_dff_only(instance_index=port)
self.s.create_layout_row_addr_dff_only(self, instance_index=port) self.generate_files("_row_addr_dff_" + str(port))
self.generate_files("row_addr_dff_" + port) else:
else: for port in self.s.all_ports:
for port in self.s.all_ports: self.generate_files("_row_addr_dff_" + str(port))
self.generate_files("row_addr_dff_" + port) elif mod == 3:
elif i == 3: if self.s.create_netlist_col_addr_dff() == False:
if self.s.create_netlist_col_addr_dff() == False: pass#continue # do not need col addr dff
continue # do not need col addr dff elif not OPTS.netlist_only:
elif not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.create_layout_col_addr_dff_only(instance_index=port)
self.create_layout_col_addr_dff_only(self, instance_index=port) self.generate_files("_col_addr_dff_" + str(port))
self.generate_files("col_addr_dff_" + port) else:
else: self.generate_files("_col_addr_dff_" + str(port))
self.generate_files("col_addr_dff_" + port) elif mod == 4:
elif i == 4: self.s.create_netlist_data_dff()
self.s.create_netlist_data_dff() if not OPTS.netlist_only:
if not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.s.create_layout_data_dff_only(instance_index=port)
self.s.create_layout_data_dff_only(self, instance_index=port) self.generate_files("_data_dff_" + str(port))
self.generate_files("data_dff_" + port) else:
else: for port in self.s.all_ports:
for port in self.s.all_ports: self.generate_files("_data_dff_" + str(port))
self.generate_files("data_dff_" + port) elif mod == 5:
elif i == 5: if self.s.create_netlist_wmask_dff() == False:
if self.s.create_netlist_wmask_dff() == False: pass#continue # do not need wmask dff
continue # do not need wmask dff elif not OPTS.netlist_only:
elif not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.s.create_layout_wmask_dff_only(instance_index=port)
self.s.create_layout_wmask_dff_only(self, instance_index=port) self.generate_files("_wmask_dff_" + str(port))
self.generate_files("wmask_dff_" + port) else:
else: for port in self.s.all_ports:
for port in self.s.all_ports: self.generate_files("_wmask_dff_" + str(port))
self.generate_files("wmask_dff_" + port) elif mod == 6:
elif i == 6: if self.s.create_netlist_spare_wen_dff() == False:
if self.s.create_netlist_spare_wen_dff() == False: pass#continue # do not need spare wen dff
continue # do not need spare wen dff elif not OPTS.netlist_only:
elif not OPTS.netlist_only: for port in self.s.all_ports:
for port in self.s.all_ports: self.s.create_layout_spare_wen_dff_only(instance_index=port)
self.s.create_layout_spare_wen_dff_only(self, instance_index=port) self.generate_files("_spare_wen_dff_" + str(port))
self.generate_files("spare_wen_dff_" + port) else:
else: for port in self.s.all_ports:
for port in self.s.all_ports: self.generate_files("_spare_wen_dff_" + str(port))
self.generate_files("spare_wen_dff_" + port)

View File

@ -76,6 +76,30 @@ s = sram_road.sram()
# Output the files for the resulting SRAM # Output the files for the resulting SRAM
s.save() s.save()
del s
s = sram_road.sram()
s.save(mod=1)
del s
s = sram_road.sram()
s.save(mod=2)
del s
s = sram_road.sram()
s.save(mod=3)
del s
s = sram_road.sram()
s.save(mod=4)
del s
s = sram_road.sram()
s.save(mod=5)
del s
s = sram_road.sram()
s.save(mod=6)
# Delete temp files etc. # Delete temp files etc.
openram.end_openram() openram.end_openram()
openram.print_time("End", datetime.datetime.now(), start_time) openram.print_time("End", datetime.datetime.now(), start_time)