Example Architecture SpecificationΒΆ

The listing below is for an FPGA with I/O pads, soft logic blocks (called CLB), configurable memory hard blocks, and fracturable multiplier hard blocks.

Notice that for the CLB, all the inputs are logically equivalent (line 157), and all the outputs are logically equivalent (line 158). This is usually true for cluster-based logic blocks, as the local routing within the block usually provides full (or near full) connectivity.

However, for other logic blocks, the inputs and all the outputs are not logically equivalent. For example, consider the memory block (lines 311-316). Swapping inputs going into the data input port changes the logic of the block because the data output order no longer matches the data input.

  1<!-- VPR Architecture Specification File -->
  2<!-- Quick XML Primer:
  3    * Data is hierarchical and composed of tags (similar to HTML)
  4    * All tags must be of the form <foo>content</foo> OR <foo /> with the latter form indicating no content. Don't forget the slash at the end.
  5    * Inside a start tag you may specify attributes in the form key="value". Refer to manual for the valid attributes for each element.
  6    * Comments may be included anywhere in the document except inside a tag where it's attribute list is defined.
  7    * Comments may contain any characters except two dashes. 
  8-->
  9<!-- Architecture based off Stratix IV
 10    Use closest ifar architecture: K06 N10 45nm fc 0.15 area-delay optimized, scale to 40 nm using linear scaling
 11    n10k06l04.fc15.area1delay1.cmos45nm.bptm.cmos45nm.xml
 12    * because documentation sparser for soft logic (delays not in QUIP), harder to track down, not worth our time considering the level of accuracy is approximate
 13      * delays multiplied by 40/45 to normalize for process difference between stratix 4 and 45 nm technology (called full scaling)
 14
 15      Use delay numbers off Altera device handbook:
 16
 17      http://www.altera.com/literature/hb/stratix-iv/stx4_5v1.pdf
 18      http://www.altera.com/literature/hb/stratix-iv/stx4_siv51004.pdf
 19      http://www.altera.com/literature/hb/stratix-iv/stx4_siv51003.pdf
 20      multipliers at 600 MHz, no detail on 9x9 vs 36x36
 21      * datasheets unclear
 22        * claims 4 18x18 independant multipliers, following test indicates that this is not the case:
 23          created 4 18x18 mulitpliers, logiclocked them to a single DSP block, compile
 24          result - 2 18x18 multipliers got packed together, the other 2 got ejected out of the logiclock region without error
 25          conclusion - just take the 600 MHz as is, and Quartus II logiclock hasn't fixed the bug that I've seen it do to registers when I worked at Altera (ie. eject without warning)
 26      -->
 27<architecture>
 28  <!-- ODIN II specific config -->
 29  <models>
 30    <model name="multiply">
 31      <input_ports>
 32        <port name="a" combinational_sink_ports="out"/>
 33        <port name="b" combinational_sink_ports="out"/>
 34      </input_ports>
 35      <output_ports>
 36        <port name="out"/>
 37      </output_ports>
 38    </model>
 39    <model name="single_port_ram">
 40      <input_ports>
 41        <port name="we" clock="clk"/>
 42        <!-- control -->
 43        <port name="addr" clock="clk"/>
 44        <!-- address lines -->
 45        <port name="data" clock="clk"/>
 46        <!-- data lines can be broken down into smaller bit widths minimum size 1 -->
 47        <port name="clk" is_clock="1"/>
 48        <!-- memories are often clocked -->
 49      </input_ports>
 50      <output_ports>
 51        <port name="out" clock="clk"/>
 52        <!-- output can be broken down into smaller bit widths minimum size 1 -->
 53      </output_ports>
 54    </model>
 55    <model name="dual_port_ram">
 56      <input_ports>
 57        <port name="we1" clock="clk"/>
 58        <!-- write enable -->
 59        <port name="we2" clock="clk"/>
 60        <!-- write enable -->
 61        <port name="addr1" clock="clk"/>
 62        <!-- address lines -->
 63        <port name="addr2" clock="clk"/>
 64        <!-- address lines -->
 65        <port name="data1" clock="clk"/>
 66        <!-- data lines can be broken down into smaller bit widths minimum size 1 -->
 67        <port name="data2" clock="clk"/>
 68        <!-- data lines can be broken down into smaller bit widths minimum size 1 -->
 69        <port name="clk" is_clock="1"/>
 70        <!-- memories are often clocked -->
 71      </input_ports>
 72      <output_ports>
 73        <port name="out1" clock="clk"/>
 74        <!-- output can be broken down into smaller bit widths minimum size 1 -->
 75        <port name="out2" clock="clk"/>
 76        <!-- output can be broken down into smaller bit widths minimum size 1 -->
 77      </output_ports>
 78    </model>
 79  </models>
 80  <tiles>
 81    <tile name="io" capacity="8">
 82      <equivalent_sites>
 83        <site pb_type="io" pin_mapping="direct"/>
 84      </equivalent_sites>
 85      <input name="outpad" num_pins="1"/>
 86      <output name="inpad" num_pins="1"/>
 87      <clock name="clock" num_pins="1"/>
 88      <fc in_type="frac" in_val="0.15" out_type="frac" out_val="0.10"/>
 89      <pinlocations pattern="custom">
 90        <loc side="left">io.outpad io.inpad io.clock</loc>
 91        <loc side="top">io.outpad io.inpad io.clock</loc>
 92        <loc side="right">io.outpad io.inpad io.clock</loc>
 93        <loc side="bottom">io.outpad io.inpad io.clock</loc>
 94      </pinlocations>
 95    </tile>
 96    <tile name="clb">
 97      <equivalent_sites>
 98        <site pb_type="clb" pin_mapping="direct"/>
 99      </equivalent_sites>
