Memory Block with Reconfigurable Aspect Ratio Example



      <pb_type name="memory" height="1"> 
          <input name="addr1" num_pins="14"/> 
          <input name="addr2" num_pins="14"/> 
          <input name="data" num_pins="16"/> 
          <input name="we1" num_pins="1"/> 
          <input name="we2" num_pins="1"/> 
          <output name="out" num_pins="16"/> 
          <clock name="clk" num_pins="1"/> 

          <mode name="mem_1024x16_sp"> 
            <pb_type name="mem_1024x16_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr" num_pins="10" port_class="address"/> 
              <input name="data" num_pins="16" port_class="data_in"/> 
              <input name="we" num_pins="1" port_class="write_en"/> 
              <output name="out" num_pins="16" port_class="data_out"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[9:0]" output="mem_1024x16_sp.addr"> 
              </direct> 
              <direct name="data1" input="memory.data[15:0]" output="mem_1024x16_sp.data"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_1024x16_sp.we"> 
              </direct> 
              <direct name="dataout1" input="mem_1024x16_sp.out" output="memory.out[15:0]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_1024x16_sp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 
          <mode name="mem_2048x8_dp"> 
            <pb_type name="mem_2048x8_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr1" num_pins="11" port_class="address1"/> 
              <input name="addr2" num_pins="11" port_class="address2"/> 
              <input name="data1" num_pins="8" port_class="data_in1"/> 
              <input name="data2" num_pins="8" port_class="data_in2"/> 
              <input name="we1" num_pins="1" port_class="write_en1"/> 
              <input name="we2" num_pins="1" port_class="write_en2"/> 
              <output name="out1" num_pins="8" port_class="data_out1"/> 
              <output name="out2" num_pins="8" port_class="data_out2"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[10:0]" output="mem_2048x8_dp.addr1"> 
              </direct> 
              <direct name="address2" input="memory.addr2[10:0]" output="mem_2048x8_dp.addr2"> 
              </direct> 
              <direct name="data1" input="memory.data[7:0]" output="mem_2048x8_dp.data1"> 
              </direct> 
              <direct name="data2" input="memory.data[15:8]" output="mem_2048x8_dp.data2"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_2048x8_dp.we1"> 
              </direct> 
              <direct name="writeen2" input="memory.we2" output="mem_2048x8_dp.we2"> 
              </direct> 
              <direct name="dataout1" input="mem_2048x8_dp.out1" output="memory.out[7:0]"> 
              </direct> 
              <direct name="dataout2" input="mem_2048x8_dp.out2" output="memory.out[15:8]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_2048x8_dp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 

          <mode name="mem_2048x8_sp"> 
            <pb_type name="mem_2048x8_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr" num_pins="11" port_class="address"/> 
              <input name="data" num_pins="8" port_class="data_in"/> 
              <input name="we" num_pins="1" port_class="write_en"/> 
              <output name="out" num_pins="8" port_class="data_out"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[10:0]" output="mem_2048x8_sp.addr"> 
              </direct> 
              <direct name="data1" input="memory.data[7:0]" output="mem_2048x8_sp.data"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_2048x8_sp.we"> 
              </direct> 
              <direct name="dataout1" input="mem_2048x8_sp.out" output="memory.out[7:0]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_2048x8_sp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 
          <mode name="mem_4096x4_dp"> 
            <pb_type name="mem_4096x4_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr1" num_pins="12" port_class="address1"/> 
              <input name="addr2" num_pins="12" port_class="address2"/> 
              <input name="data1" num_pins="4" port_class="data_in1"/> 
              <input name="data2" num_pins="4" port_class="data_in2"/> 
              <input name="we1" num_pins="1" port_class="write_en1"/> 
              <input name="we2" num_pins="1" port_class="write_en2"/> 
              <output name="out1" num_pins="4" port_class="data_out1"/> 
              <output name="out2" num_pins="4" port_class="data_out2"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[11:0]" output="mem_4096x4_dp.addr1"> 
              </direct> 
              <direct name="address2" input="memory.addr2[11:0]" output="mem_4096x4_dp.addr2"> 
              </direct> 
              <direct name="data1" input="memory.data[3:0]" output="mem_4096x4_dp.data1"> 
              </direct> 
              <direct name="data2" input="memory.data[7:4]" output="mem_4096x4_dp.data2"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_4096x4_dp.we1"> 
              </direct> 
              <direct name="writeen2" input="memory.we2" output="mem_4096x4_dp.we2"> 
              </direct> 
              <direct name="dataout1" input="mem_4096x4_dp.out1" output="memory.out[3:0]"> 
              </direct> 
              <direct name="dataout2" input="mem_4096x4_dp.out2" output="memory.out[7:4]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_4096x4_dp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 

          <mode name="mem_4096x4_sp"> 
            <pb_type name="mem_4096x4_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr" num_pins="12" port_class="address"/> 
              <input name="data" num_pins="4" port_class="data_in"/> 
              <input name="we" num_pins="1" port_class="write_en"/> 
              <output name="out" num_pins="4" port_class="data_out"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[11:0]" output="mem_4096x4_sp.addr"> 
              </direct> 
              <direct name="data1" input="memory.data[3:0]" output="mem_4096x4_sp.data"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_4096x4_sp.we"> 
              </direct> 
              <direct name="dataout1" input="mem_4096x4_sp.out" output="memory.out[3:0]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_4096x4_sp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 
          <mode name="mem_8192x2_dp"> 
            <pb_type name="mem_8192x2_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr1" num_pins="13" port_class="address1"/> 
              <input name="addr2" num_pins="13" port_class="address2"/> 
              <input name="data1" num_pins="2" port_class="data_in1"/> 
              <input name="data2" num_pins="2" port_class="data_in2"/> 
              <input name="we1" num_pins="1" port_class="write_en1"/> 
              <input name="we2" num_pins="1" port_class="write_en2"/> 
              <output name="out1" num_pins="2" port_class="data_out1"/> 
              <output name="out2" num_pins="2" port_class="data_out2"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[12:0]" output="mem_8192x2_dp.addr1"> 
              </direct> 
              <direct name="address2" input="memory.addr2[12:0]" output="mem_8192x2_dp.addr2"> 
              </direct> 
              <direct name="data1" input="memory.data[1:0]" output="mem_8192x2_dp.data1"> 
              </direct> 
              <direct name="data2" input="memory.data[3:2]" output="mem_8192x2_dp.data2"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_8192x2_dp.we1"> 
              </direct> 
              <direct name="writeen2" input="memory.we2" output="mem_8192x2_dp.we2"> 
              </direct> 
              <direct name="dataout1" input="mem_8192x2_dp.out1" output="memory.out[1:0]"> 
              </direct> 
              <direct name="dataout2" input="mem_8192x2_dp.out2" output="memory.out[3:2]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_8192x2_dp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 

          <mode name="mem_8192x2_sp"> 
            <pb_type name="mem_8192x2_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr" num_pins="13" port_class="address"/> 
              <input name="data" num_pins="2" port_class="data_in"/> 
              <input name="we" num_pins="1" port_class="write_en"/> 
              <output name="out" num_pins="2" port_class="data_out"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[12:0]" output="mem_8192x2_sp.addr"> 
              </direct> 
              <direct name="data1" input="memory.data[1:0]" output="mem_8192x2_sp.data"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_8192x2_sp.we"> 
              </direct> 
              <direct name="dataout1" input="mem_8192x2_sp.out" output="memory.out[1:0]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_8192x2_sp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 
          <mode name="mem_16384x1_dp"> 
            <pb_type name="mem_16384x1_dp" blif_model=".subckt dual_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr1" num_pins="14" port_class="address1"/> 
              <input name="addr2" num_pins="14" port_class="address2"/> 
              <input name="data1" num_pins="1" port_class="data_in1"/> 
              <input name="data2" num_pins="1" port_class="data_in2"/> 
              <input name="we1" num_pins="1" port_class="write_en1"/> 
              <input name="we2" num_pins="1" port_class="write_en2"/> 
              <output name="out1" num_pins="1" port_class="data_out1"/> 
              <output name="out2" num_pins="1" port_class="data_out2"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[13:0]" output="mem_16384x1_dp.addr1"> 
              </direct> 
              <direct name="address2" input="memory.addr2[13:0]" output="mem_16384x1_dp.addr2"> 
              </direct> 
              <direct name="data1" input="memory.data[0:0]" output="mem_16384x1_dp.data1"> 
              </direct> 
              <direct name="data2" input="memory.data[1:1]" output="mem_16384x1_dp.data2"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_16384x1_dp.we1"> 
              </direct> 
              <direct name="writeen2" input="memory.we2" output="mem_16384x1_dp.we2"> 
              </direct> 
              <direct name="dataout1" input="mem_16384x1_dp.out1" output="memory.out[0:0]"> 
              </direct> 
              <direct name="dataout2" input="mem_16384x1_dp.out2" output="memory.out[1:1]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_16384x1_dp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 

          <mode name="mem_16384x1_sp"> 
            <pb_type name="mem_16384x1_sp" blif_model=".subckt single_port_ram" class="memory" num_pb="1" area="1000"> 
              <input name="addr" num_pins="14" port_class="address"/> 
              <input name="data" num_pins="1" port_class="data_in"/> 
              <input name="we" num_pins="1" port_class="write_en"/> 
              <output name="out" num_pins="1" port_class="data_out"/> 
              <clock name="clk" num_pins="1" port_class="clock"/> 
            </pb_type> 
            <interconnect> 
              <direct name="address1" input="memory.addr1[13:0]" output="mem_16384x1_sp.addr"> 
              </direct> 
              <direct name="data1" input="memory.data[0:0]" output="mem_16384x1_sp.data"> 
              </direct> 
              <direct name="writeen1" input="memory.we1" output="mem_16384x1_sp.we"> 
              </direct> 
              <direct name="dataout1" input="mem_16384x1_sp.out" output="memory.out[0:0]"> 
              </direct> 
              <direct name="clk" input="memory.clk" output="mem_16384x1_sp.clk"> 
              </direct> 
            </interconnect> 
          </mode> 



        <fc_in type="frac"> 0.15</fc_in> 
        <fc_out type="frac"> 0.125</fc_out> 
        <pinlocations pattern="spread"/> 
        <gridlocations> 
          <loc type="col" start="2" repeat="5" priority="2"/> 
        </gridlocations> 
      </pb_type>