@@ -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+ }
0 commit comments