Skip to content

Commit 29f55d9

Browse files
committed
ram: changes to ram.tcl and generate ram example
Signed-off-by: braydenl9988 <braydenl9988@gmail.com>
1 parent 0fb1f07 commit 29f55d9

2 files changed

Lines changed: 130 additions & 39 deletions

File tree

src/ram/src/ram.tcl

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

src/ram/test/make_8x8.tcl

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,21 @@
11
source "helpers.tcl"
22

3-
set_thread_count [expr [cpu_count] / 4]
3+
set_thread_count {[expr [cpu_count] / 4]}
44

55
read_liberty sky130hd/sky130_fd_sc_hd__tt_025C_1v80.lib
66

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
43-
44-
set lef_file [make_result_file make_8x8.lef]
45-
write_abstract_lef $lef_file
46-
diff_files make_8x8.lefok $lef_file
47-
48-
set def_file [make_result_file make_8x8.def]
49-
write_def $def_file
50-
diff_files make_8x8.defok $def_file
14+
-storage_cell sky130_fd_sc_hd__dlxtp_1 \
15+
-power_net VPWR \
16+
-ground_net 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}

0 commit comments

Comments
 (0)