Skip to content

Commit 3bcda77

Browse files
authored
Merge pull request #8787 from braydenlouie/routing
ram: updated ram.tcl and example test file
2 parents 5c19450 + 4f5d46d commit 3bcda77

File tree

2 files changed

+145
-30
lines changed

2 files changed

+145
-30
lines changed

src/ram/src/ram.tcl

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,139 @@ proc generate_ram_netlist { args } {
4848
ram::generate_ram_netlist_cmd $bytes_per_word $word_count $storage_cell \
4949
$tristate_cell $inv_cell $read_ports
5050
}
51+
52+
sta::define_cmd_args "generate_ram" {-bytes_per_word bits
53+
-word_count words
54+
[-read_ports count]
55+
[-storage_cell name]
56+
[-tristate_cell name]
57+
[-inv_cell name]
58+
-power_pin name
59+
-ground_pin name
60+
-routing_layer config
61+
-ver_layer config
62+
-hor_layer config
63+
-filler_cells fillers}
64+
65+
# user arguments for generate ram arguments
66+
proc generate_ram { args } {
67+
sta::parse_key_args "generate_ram" args \
68+
keys {-bytes_per_word -word_count -storage_cell -tristate_cell -inv_cell -read_ports
69+
-power_pin -ground_pin -routing_layer -ver_layer -hor_layer -filler_cells} flags {}
70+
71+
sta::check_argc_eq0 "generate_ram" $args
72+
73+
# Check for valid design
74+
if { [ord::get_db_block] != "NULL" } {
75+
utl::error RAM 20 "A design is already loaded. Cannot generate RAM"
76+
}
77+
78+
set ram_netlist_args [list \
79+
-bytes_per_word $keys(-bytes_per_word) \
80+
-word_count $keys(-word_count)]
81+
82+
if { [info exists keys(-read_ports)] } {
83+
lappend ram_netlist_args -read_ports $keys(-read_ports)
84+
}
85+
86+
if { [info exists keys(-storage_cell)] } {
87+
lappend ram_netlist_args -storage_cell $keys(-storage_cell)
88+
}
89+
90+
if { [info exists keys(-tristate_cell)] } {
91+
lappend ram_netlist_args -tristate_cell $keys(-tristate_cell)
92+
}
93+
94+
if { [info exists keys(-inv_cell)] } {
95+
lappend ram_netlist_args -inv_cell $keys(-inv_cell)
96+
}
97+
98+
generate_ram_netlist {*}$ram_netlist_args
99+
100+
ord::design_created
101+
102+
if { [info exists keys(-power_pin)] } {
103+
set power_net $keys(-power_pin)
104+
} else {
105+
utl::error RAM 5 "The -power_pin argument must be specified."
106+
}
107+
108+
if { [info exists keys(-ground_pin)] } {
109+
set ground_net $keys(-ground_pin)
110+
} else {
111+
utl::error RAM 6 "The -ground_pin argument must be specified."
112+
}
113+
114+
if { [info exists keys(-routing_layer)] } {
115+
set routing_layer $keys(-routing_layer)
116+
} else {
117+
utl::error RAM 9 "The -routing_layer argument must be specified."
118+
}
119+
120+
if { [llength $routing_layer] != 2 } {
121+
utl::error RAM 12 "-routing_layer is not a list of 2 values"
122+
} else {
123+
lassign $routing_layer route_name route_width
124+
}
125+
126+
if { [info exists keys(-ver_layer)] } {
127+
set ver_layer $keys(-ver_layer)
128+
} else {
129+
utl::error RAM 13 "The -ver_layer argument must be specified."
130+
}
131+
132+
if { [llength $ver_layer] != 3 } {
133+
utl::error RAM 14 "-ver_layer is not a list of 2 values"
134+
} else {
135+
lassign $ver_layer ver_name ver_width ver_pitch
136+
}
137+
138+
if { [info exists keys(-hor_layer)] } {
139+
set hor_layer $keys(-hor_layer)
140+
} else {
141+
utl::error RAM 15 "The -hor_layer argument must be specified."
142+
}
143+
144+
if { [llength $hor_layer] != 3 } {
145+
utl::error RAM 17 "-hor_layer is not a list of 2 values"
146+
} else {
147+
lassign $hor_layer hor_name hor_width hor_pitch
148+
}
149+
150+
if { [info exists keys(-filler_cells)] } {
151+
set filler_cells $keys(-filler_cells)
152+
} else {
153+
utl::error RAM 18 "The -filler_cells argument must be specified."
154+
}
155+
156+
add_global_connection -net VDD -pin_pattern $power_net -power
157+
add_global_connection -net VSS -pin_pattern $ground_net -ground
158+
159+
global_connect
160+
161+
set_voltage_domain -power VDD -ground VSS
162+
define_pdn_grid -name ram_grid -voltage_domains {CORE}
163+
164+
add_pdn_stripe -grid ram_grid -layer $route_name \
165+
-width $route_width -followpins -extend_to_boundary
166+
add_pdn_stripe -grid ram_grid -layer $ver_name \
167+
-width $ver_width -pitch $ver_pitch -extend_to_boundary
168+
add_pdn_stripe -grid ram_grid -layer $hor_name \
169+
-width $hor_width -pitch $hor_pitch -extend_to_boundary
170+
171+
add_pdn_connect -layers [list $route_name $ver_name]
172+
add_pdn_connect -layers [list $ver_name $hor_name]
173+
174+
pdngen
175+
176+
make_tracks -x_offset 0 -y_offset 0
177+
set_io_pin_constraint -direction output -region top:*
178+
set_io_pin_constraint -pin_names {D[*]} -region top:*
179+
180+
place_pins -hor_layers $hor_name -ver_layers $ver_name
181+
182+
filler_placement $filler_cells
183+
184+
global_route
185+
detailed_route -verbose 0
186+
}

