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