100      <input name="I" num_pins="33" equivalent="full"/>
101      <output name="O" num_pins="10" equivalent="instance"/>
102      <clock name="clk" num_pins="1"/>
103      <fc in_type="frac" in_val="0.15" out_type="frac" out_val="0.10"/>
104      <pinlocations pattern="spread"/>
105    </tile>
106    <tile name="mult_36" height="4">
107      <equivalent_sites>
108        <site pb_type="mult_36" pin_mapping="direct"/>
109      </equivalent_sites>
110      <input name="a" num_pins="36"/>
111      <input name="b" num_pins="36"/>
112      <output name="out" num_pins="72"/>
113      <pinlocations pattern="spread"/>
114    </tile>
115    <tile name="memory" height="6">
116      <equivalent_sites>
117        <site pb_type="memory" pin_mapping="direct"/>
118      </equivalent_sites>
119      <input name="addr1" num_pins="17"/>
120      <input name="addr2" num_pins="17"/>
121      <input name="data" num_pins="72"/>
122      <input name="we1" num_pins="1"/>
123      <input name="we2" num_pins="1"/>
124      <output name="out" num_pins="72"/>
125      <clock name="clk" num_pins="1"/>
126      <fc in_type="frac" in_val="0.15" out_type="frac" out_val="0.10"/>
127      <pinlocations pattern="spread"/>
128    </tile>
129  </tiles>
130  <!-- ODIN II specific config ends -->
131  <!-- Physical descriptions begin (area optimized for N8-K6-L4 -->
132  <layout>
133    <auto_layout aspect_ratio="1.0">
134      <!--Perimeter of 'io' blocks with 'EMPTY' blocks at corners-->
135      <perimeter type="io" priority="100"/>
136      <corners type="EMPTY" priority="101"/>
137      <!--Fill with 'clb'-->
138      <fill type="clb" priority="10"/>
139      <!--Column of 'mult_36' with 'EMPTY' blocks wherever a 'mult_36' does not fit. Vertical offset by 1 for perimeter.-->
140      <col type="mult_36" startx="4" starty="1" repeatx="8" priority="20"/>
141      <col type="EMPTY" startx="4" repeatx="8" starty="1" priority="19"/>
142      <!--Column of 'memory' with 'EMPTY' blocks wherever a 'memory' does not fit. Vertical offset by 1 for perimeter.-->
143      <col type="memory" startx="2" starty="1" repeatx="8" priority="20"/>
144      <col type="EMPTY" startx="2" repeatx="8" starty="1" priority="19"/>
145    </auto_layout>
146  </layout>
147  <device>
148    <sizing R_minW_nmos="6065.520020" R_minW_pmos="18138.500000"/>
149    <area grid_logic_tile_area="14813.392"/>
150    <!--area is for soft logic only-->
151    <chan_width_distr>
152      <x distr="uniform" peak="1.000000"/>
153      <y distr="uniform" peak="1.000000"/>
154    </chan_width_distr>
155    <switch_block type="wilton" fs="3"/>
156    <connection_block input_switch_name="ipin_cblock"/>
157  </device>
158  <switchlist>
159    <switch type="mux" name="0" R="0.000000" Cin="0.000000e+00" Cout="0.000000e+00" Tdel="6.837e-11" mux_trans_size="2.630740" buf_size="27.645901"/>
160    <!--switch ipin_cblock resistance set to yeild for 4x minimum drive strength buffer-->
161    <switch type="mux" name="ipin_cblock" R="1516.380005" Cout="0." Cin="0.000000e+00" Tdel="7.247000e-11" mux_trans_size="1.222260" buf_size="auto"/>
162  </switchlist>
163  <segmentlist>
164    <segment freq="1.000000" length="4" type="unidir" Rmetal="0.000000" Cmetal="0.000000e+00">
165      <mux name="0"/>
166      <sb type="pattern">1 1 1 1 1</sb>
167      <cb type="pattern">1 1 1 1</cb>
168    </segment>
169  </segmentlist>
170  <complexblocklist>
171    <!-- Capacity is a unique property of I/Os, it is the maximum number of I/Os that can be placed at the same (X,Y) location on the FPGA -->
172    <pb_type name="io">
173      <input name="outpad" num_pins="1"/>
174      <output name="inpad" num_pins="1"/>
175      <clock name="clock" num_pins="1"/>
176      <!-- IOs can operate as either inputs or outputs -->
177      <mode name="inpad">
178        <pb_type name="inpad" blif_model=".input" num_pb="1">
179          <output name="inpad" num_pins="1"/>
180        </pb_type>
181        <interconnect>
182          <direct name="inpad" input="inpad.inpad" output="io.inpad">
183            <delay_constant max="4.243e-11" in_port="inpad.inpad" out_port="io.inpad"/>
184          </direct>
185        </interconnect>
186      </mode>
187      <mode name="outpad">
188        <pb_type name="outpad" blif_model=".output" num_pb="1">
189          <input name="outpad" num_pins="1"/>
190        </pb_type>
191        <interconnect>
192          <direct name="outpad" input="io.outpad" output="outpad.outpad">
193            <delay_constant max="1.394e-11" in_port="io.outpad" out_port="outpad.outpad"/>
194          </direct>
195        </interconnect>
196      </mode>
197      <!-- IOs go on the periphery of the FPGA, for consistency, 
198           make it physically equivalent on all sides so that only one definition of I/Os is needed.
199           If I do not make a physically equivalent definition, then I need to define 4 different I/Os, one for each side of the FPGA
200       -->
201    </pb_type>
202    <pb_type name="clb">
203      <input name="I" num_pins="33" equivalent="full"/><!-- NOTE: Logically Equivalent -->
204      <output name="O" num_pins="10" equivalent="instance"/><!-- NOTE: Logically Equivalent -->
205      <clock name="clk" num_pins="1"/>
206      <!-- Describe basic logic element -->
207      <pb_type name="ble" num_pb="10">
208        <input name="in" num_pins="6"/>
209        <output name="out" num_pins="1"/>
210        <clock name="clk" num_pins="1"/>
211        <pb_type name="soft_logic" num_pb="1">
212          <input name="in" num_pins="6"/>
213          <output name="out" num_pins="1"/>
214          <mode name="n1_lut6">
215            <pb_type name="lut6" blif_model=".names" num_pb="1" class="lut">
216              <input name="in" num_pins="6" port_class="lut_in"/>
217              <output name="out" num_pins="1" port_class="lut_out"/>
218              <!-- LUT timing using delay matrix -->
219              <delay_matrix type="max" in_port="lut6.in" out_port="lut6.out">
220                          2.690e-10
221                          2.690e-10
222                          2.690e-10
223                          2.690e-10
224                          2.690e-10
225                          2.690e-10
226              </delay_matrix>
227            </pb_type>
228            <interconnect>
229              <direct name="direct1" input="soft_logic.in[5:0]" output="lut6[0:0].in[5:0]"/>
230              <direct name="direct2" input="lut6[0:0].out" output="soft_logic.out[0:0]"/>
231            </interconnect>
232          </mode>
233        </pb_type>
234        <pb_type name="ff" blif_model=".latch" num_pb="1" class="flipflop">
235          <input name="D" num_pins="1" port_class="D"/>
236          <output name="Q" num_pins="1" port_class="Q"/>
237          <clock name="clk" num_pins="1" port_class="clock"/>
238          <T_setup value="2.448e-10" port="ff.D" clock="clk"/>
239          <T_clock_to_Q max="7.732e-11" port="ff.Q" clock="clk"/>
240        </pb_type>
241        <interconnect>
242          <!-- Two ff, make ff available to only corresponding luts -->
243          <direct name="direct1" input="ble.in" output="soft_logic.in"/>
244          <direct name="direct2" input="soft_logic.out" output="ff.D"/>
245          <direct name="direct4" input="ble.clk" output="ff.clk"/>
246          <mux name="mux1" input="ff.Q soft_logic.out" output="ble.out"/>
247        </interconnect>
248      </pb_type>
249      <interconnect>
250        <complete name="crossbar" input="clb.I ble[9:0].out" output="ble[9:0].in">
251          <delay_constant max="8.044000e-11" in_port="clb.I" out_port="ble[9:0].in"/>
252          <delay_constant max="7.354000e-11" in_port="ble[9:0].out" out_port="ble[9:0].in"/>
253        </complete>
254        <complete name="clks" input="clb.clk" output="ble[9:0].clk"/>
255        <direct name="clbouts" input="ble[9:0].out" output="clb.O"/>
256      </interconnect>
257    </pb_type>
258    <!-- This is the 36*36 uniform mult -->
259    <pb_type name="mult_36">
260      <input name="a" num_pins="36"/>
261      <input name="b" num_pins="36"/>
262      <output name="out" num_pins="72"/>
263      <mode name="two_divisible_mult_18x18">
264        <pb_type name="divisible_mult_18x18" num_pb="2">
265          <input name="a" num_pins="18"/>
266          <input name="b" num_pins="18"/>
267          <output name="out" num_pins="36"/>
268          <mode name="two_mult_9x9">
269            <pb_type name="mult_9x9_slice" num_pb="2">
270              <input name="A_cfg" num_pins="9"/>
271              <input name="B_cfg" num_pins="9"/>
272              <output name="OUT_cfg" num_pins="18"/>
273              <pb_type name="mult_9x9" blif_model=".subckt multiply" num_pb="1">
274                <input name="a" num_pins="9"/>
275                <input name="b" num_pins="9"/>
276                <output name="out" num_pins="18"/>
277                <delay_constant max="1.667e-9" in_port="mult_9x9.a" out_port="mult_9x9.out"/>
278                <delay_constant max="1.667e-9" in_port="mult_9x9.b" out_port="mult_9x9.out"/>
279              </pb_type>
280              <interconnect>
281                <direct name="a2a" input="mult_9x9_slice.A_cfg" output="mult_9x9.a"/>
282                <direct name="b2b" input="mult_9x9_slice.B_cfg" output="mult_9x9.b"/>
283                <direct name="out2out" input="mult_9x9.out" output="mult_9x9_slice.OUT_cfg"/>
284              </interconnect>
285            </pb_type>
286            <interconnect>
287              <direct name="a2a" input="divisible_mult_18x18.a" output="mult_9x9_slice[1:0].A_cfg"/>
288              <direct name="b2b" input="divisible_mult_18x18.b" output="mult_9x9_slice[1:0].B_cfg"/>
289              <direct name="out2out" input="mult_9x9_slice[1:0].OUT_cfg" output="divisible_mult_18x18.out"/>
290            </interconnect>
291          </mode>
292          <mode name="mult_18x18">
293            <pb_type name="mult_18x18_slice" num_pb="1">
294              <input name="A_cfg" num_pins="18"/>
295              <input name="B_cfg" num_pins="18"/>
296              <output name="OUT_cfg" num_pins="36"/>
297              <pb_type name="mult_18x18" blif_model=".subckt multiply" num_pb="1">
298                <input name="a" num_pins="18"/>
299                <input name="b" num_pins="18"/>
300                <output name="out" num_pins="36"/>
301                <delay_constant max="1.667e-9" in_port="mult_18x18.a" out_port="mult_18x18.out"/>
302                <delay_constant max="1.667e-9" in_port="mult_18x18.b" out_port="mult_18x18.out"/>
303              </pb_type>
304              <interconnect>
305                <direct name="a2a" input="mult_18x18_slice.A_cfg" output="mult_18x18.a"/>
306                <direct name="b2b" input="mult_18x18_slice.B_cfg" output="mult_18x18.b"/>
307                <direct name="out2out" input="mult_18x18.out" output="mult_18x18_slice.OUT_cfg"/>
308              </interconnect>
309            </pb_type>
310            <interconnect>
311              <direct name="a2a" input="divisible_mult_18x18.a" output="mult_18x18_slice.A_cfg"/>
312              <direct name="b2b" input="divisible_mult_18x18.b" output="mult_18x18_slice.B_cfg"/>
313              <direct name="out2out" input="mult_18x18_slice.OUT_cfg" output="divisible_mult_18x18.out"/>
314            </interconnect>
315          </mode>
316        </pb_type>
317        <interconnect>
318          <direct name="a2a" input="mult_36.a" output="divisible_mult_18x18[1:0].a"/>
319          <direct name="b2b" input="mult_36.b" output="divisible_mult_18x18[1:0].b"/>
320          <direct name="out2out" input="divisible_mult_18x18[1:0].out" output="mult_36.out"/>
321        </interconnect>
322      </mode>
323      <mode name="mult_36x36">
324        <pb_type name="mult_36x36_slice" num_pb="1">
325          <input name="A_cfg" num_pins="36"/>
326          <input name="B_cfg" num_pins="36"/>
327          <output name="OUT_cfg" num_pins="72"/>
328          <pb_type name="mult_36x36" blif_model=".subckt multiply" num_pb="1">
329            <input name="a" num_pins="36"/>
330            <input name="b" num_pins="36"/>
331            <output name="out" num_pins="72"/>
332            <delay_constant max="1.667e-9" in_port="mult_36x36.a" out_port="mult_36x36.out"/>
333            <delay_constant max="1.667e-9" in_port="mult_36x36.b" out_port="mult_36x36.out"/>
334          </pb_type>
335          <interconnect>
336            <direct name="a2a" input="mult_36x36_slice.A_cfg" output="mult_36x36.a"/>
337            <direct name="b2b" input="mult_36x36_slice.B_cfg" output="mult_36x36.b"/>
338            <direct name="out2out" input="mult_36x36.out" output="mult_36x36_slice.OUT_cfg"/>
339          </interconnect>
340        </pb_type>
341        <interconnect>
342          <direct name="a2a" input="mult_36.a" output="mult_36x36_slice.A_cfg"/>
343          <direct name="b2b" input="mult_36.b" output="mult_36x36_slice.B_cfg"/>
344          <direct name="out2out" input="mult_36x36_slice.OUT_cfg" output="mult_36.out"/>
345        </interconnect>
346      </mode>
347      <fc_in type="frac">0.15</fc_in>
348      <fc_out type="frac">0.10</fc_out>
349    </pb_type>
350    <!-- Memory based off Stratix IV 144K memory.  Setup time set to match flip-flop setup time at 45 nm. Clock to q based off 144K max MHz  -->
351    <pb_type name="memory">
352      <input name="addr1" num_pins="17"/>
353      <input name="addr2" num_pins="17"/>
354      <input name="data" num_pins="72"/>
355      <input name="we1" num_pins="1"/>
356      <input name="we2" num_pins="1"/>
357      <output name="out" num_pins="72"/>
358      <clock name="clk" num_pins="1"/>
359      <mode name="mem_2048x72_sp">
360        <pb_type name="mem_2048x72_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1">
361          <input name="addr" num_pins="11" port_class="address"/>
362          <input name="data" num_pins="72" port_class="data_in"/>
363          <input name="we" num_pins="1" port_class="write_en"/>
364          <output name="out" num_pins="72" port_class="data_out"/>
365          <clock name="clk" num_pins="1" port_class="clock"/>
366          <T_setup value="2.448e-10" port="mem_2048x72_sp.addr" clock="clk"/>
367          <T_setup value="2.448e-10" port="mem_2048x72_sp.data" clock="clk"/>
368          <T_setup value="2.448e-10" port="mem_2048x72_sp.we" clock="clk"/>
369          <T_clock_to_Q max="1.852e-9" port="mem_2048x72_sp.out" clock="clk"/>
370        </pb_type>
371        <interconnect>
372          <direct name="address1" input="memory.addr1[10:0]" output="mem_2048x72_sp.addr"/>
373          <direct name="data1" input="memory.data[71:0]" output="mem_2048x72_sp.data"/>
374          <direct name="writeen1" input="memory.we1" output="mem_2048x72_sp.we"/>
375          <direct name="dataout1" input="mem_2048x72_sp.out" output="memory.out[71:0]"/>
376          <direct name="clk" input="memory.clk" output="mem_2048x72_sp.clk"/>
377        </interconnect>
378      </mode>
379      <mode name="mem_4096x36_dp">
380        <pb_type name="mem_4096x36_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1">
381          <input name="addr1" num_pins="12" port_class="address1"/>
382          <input name="addr2" num_pins="12" port_class="address2"/>
383          <input name="data1" num_pins="36" port_class="data_in1"/>
384          <input name="data2" num_pins="36" port_class="data_in2"/>
385          <input name="we1" num_pins="1" port_class="write_en1"/>
386          <input name="we2" num_pins="1" port_class="write_en2"/>
387          <output name="out1" num_pins="36" port_class="data_out1"/>
388          <output name="out2" num_pins="36" port_class="data_out2"/>
389          <clock name="clk" num_pins="1" port_class="clock"/>
390          <T_setup value="2.448e-10" port="mem_4096x36_dp.addr1" clock="clk"/>
391          <T_setup value="2.448e-10" port="mem_4096x36_dp.data1" clock="clk"/>
392          <T_setup value="2.448e-10" port="mem_4096x36_dp.we1" clock="clk"/>
393          <T_setup value="2.448e-10" port="mem_4096x36_dp.addr2" clock="clk"/>
394          <T_setup value="2.448e-10" port="mem_4096x36_dp.data2" clock="clk"/>
395          <T_setup value="2.448e-10" port="mem_4096x36_dp.we2" clock="clk"/>
396          <T_clock_to_Q max="1.852e-9" port="mem_4096x36_dp.out1" clock="clk"/>
397          <T_clock_to_Q max="1.852e-9" port="mem_4096x36_dp.out2" clock="clk"/>
398        </pb_type>
399        <interconnect>
400          <direct name="address1" input="memory.addr1[11:0]" output="mem_4096x36_dp.addr1"/>
401          <direct name="address2" input="memory.addr2[11:0]" output="mem_4096x36_dp.addr2"/>
402          <direct name="data1" input="memory.data[35:0]" output="mem_4096x36_dp.data1"/>
403          <direct name="data2" input="memory.data[71:36]" output="mem_4096x36_dp.data2"/>
404          <direct name="writeen1" input="memory.we1" output="mem_4096x36_dp.we1"/>
405          <direct name="writeen2" input="memory.we2" output="mem_4096x36_dp.we2"/>
406          <direct name="dataout1" input="mem_4096x36_dp.out1" output="memory.out[35:0]"/>
407          <direct name="dataout2" input="mem_4096x36_dp.out2" output="memory.out[71:36]"/>
408          <direct name="clk" input="memory.clk" output="mem_4096x36_dp.clk"/>
409        </interconnect>
410      </mode>
411      <mode name="mem_4096x36_sp">
412        <pb_type name="mem_4096x36_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1">
413          <input name="addr" num_pins="12" port_class="address"/>
414          <input name="data" num_pins="36" port_class="data_in"/>
415          <input name="we" num_pins="1" port_class="write_en"/>
416          <output name="out" num_pins="36" port_class="data_out"/>
417          <clock name="clk" num_pins="1" port_class="clock"/>
418          <T_setup value="2.448e-10" port="mem_4096x36_sp.addr" clock="clk"/>
419          <T_setup value="2.448e-10" port="mem_4096x36_sp.data" clock="clk"/>
420          <T_setup value="2.448e-10" port="mem_4096x36_sp.we" clock="clk"/>
421          <T_clock_to_Q max="1.852e-9" port="mem_4096x36_sp.out" clock="clk"/>
422        </pb_type>
423        <interconnect>
424          <direct name="address1" input="memory.addr1[11:0]" output="mem_4096x36_sp.addr"/>
425          <direct name="data1" input="memory.data[35:0]" output="mem_4096x36_sp.data"/>
426          <direct name="writeen1" input="memory.we1" output="mem_4096x36_sp.we"/>
427          <direct name="dataout1" input="mem_4096x36_sp.out" output="memory.out[35:0]"/>
428          <direct name="clk" input="memory.clk" output="mem_4096x36_sp.clk"/>
429        </interconnect>
430      </mode>
431      <mode name="mem_9182x18_dp">
432        <pb_type name="mem_9182x18_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1">
433          <input name="addr1" num_pins="13" port_class="address1"/>
434          <input name="addr2" num_pins="13" port_class="address2"/>
435          <input name="data1" num_pins="18" port_class="data_in1"/>
436          <input name="data2" num_pins="18" port_class="data_in2"/>
437          <input name="we1" num_pins="1" port_class="write_en1"/>
438          <input name="we2" num_pins="1" port_class="write_en2"/>
439          <output name="out1" num_pins="18" port_class="data_out1"/>
440          <output name="out2" num_pins="18" port_class="data_out2"/>
441          <clock name="clk" num_pins="1" port_class="clock"/>
442          <T_setup value="2.448e-10" port="mem_9182x18_dp.addr1" clock="clk"/>
443          <T_setup value="2.448e-10" port="mem_9182x18_dp.data1" clock="clk"/>
444          <T_setup value="2.448e-10" port="mem_9182x18_dp.we1" clock="clk"/>
445          <T_setup value="2.448e-10" port="mem_9182x18_dp.addr2" clock="clk"/>
446          <T_setup value="2.448e-10" port="mem_9182x18_dp.data2" clock="clk"/>
447          <T_setup value="2.448e-10" port="mem_9182x18_dp.we2" clock="clk"/>
448          <T_clock_to_Q max="1.852e-9" port="mem_9182x18_dp.out1" clock="clk"/>
449          <T_clock_to_Q max="1.852e-9" port="mem_9182x18_dp.out2" clock="clk"/>
450        </pb_type>
451        <interconnect>
452          <direct name="address1" input="memory.addr1[12:0]" output="mem_9182x18_dp.addr1"/>
453          <direct name="address2" input="memory.addr2[12:0]" output="mem_9182x18_dp.addr2"/>
454          <direct name="data1" input="memory.data[17:0]" output="mem_9182x18_dp.data1"/>
455          <direct name="data2" input="memory.data[35:18]" output="mem_9182x18_dp.data2"/>
456          <direct name="writeen1" input="memory.we1" output="mem_9182x18_dp.we1"/>
457          <direct name="writeen2" input="memory.we2" output="mem_9182x18_dp.we2"/>
458          <direct name="dataout1" input="mem_9182x18_dp.out1" output="memory.out[17:0]"/>
459          <direct name="dataout2" input="mem_9182x18_dp.out2" output="memory.out[35:18]"/>
460          <direct name="clk" input="memory.clk" output="mem_9182x18_dp.clk"/>
461        </interconnect>
462      </mode>
463      <mode name="mem_9182x18_sp">
464        <pb_type name="mem_9182x18_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1">
465          <input name="addr" num_pins="13" port_class="address"/>
466          <input name="data" num_pins="18" port_class="data_in"/>
467          <input name="we" num_pins="1" port_class="write_en"/>
468          <output name="out" num_pins="18" port_class="data_out"/>
469          <clock name="clk" num_pins="1" port_class="clock"/>
470          <T_setup value="2.448e-10" port="mem_9182x18_sp.addr" clock="clk"/>
471          <T_setup value="2.448e-10" port="mem_9182x18_sp.data" clock="clk"/>
472          <T_setup value="2.448e-10" port="mem_9182x18_sp.we" clock="clk"/>
473          <T_clock_to_Q max="1.852e-9" port="mem_9182x18_sp.out" clock="clk"/>
474        </pb_type>
475        <interconnect>
476          <direct name="address1" input="memory.addr1[12:0]" output="mem_9182x18_sp.addr"/>
477          <direct name="data1" input="memory.data[17:0]" output="mem_9182x18_sp.data"/>
478          <direct name="writeen1" input="memory.we1" output="mem_9182x18_sp.we"/>
479          <direct name="dataout1" input="mem_9182x18_sp.out" output="memory.out[17:0]"/>
480          <direct name="clk" input="memory.clk" output="mem_9182x18_sp.clk"/>
481        </interconnect>
482      </mode>
483      <mode name="mem_18194x9_dp">
484        <pb_type name="mem_18194x9_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1">
485          <input name="addr1" num_pins="14" port_class="address1"/>
486          <input name="addr2" num_pins="14" port_class="address2"/>
487          <input name="data1" num_pins="9" port_class="data_in1"/>
488          <input name="data2" num_pins="9" port_class="data_in2"/>
489          <input name="we1" num_pins="1" port_class="write_en1"/>
490          <input name="we2" num_pins="1" port_class="write_en2"/>
491          <output name="out1" num_pins="9" port_class="data_out1"/>
492          <output name="out2" num_pins="9" port_class="data_out2"/>
493          <clock name="clk" num_pins="1" port_class="clock"/>
494          <T_setup value="2.448e-10" port="mem_18194x9_dp.addr1" clock="clk"/>
495          <T_setup value="2.448e-10" port="mem_18194x9_dp.data1" clock="clk"/>
496          <T_setup value="2.448e-10" port="mem_18194x9_dp.we1" clock="clk"/>
497          <T_setup value="2.448e-10" port="mem_18194x9_dp.addr2" clock="clk"/>
498          <T_setup value="2.448e-10" port="mem_18194x9_dp.data2" clock="clk"/>
499          <T_setup value="2.448e-10" port="mem_18194x9_dp.we2" clock="clk"/>
500          <T_clock_to_Q max="1.852e-9" port="mem_18194x9_dp.out1" clock="clk"/>
501          <T_clock_to_Q max="1.852e-9" port="mem_18194x9_dp.out2" clock="clk"/>
502        </pb_type>
503        <interconnect>
504          <direct name="address1" input="memory.addr1[13:0]" output="mem_18194x9_dp.addr1"/>
505          <direct name="address2" input="memory.addr2[13:0]" output="mem_18194x9_dp.addr2"/>
506          <direct name="data1" input="memory.data[8:0]" output="mem_18194x9_dp.data1"/>
507          <direct name="data2" input="memory.data[17:9]" output="mem_18194x9_dp.data2"/>
508          <direct name="writeen1" input="memory.we1" output="mem_18194x9_dp.we1"/>
509          <direct name="writeen2" input="memory.we2" output="mem_18194x9_dp.we2"/>
510          <direct name="dataout1" input="mem_18194x9_dp.out1" output="memory.out[8:0]"/>
511          <direct name="dataout2" input="mem_18194x9_dp.out2" output="memory.out[17:9]"/>
512          <direct name="clk" input="memory.clk" output="mem_18194x9_dp.clk"/>
513        </interconnect>
514      </mode>
515      <mode name="mem_18194x9_sp">
516        <pb_type name="mem_18194x9_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1">
517          <input name="addr" num_pins="14" port_class="address"/>
518          <input name="data" num_pins="9" port_class="data_in"/>
519          <input name="we" num_pins="1" port_class="write_en"/>
520          <output name="out" num_pins="9" port_class="data_out"/>
521          <clock name="clk" num_pins="1" port_class="clock"/>
522          <T_setup value="2.448e-10" port="mem_18194x9_sp.addr" clock="clk"/>
523          <T_setup value="2.448e-10" port="mem_18194x9_sp.data" clock="clk"/>
524          <T_setup value="2.448e-10" port="mem_18194x9_sp.we" clock="clk"/>
525          <T_clock_to_Q max="1.852e-9" port="mem_18194x9_sp.out" clock="clk"/>
526        </pb_type>
527        <interconnect>
528          <direct name="address1" input="memory.addr1[13:0]" output="mem_18194x9_sp.addr"/>
529          <direct name="data1" input="memory.data[8:0]" output="mem_18194x9_sp.data"/>
530          <direct name="writeen1" input="memory.we1" output="mem_18194x9_sp.we"/>
531          <direct name="dataout1" input="mem_18194x9_sp.out" output="memory.out[8:0]"/>
532          <direct name="clk" input="memory.clk" output="mem_18194x9_sp.clk"/>
533        </interconnect>
534      </mode>
535    </pb_type>
536  </complexblocklist>
537</architecture>