src/ram/test/make_8x8.tcl

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,18 @@ read_liberty sky130hd/sky130_fd_sc_hd__tt_025C_1v80.lib
77
read_lef sky130hd/sky130hd.tlef
88
read_lef sky130hd/sky130_fd_sc_hd_merged.lef
99

10-
generate_ram_netlist \
10+
generate_ram \
1111
-bytes_per_word 1 \
1212
-word_count 8 \
1313
-read_ports 2 \
14-
-storage_cell sky130_fd_sc_hd__dlxtp_1
15-
# -tristate_cell sky130_fd_sc_hd__ebufn_2
16-
# -inv_cell sky130_fd_sc_hd__inv_1
17-
18-
ord::design_created
19-
20-
add_global_connection -net VDD -pin_pattern {^VPWR$} -power
21-
add_global_connection -net VSS -pin_pattern {^VGND$} -ground
22-
global_connect
23-
set_voltage_domain -power VDD -ground VSS
24-
define_pdn_grid -name ram_grid -voltage_domains {CORE}
25-
add_pdn_stripe -grid ram_grid -layer met1 -followpins -width 0.48
26-
add_pdn_stripe -grid ram_grid -layer met2 -width 0.48 -pitch 40 -extend_to_boundary
27-
add_pdn_stripe -grid ram_grid -layer met3 -width 0.48 -pitch 20 -extend_to_boundary
28-
add_pdn_connect -layers {met1 met2}
29-
add_pdn_connect -layers {met2 met3}
30-
31-
pdngen
32-
33-
make_tracks -x_offset 0 -y_offset 0
34-
set_io_pin_constraint -direction output -region top:*
35-
set_io_pin_constraint -pin_names {D[*]} -region top:*
36-
place_pins -hor_layers met3 -ver_layers met2
37-
38-
filler_placement {sky130_fd_sc_hd__fill_1 sky130_fd_sc_hd__fill_2 \
39-
sky130_fd_sc_hd__fill_4 sky130_fd_sc_hd__fill_8}
40-
41-
global_route
42-
detailed_route -verbose 0
14+
-storage_cell sky130_fd_sc_hd__dlxtp_1 \
15+
-power_pin VPWR \
16+
-ground_pin VGND \
17+
-routing_layer {met1 0.48} \
18+
-ver_layer {met2 0.48 40} \
19+
-hor_layer {met3 0.48 20} \
20+
-filler_cells {sky130_fd_sc_hd__fill_1 sky130_fd_sc_hd__fill_2 \
21+
sky130_fd_sc_hd__fill_4 sky130_fd_sc_hd__fill_8}
4322

4423
set lef_file [make_result_file make_8x8.lef]
4524
write_abstract_lef $lef_file

0 commit comments

Comments
 (0)