Welcome to QuickLogic-FPGA-Toolchain’s documentation for QuickLogic Devices!

Symbiflow Installation Guide and Tutorial

This provides the details of the Symbiflow package installation and the various commands supported by the tool. It covers how to install Symbiflow on the Linux operating systems and the usage of the tool by going over a simple example.

System Requirements

Requirements

Linux

CentOS

Ubuntu

Processor

Intel Xeon® or similar processors

Intel Xeon or similar processors

Intel Xeon or similar processors


Ram Size: 2 GB or more
Free Hard-Disc space: 5GB or more

Installing Symbiflow on Linux

Download the required symbiflow installer from the Releases tag.

To install Symbiflow on Linux:

  1. Set the execute permission for the .run file

chmod 755 Symbiflow*<version>*.gz.run
  1. Set the <INSTALL_DIR>: variable:

export INSTALL_DIR=<Install path>
  1. Execute the .run file from the terminal:

bash Symbiflow<*version*>.gz.run

QLF-K4N8/QLF-K6N10 Device

This provides details about running designs using qlf-k4n8/qlf-k6n10 device on Symbiflow

Symbiflow: Design flow (QLF-K4N8/QLF-K6N10)

Symbiflow design flow starts with the verilog as input, synthesis done using the yosys, pack, place and route with VPR tool. Finally the programming files are dumped which can be used for the fpga programming. Post layout verilog files can be used to validate the verilog design netlist dumped after the place and route.

Design flow

Supported Commands

Command option

Represented for (One with * supports only for qlf_k4n8)

Options

-synth

Synthesis using yosys

-

-compile

Run pack, place, route and generate fasm file

-

-src <source path>

Source file folder

-

-d <device>

Device supported

qlf_k4n8/qlf_k6n10

-P <package>

*Package csv file

qlf_k4n8 csv file

-p <pcf file>

*Fix Placement constraints of IO’s

-

-s <sdc file>

*Timing Constraint File (SDC)

Refer online documents section for SDC constraints supported

-r <router flag>

Timing: means no attention is paid to delay. Congestion: means nets on the critical path pay no attention to congestion

timing, congestion

-t <top module>

Top module of the Verilog design

-

-v <Verilog list files>

Verilog source files

Only Verilog supported

-pnr_corner

*Timing corner for the place and route tool

fast/slow

-analysis_corner

*SDF corner for the verilog post layout

fast/slow

-dump

Dump post layout verilog file

post_verilog

Below commands are supported only for synthesis(-synth option):

Command option

Represented for

Usage

-y

Specifies a verilog library directory to search for module definition. Multiple directories can be specified with space

-y <directory_path>

-f

Specifies a file that contains a list of commands to run

-f <filename>

+incdir+

Specifies the directories that contains the files declared with the `include compiler directive. Multiple directories can be specified with the + character

+incdir+<directory>

+libext+

Specify files with particular extension in the directory. You can specify more than one extension, separating each extension with the + character. Use this option when you enter the -y option

+libext+<extension>

+define+

Defines a text macro. Use `ifdef compiler directive in your Verilog source code

+define+<macro_name>=<value>

Design flow

Setup environment

To run the counter_16bit or any example, perform these steps once. Design flow will be covered using the counter_16bit design which is avaiable in the package. We will use the device QLF_K4N8 for this run. However the flow for the device QLF_K6N10 is similar except that it is supported only till place and route.

export INSTALL_DIR="specify the installpath"
cd $INSTALL_DIR; source setup.sh

OR

#adding symbiflow toolchain binaries to PATH
export PATH="$INSTALL_DIR/quicklogic-arch-defs/bin:$INSTALL_DIR/quicklogic-arch-defs/bin/python:$PATH"
source "$INSTALL_DIR/conda/etc/profile.d/conda.sh"
conda activate

Entering an HDL Design:

1. Write a Verilog code for the design using any text editor.
2. Verify the syntax.
3. Create the simulation stimuli using any text editor.

The code and testbench for the example design are present at:
<Install_Path>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit/

Performing the Pre-Layout Simulation

To perform a pre-layout simulation:

Using Icarus Verilog:

To create the VCD output file that will be used to perform graphical analysis of the
Design, the following lines are added in the TB:

initial begin
 $dumpfile("counter_16bit_tb.vcd");
 $dumpvars(0,counter_16bit_tb);
 $display("\\t\\ttime,\\tclk,\\treset,\\tenable,\\tcount");
 $monitor("%d,\\t%b,\\t%b,\\t%b,\\t%d",$time, clk,reset,enable,count);
end

The “iverilog” and “vvp” commands are the most important commands available to users of Icarus Verilog. The “iverilog” command is the compiler, and the “vvp” command is the simulation runtime engine.

cd <INSTALL_PATH>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit

The “iverilog” command supports multi-file designs by two methods. The simplest is to list the files on the command line:

iverilog -o my_design counter_16bit.v counter_16bit_tb.v
vvp my_design

This command compiles the design, which is spread across two input files, and generates the compiled result into the “my_design” file.
Another technique is to use a commandfile, which lists the input files in a text file. For example, create a text file called “file_list.txt” with the files listed one per line:

#Inside file_list.txt
counter_16bit.v
counter_16bit_tb.v
#Then compile and execute the design with command:
iverilog -o my_design -c file_list.txt
vvp my_design

VCD file is created, it can be viewed using GTKWave:

gtkwave counter_16bit_tb.vcd &
Waveform

Performing Design Synthesis

To perform a design synthesis:

In SymbiFlow, the synthesis of Verilog files is performed with Yosys. Yosys parses Verilog files, applies basic optimizations, performs technological mapping to FPGA blocks, and generates JSON and EBLIF files for the place and route tool. Example is for qlf_k4n8.

Syntax:

ql_symbiflow -synth -src <source complete path> -d <device> -t <top module name> -v <verilog files>
cd <INSTALL_PATH>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit

and run the below command:

ql_symbiflow -synth -d qlf_k4n8 -t top -v counter_16bit.v

Output files for synthesis are present in ‘build’ folder:

<TOP>.eblif : netlist file for the design
<TOP>_synth.log : synthesis log information, refer this file for any issues during synthesis

Resource utilization in the top_synth.log of the counter:

Number of wires:                 23
Number of wire bits:             68
Number of public wires:          23
Number of public wire bits:      68
Number of memories:               0
Number of memory bits:            0
Number of processes:              0
Number of cells:                 48
  dff                            16
  lut                            16
  adder_lut4                     16

Note

> All the output log files will be dumped in {source path}/build folder
> -src command is optional if run from the same directory where source files are present.
> -synth option is supported for both devices QLF_K4N8 & QLF_K6N10.

 

Pin Mapping

Document for pin mapping file specification

This describes in detail about the xml and csv file format that are used to define the pin mapping.

Scope

This requirement document lists down the requirements for a pin mapping specification file. This file format addresses the requirements for specifying pin mapping of an eFPGA device interface ports to end-user defined package (explained in below example)

Example

As an example, refer to OpenFPGA Caraval architecture

Its I/O resources are explained here

To summarize, it is 12x12 size eFPGA architecture with 144 I/Os that consists of:

  • 29 external I/Os are accessible through the Caravel SoC’s _General-Purpose I/Os (GPIOs).

  • 115 internal I/Os are accessible through the Caravel SOC’s logic analyzer and wishbone interfaces, which are controlled by the RISC-V processor.

Note that in eFPGA device, each IO interface can have multiple IO ports (like 16 input/16 output at each location). However, for the current architecture, only 144 I/Os are required. For some other architecture, the same eFPGA can be used with different I/O setup.

We require a mechanism to specify pin-mapping for GPIOs with user-defined pin-names rather than default names present in eFPGA I/O interface.

_images/image1.png

Above figure is a 12x12 EFPGA device where green-colored cells represent EFPGA IO interface cells and blue-colored cells represent user-defined package:

  • Green colored cells are EFPGA interface cells. Each cell consists of 16 input/16 output ports

  • White colored cells are EFPGA core of 12x12 device size

  • Blue colored cells are termed as an end-user package. Here end-user is an EFPGA device user who intends to use it in their silicon. * User defines their pin-mapping to green-colored IO interface ports * User can define multiple such packages

In this example, we require the following pin-mapping specifications:

  1. Internally (not for the EFPGA user), we need to define a mapping between IO cell ports (defined in vpr_arch xml file) to EFPGA IO interface cell ports (mentioned in green-colored cells)
    1. This specification is defined in XML file (details are mentioned in the below section)

  2. For EFPGA users (SoC vendors using the EFPGA fabric in their IP), define pin-mapping between IO interface cell ports (defined in previous point) to user-defined pin names
    1. This is defined in a comma-separated (csv) file, details are mentioned in the following section.

    2. User can associate the defined pins with clock as well as can define timing constraints in a sdc file

XML File Specification

XML file specification is primarily to define the mapping of the interface cell ports defined in vpr_arch xml, to the EFPGA IO interface port names. This mapping is required by Symbiflow alongwith architecture definition file i.e. vpr_arch xml file. Symbiflow will process this file and use this information for IO placement and then later on use this to map it with the user-defined pin-mapping file.

As shown in the below diagram that represents 8x8 device, it follows the similar convention as represented in vpr arch xml.

  • Base coordinates start with the bottom-left corner.

  • Width (W) represents the number of columns.

  • Height (H) represents the number of rows.

  • x coordinate can be an integer between 0 to W-1.

  • y coordinate can be an integer between 0 to H-1.

  • z coordinate can be an integer to represent the number of items stacked at a specific x,y location.

8x8 eFPGA Device

The xml file follows these specifications:

  1. In XML file, sections and subsections are defined in upper caps.

  2. Root section in the xml is named as “DEVICE” and it has the following attributes defined:
    1. “name”: Define the device architecture name. Mandatory attribute.

    2. “family”: Define the device architecture family name. Mandatory attribute

    3. “width”: Define the width or the number of cells in a row. Use “W” as a special variable to represent the width of the device in xml specification. Mandatory attribute.

    4. “height”: Define the height or the number of cells in a column. Use “H” as a special variable to represent the height of the device in xml specification. Mandatory attribute.

    5. “z”: Define number of ports stacked at a specific row/column. By default, z is “1”.

  3. Root section has a child section by name – “IO”.

  4. “IO” has the following child sections:
    1. “TOP_IO”: It defines the interface cells & ports at the top-side of the device. It has the following attributes defined:
      1. “y”: Defines the row number at which top-level interface cells are present. By default y for TOP_IO is “H-1”.

    2. “RIGHT_IO”: It defines the interface cells & ports at the right-side of the device. It has the following attributes defined:
      1. “x”: Defines the column number at which right-level interface cells are present. By default x for RIGHT_IO is “W-1”.

    3. “BOTTOM_IO”: It defines the interface cells & ports at the bottom-level of the device. It has the following attributes defined:
      1. “y”: Defines the row number at which bottom-level interface cells are present. By default y for BOTTOM_IO is “0”.

    4. “LEFT_IO”: It defines the interface cells & ports at the left-side of the device. It has the following attributes defined:
      1. “x”: Defines the column number at which left-level interface cells are present. By default x for LEFT_IO is “0”.

  5. Sub-section “TOP_IO”, “BOTTOM_IO”, “LEFT_IO” or “RIGHT_IO” section has the following sub-section defined:
    1. “CELL”: Defines the cell level port mapping. It accepts the following attributes:
      1. “port_name”: Port name (can be scalar, bus or part-select) defined at interface cell-level. Corresponds to port name as defined in IO cell port in vpr_arch xml model section. Mandatory attribute

      2. “mapped_name”: Mapped IO interface port name. In case of output port, the default value is “NA” and for input port, the default value is “GND”

      3. “startx” or “starty”: For TOP_IO & BOTTOM_IO, “startx” is defined as the starting column number in the given TOP_IO or BOTTOM_IO section, where the given pin mapping starts for bus ports. “starty” is defined as the starting row number in the given LEFT_IO or RIGHT_IO section, where the given pin mapping starts for bus ports. NOTE: it is an error if “startx” is defined in the LEFT_IO or RIGHT_IO section. Similarly, it is an error if “starty” is defined in the TOP_IO & BOTTOM_IO section.

      4. “endx” or “endy”: For TOP_IO & BOTTOM_IO, “endx” is defined as the ending column number in the given TOP_IO or BOTTOM_IO section, where the given pin mapping ends for bus ports. “endy” is defined as the ending row number in the given LEFT_IO or RIGHT_IO section, where the given pin mapping ends for bus ports. NOTE: it is an error if “endx” is defined in the LEFT_IO or RIGHT_IO section. Similarly, it is an error if “endy” is defined in the TOP_IO & BOTTOM_IO section.

Template xml file <https://github.com/SymbiFlow/symbiflow-arch-defs/blob/master/quicklogic/qlf_k4n8/devices/umc22/interface-mapping_24x24.xml> for a 24x24 device corresponding vpr_arch xml looks like the following:

<?xml version="1.0" encoding="utf-8"?>

<DEVICE name= "qlf_k4n8_umc22" family="qlf_k4n8" width="26" height="26" z="16">
    <IO>
        <TOP_IO y="25">
            <CELL port_name="f2a_i" mapped_name="gfpga_pad_IO_F2A[0:383]" startx="1" endx="24"/>
            <CELL port_name="a2f_o" mapped_name="gfpga_pad_IO_A2F[0:383]" startx="1" endx="24"/>
        </TOP_IO>
        <RIGHT_IO x="25">
            <CELL port_name="f2a_i" mapped_name="gfpga_pad_IO_F2A[384:767]" starty="24" endy="1"/>
            <CELL port_name="a2f_o" mapped_name="gfpga_pad_IO_A2F[384:767]" starty="24" endy="1"/>
        </RIGHT_IO>
        <BOTTOM_IO y="0">
            <CELL port_name="f2a_i" mapped_name="gfpga_pad_IO_F2A[768:1151]" startx="24" endx="1"/>
            <CELL port_name="a2f_o" mapped_name="gfpga_pad_IO_A2F[768:1151]" startx="24" endx="1"/>
        </BOTTOM_IO>
        <LEFT_IO x="0">
            <CELL port_name="f2a_i" mapped_name="gfpga_pad_IO_F2A[1152:1535]" starty="1" endy="24"/>
            <CELL port_name="a2f_o" mapped_name="gfpga_pad_IO_A2F[1152:1535]" starty="1" endy="24"/>
        </LEFT_IO>
    </IO>
</DEVICE>

Note

When more than one port is specified for mapping at a particular location, then the user has a choice to choose any one of the ports, in csv file specification. It is an error if pin mapping is specified for more than one port at a particular location (same x, y and z coordinates).

CSV File Specification

Symbiflow is going to dump a template csv file which eFPGA users can update to specify their pin-mapping specifications.

CSV file contains the following column (in the specified order) and mandatory options must be specified.

  1. Orientation: Valid values are – TOP, BOTTOM, RIGHT or LEFT. Pre-filled in the template file dumped by Symbiflow. Mandatory option.

  2. Row: Row number of the IO cell containing this pin. Pre-filled in the template file dumped by Symbiflow.

  3. Column: Column number of the IO cell containing this pin. Pre-filled in the template file dumped by Symbiflow.

  4. Pin number in the cell: Pin number in the cell. Pre-filled in the template file dumped by Symbiflow.

  5. Port name: Port name (can be scalar, bus or part-select) defined at interface cell-level. Pre-filled in the template file dumped by Symbiflow. Mandatory option.

  6. Mapped pin name: User-defined mapped pin-name. If it is not defined, then the default value for the output port is “NA” and for the input port is “GND”. Needs to be entered by the user for whichever interface port they need to map with. User can edit the interface port name as per their pin specification i.e. if bus interface port name is specified and user wants to specify pin-mapping only for a single scalar interface port from the given bus port, then user can edit the port name in that particular row in the csv file. For GPIO pins, user must specify an index like 0, 1 etc, instead of specifying any text name

  7. GPIO pin type: Specify “GPIO_IN”, “GPIO_OUT” or “GPIO_EN” to define if the particular port is mapped to a general purpose IO (GPIO) of either of these types - IN (input), OUT (output) or EN (enable). In IO fix placement constraints (defined via input pcf file in symbiflow) can only be defined on the GPIO pins. Default value is “No”.

  8. Associated Clock: Specify device clock associated to this port. In case of qlf_k4n8 device, device clocks are - CLK0, CLK1, CLK2 and CLK3. You can specify multiple clocks with a space in between.

  9. Clock Edge: Type of clock edge at which the data is available. The value can be rising or falling.

  10. Clock Orientation: CLK0 -> BOTTOM, CLK1 -> RIGHT, CLK2 -> TOP, CLK3 -> LEFT.

Points to Note
  1. In case multiple ports are defined in an xml file for a particular location, template csv file contains one port out of those specified ports at a particular location. Users can choose mapping for that port specified in the csv file OR may choose another port from the xml file for specifying a pin-mapping at that location.

  2. It is an error if more than one port is specified in a csv file at a specific location (same x, y and z coordinates).

  3. If a user specifies bus-port specification in the csv file for pin-mapping, then it is not required to specify row, column or pin_num_in_cell for that bus-port.

  4. If a user specifies scalar-port specification in the csv file for pin-mapping, then also it is not mandatory to specify row, column or pin_num_in_cell. They are mentioned in the template csv files for users to visualize the port location and decide on pin-mapping.

  5. Users must specify package name as the csv file name i.e. in file <PACKAGE>.csv, <PACKAGE> is considered as the package name for the pin-mapping specification provided in this csv file.

Template csv file that Symbiflow is going to dump out for a 32x32 looks like the following:

Note

At a specific location either A2F or F2A signal can be mapped but not both. For example, both gfpga_pad_IO_F2A[0] (output port) & gfpga_pad_IO_A2F[0] (input port) cannot have pin-mapping defined. An error is reported if multiple port mappings specified at a specific location.

Below is the generated template csv file for a 4x4 device. It contains a gfpga_pad_IO_A2F port but users can alternatively use gfpga_pad_IO_F2A at any location for pin-mapping.

orientation,row,col,pin_num_in_cell,port_name,mapped_pin,GPIO_type,Associated Clock,Clock Edge

TOP,5,1,0,gfpga_pad_IO_A2F[0],,,,
TOP,5,1,1,gfpga_pad_IO_A2F[1],,,,
TOP,5,2,0,gfpga_pad_IO_A2F[2],,,,
TOP,5,2,1,gfpga_pad_IO_A2F[3],,,,
TOP,5,3,0,gfpga_pad_IO_A2F[4],,,,
TOP,5,3,1,gfpga_pad_IO_A2F[5],,,,
TOP,5,4,0,gfpga_pad_IO_A2F[6],,,,
TOP,5,4,1,gfpga_pad_IO_A2F[7],,,,
BOTTOM,0,4,0,gfpga_pad_IO_A2F[128],,,,
BOTTOM,0,4,1,gfpga_pad_IO_A2F[129],,,,
BOTTOM,0,3,0,gfpga_pad_IO_A2F[130],,,,
BOTTOM,0,3,1,gfpga_pad_IO_A2F[131],,,,
BOTTOM,0,2,0,gfpga_pad_IO_A2F[132],,,,
BOTTOM,0,2,1,gfpga_pad_IO_A2F[133],,,,
BOTTOM,0,1,0,gfpga_pad_IO_A2F[134],,,,
BOTTOM,0,1,1,gfpga_pad_IO_A2F[135],,,,
LEFT,1,0,0,gfpga_pad_IO_A2F[192],,,,
LEFT,1,0,1,gfpga_pad_IO_A2F[193],,,,
LEFT,2,0,0,gfpga_pad_IO_A2F[194],,,,
LEFT,2,0,1,gfpga_pad_IO_A2F[195],,,,
RIGHT,4,5,0,gfpga_pad_IO_A2F[64],,,,
RIGHT,4,5,1,gfpga_pad_IO_A2F[65],,,,
RIGHT,3,5,0,gfpga_pad_IO_A2F[66],,,,
RIGHT,3,5,1,gfpga_pad_IO_A2F[67],,,,
RIGHT,2,5,0,gfpga_pad_IO_A2F[68],,,,
RIGHT,2,5,1,gfpga_pad_IO_A2F[69],,,,
RIGHT,1,5,0,gfpga_pad_IO_A2F[70],,,,
RIGHT,1,5,1,gfpga_pad_IO_A2F[71],,,,

Users can take the above mentioned csv file and update it in the following manner to define their pin-mapping. Users can specify only those rows where a pin-mapping is specified. It is optional to specify other rows where no pin-mapping is specified. CSV file named as: ‘PACK_4x4.csv’ is defined as follows:

orientation,row,col,pin_num_in_cell,port_name,mapped_pin,GPIO_type,Associated Clock,Clock Edge

TOP,,,,gfpga_pad_IO_F2A[1:4],user_out_T[0:3],,CLK0,
TOP,5,3,1,gfpga_pad_IO_A2F[5],0,GPIO_IN,,
TOP,5,4,0,gfpga_pad_IO_F2A[6],0,GPIO_OUT,,
TOP,5,4,1,gfpga_pad_IO_F2A[7],0,GPIO_EN,,
BOTTOM,,,,gfpga_pad_IO_F2A[16:18],user_out_B[2:0],,CLK2 CLK3,
BOTTOM,0,2,0,gfpga_pad_IO_A2F[132],1,GPIO_IN,,
BOTTOM,0,2,1,gfpga_pad_IO_F2A[133],1,GPIO_OUT,,
BOTTOM,0,1,0,gfpga_pad_IO_F2A[134],1,GPIO_EN,,
RIGHT,4,5,0,gfpga_pad_IO_A2F[64],user_in_R[0],,,
RIGHT,3,5,0,gfpga_pad_IO_A2F[66],user_in_R[1],,CLK1,

Note

> The pinmap and csv files are only supported for the eFPGA flow for QLF_K4N8
> In the above example, the first row represents the pin-mapping with bus-ports.
> In this row, gfpga_pad_IO_F2A[1:4] is mapped to user-defined pins: user_out_T[0:3] such that gfpga_pad_IO_F2A[1] is mapped to user_out_T[0], gfpga_pad_IO_F2A[2] is mapped to user_out_T[1] and so on.

SDC File Specification

In case of eFPGA flow, the user needs to provide SDC timing constraints on the mapped pin name/net name.

SDC File can be specified as input with timing constraints applied on the mapped user-defined pins.

Following are the SDC commands used for specifying the I/O constraints.

You can read about these commands in more detail at: <https://docs.verilogtorouting.org/en/latest/vpr/sdc_commands/>

create_clock

This constraint creates a design clock and defines its characteristics. Clock characteristics include clock name, clock period, waveform, and clock source.


Syntax:

create_clock -name clockName -period period_float_values [-waveform edge_list]


Example:

create_clock -name CLK -period 2.0 -waveform {0 5}

This example generates a clock named CLK, whose clock period is 2.0ns and the clock source is available at the clk port. The clock edges are 0.0 and 1.0, respectively.

set_input_delay/set_output_delay

Use set_input_delay if you want timing paths from input I/Os analyzed, and set_output_delay if you want timing paths to output I/Os analyzed.

These commands constrain each I/O pad specified after get_ports to be timing-equivalent to a register clocked on the clock specified after -clock. This can be either a clock signal in your design or a virtual clock that does not exist in the design but which is used only to specify the timing of I/Os.

The specified delays are added to I/O timing paths and can be used to model board level delays.

This constraint sets the external minimum or maximum arrival time for the design or device input pin with respect to the specified reference clock. This constraint can be used to perform timing analysis from an external source to the next sequential element that is in eFPGA. Since the element is in eFPGA, the user can constrain the design at the eFPGA input.


Syntax:

set_input_delay delay_float_value -clock ref_clock [-max] [-min] [-clock_fall] input_port/pin_list


Example:

set_input_delay 2.0 -max [get_ports {IN}]

This example sets the input delay of 2.0 ns at the default input port and sets the maximum delay.


Syntax:

set_output_delay delay_float_value -clock ref_clock [-max] [-min] [-clock_fall] output_port_list


Example:

set_output_delay 1.0 -max [get_ports {count[0]}]

This example sets the output delay to 1.0ns at the count[0] port and sets the maximum delay.

Sample SDC File

Sample SDC file looks like the following:

create_clock -name SYS_CLK_0 -period 10 -waveform {0 5}
create_clock -name SYS_CLK_1 -period 10 -waveform {0 5}
create_clock -name SYS_CLK_2 -period 10 -waveform {0 5}
create_clock -name SYS_CLK_3 -period 10 -waveform {0 5}
create_clock -name SYS_CLK_4 -period 10 -waveform {0 5}
set_output_delay 10 -max -clock SYS_CLK_2 [get_ports F1]
set_output_delay -0 -min -clock SYS_CLK_2 [get_ports F1]
set_input_delay 10 -max -clock SYS_CLK_2 [get_ports A1]
set_input_delay 0 -min -clock SYS_CLK_2 [get_ports A1]
set_output_delay 10 -max -clock SYS_CLK_0 [get_ports F2]
set_output_delay -0 -min -clock SYS_CLK_0 [get_ports F2]
set_input_delay 10 -max -clock SYS_CLK_1 [get_ports A2]
set_input_delay 0 -min -clock SYS_CLK_1 [get_ports A2]

Running Pack, Place and Route Tools

The eblif file generated during the synthesis is used for pack, place and route along with device information, pcf and the sdc file.
User needs to provide the csv, sdc and pcf file. These are optional input files. CSV and pcf file is not present in the test folder.

Syntax:

ql_symbiflow -compile -src <source complete path> -d <device> -t <top module name> -v <verilog files> -p <pcf file> -P <Package CSV file> -s <SDC file> -pnr_corner <fast/slow>

The output files dumped will be:
<TOP>.net : Once packing is complete.
<TOP>.place : Placer file from VPR
<TOP>.route  : Router file from VPR

One can refer to the pack.log, placer.log, router.log for more information related to each tool.

cd <INSTALL_PATH>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit
ql_symbiflow -compile -src $PWD -d qlf_k4n8 -t top -v counter_16bit.v -s counter_16bit.sdc

The above command will also run synthesis if it was not run before.

If user wants to do IO fix placement, then pcf and csv files need to be specified in the following manner:

cd <INSTALL_PATH>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit
ql_symbiflow -compile -src $PWD -d qlf_k4n8 -t top -v counter_16bit.v -s counter_16bit.sdc -p counter_16bit.pcf -P pinmap_qlf_k4n8_umc22.csv -pnr_corner fast

The Timing analysis refer the files report_timing.hold.rpt, report_timing.setup.rpt and top.log inside the build folder

For the counter design below is the timing report from the top.log file:

Hold Worst Negative Slack (hWNS):    0 ns
Hold Total Negative Slack (hTNS):    0 ns
Setup Worst Negative Slack (sWNS):   -2.91 ns
Setup Total Negative Slack (sTNS):   -162.424 ns
Final critical path: 2.91 ns, Fmax:  343.643 MHz

Note

Options : -P, -s, -p, -pnr_corner are only available for QLF_K4N8

Performing the Post-Layout Timing Simulation

Post layout Timing simulation uses the SDF(Standard Delay Format) file.

The testbench for the counter design is present at:
<Install_Path>/quicklogic-arch-defs/share/symbiflow/tests/counter_16bit/

The post-layout design netlist is present at:
<Install_Path>/quicklogic-arch-defs/share/symbiflow/counter_16bit/build/top_post_synthesis.v

The SDF file is present at:
<Install_Path>/quicklogic-qrch-defs/share/symbiflow/counter_16bit/build/top_post_synthesis.sdf

The primitive file library file is present at:
<Install_Path>/quicklogic-arch-defs/share/symbiflow/techmaps/quicklogic/techmaps/<Family>/cells_sim.v

To perform a post-layout simulation:


- Perform a post-layout simulation of the Verilog code use iverilog.
- View the simulation results in the Waveform/ Data Analyzer and verify.

Note

> cells_sim.v : This file has the definition for technology mapped macros
> Supported only for QLF_K4N8

Generate the Programming Files

The technology mapped netlist and packing/placement/routing results produced by VPR contain the information needed to generate a device programming bitstreams. These bitstreams can be used to configure the qlf_k4n8 eFPGA device for validation:

  1. Bitstream File

  2. FourByte File

Bitstream File

This programming file is the binary bitstream file with extension <top module>.bin. It will be generated by default after the PnR run by Symbiflow.

Four Byte File

This programming file is the 4Byte/hex file with extension <top modudule>.bit. It will be generated by default post PnR run by Symbiflow. This file can be used for validating the designs. To run in the test-bench -mode requires changes. Refer README of the test-bench package.

Note

> The programming files are currently supported only for the device QLF_K4N8

PCF Sample

The PCF file is for fix placing the IO to a particular IO location on the device. For qlf_k4n8 device, user needs to create a pin mapping csv (as defined in Pin Mapping section). The user-defined pin names can then be specified in the pcf file for IO placement. Below mentioned CSV file(not part of package) corresponds to a pin-mapping defined for 24x24 device size for qlf_k4n8.

24x24 Device Pin Mapping CSV File

To map the IO’s in the pcf file, refer the below csv file. The column mapped_pin names are used to map in the pcf file. For example if a design has two input ports A_in, B_in and one output port C_out, the pcf file will look like this.

set_io A_in A2F_GPIO2_29
set_io B_in A2F_GPIO2_28
set_io C_out F2A_GPIO2_31
If a user does not provide a pcf file, then one can refer the <design>.place file.
Where mapping from <design>.place file to csv file is as shown:
x -> col
y -> row
subblk -> pin_number
orientation,row,col,pin_num_in_cell,port_name,mapped_pin,GPIO_type
Top,0,23,15,gfpga_pad_IO_F2A[383],F2A_GPIO2_31,
Top,0,23,14,gfpga_pad_IO_F2A[382],F2A_GPIO2_30,
Top,0,23,13,gfpga_pad_IO_F2A[381],F2A_GPIO2_29,
Top,0,23,12,gfpga_pad_IO_F2A[380],F2A_GPIO2_28,
Top,0,23,11,gfpga_pad_IO_A2F[379],A2F_GPIO2_31,
Top,0,23,10,gfpga_pad_IO_A2F[378],A2F_GPIO2_30,
Top,0,23,9,gfpga_pad_IO_A2F[377],A2F_GPIO2_29,
Top,0,23,8,gfpga_pad_IO_A2F[376],A2F_GPIO2_28,
Top,0,22,15,gfpga_pad_IO_F2A[367],F2A_GPIO2_27,
Top,0,22,14,gfpga_pad_IO_F2A[366],F2A_GPIO2_26,
Top,0,22,13,gfpga_pad_IO_F2A[365],F2A_GPIO2_25,
Top,0,22,12,gfpga_pad_IO_F2A[364],F2A_GPIO2_24,
Top,0,22,11,gfpga_pad_IO_A2F[363],A2F_GPIO2_27,
Top,0,22,10,gfpga_pad_IO_A2F[362],A2F_GPIO2_26,
Top,0,22,9,gfpga_pad_IO_A2F[361],A2F_GPIO2_25,
Top,0,22,8,gfpga_pad_IO_A2F[360],A2F_GPIO2_24,
Top,0,21,15,gfpga_pad_IO_F2A[351],F2A_GPIO2_23,
Top,0,21,14,gfpga_pad_IO_F2A[350],F2A_GPIO2_22,
Top,0,21,13,gfpga_pad_IO_F2A[349],F2A_GPIO2_21,
Top,0,21,12,gfpga_pad_IO_F2A[348],F2A_GPIO2_20,
Top,0,21,11,gfpga_pad_IO_A2F[347],A2F_GPIO2_23,
Top,0,21,10,gfpga_pad_IO_A2F[346],A2F_GPIO2_22,
Top,0,21,9,gfpga_pad_IO_A2F[345],A2F_GPIO2_21,
Top,0,21,8,gfpga_pad_IO_A2F[344],A2F_GPIO2_20,
Top,0,21,0,gfpga_pad_IO_A2F[336],A2F_RTC_8KHZ,
Top,0,20,15,gfpga_pad_IO_F2A[335],F2A_GPIO2_19,
Top,0,20,14,gfpga_pad_IO_F2A[334],F2A_GPIO2_18,
Top,0,20,13,gfpga_pad_IO_F2A[333],F2A_GPIO2_17,
Top,0,20,12,gfpga_pad_IO_F2A[332],F2A_GPIO2_16,
Top,0,20,11,gfpga_pad_IO_A2F[331],A2F_GPIO2_19,
Top,0,20,10,gfpga_pad_IO_A2F[330],A2F_GPIO2_18,
Top,0,20,9,gfpga_pad_IO_A2F[329],A2F_GPIO2_17,
Top,0,20,8,gfpga_pad_IO_A2F[328],A2F_GPIO2_16,
Top,0,20,1,gfpga_pad_IO_A2F[321],A2F_USB_CLK_EVENT,
Top,0,20,0,gfpga_pad_IO_F2A[320],F2A_EEC_IN,
Top,0,19,15,gfpga_pad_IO_F2A[319],F2A_GPIO2_15,
Top,0,19,14,gfpga_pad_IO_F2A[318],F2A_GPIO2_14,
Top,0,19,13,gfpga_pad_IO_F2A[317],F2A_GPIO2_13,
Top,0,19,12,gfpga_pad_IO_F2A[316],F2A_GPIO2_12,
Top,0,19,11,gfpga_pad_IO_A2F[315],A2F_GPIO2_15,
Top,0,19,10,gfpga_pad_IO_A2F[314],A2F_GPIO2_14,
Top,0,19,9,gfpga_pad_IO_A2F[313],A2F_GPIO2_13,
Top,0,19,8,gfpga_pad_IO_A2F[312],A2F_GPIO2_12,
Top,0,19,5,gfpga_pad_IO_A2F[309],RFU,
Top,0,19,4,gfpga_pad_IO_A2F[308],RFU,
Top,0,19,3,gfpga_pad_IO_F2A[307],RFU,
Top,0,19,2,gfpga_pad_IO_F2A[306],RFU,
Top,0,19,1,gfpga_pad_IO_A2F[305],A2F_IRQ9_ACK,
Top,0,19,0,gfpga_pad_IO_F2A[304],F2A_IRQ9,
Top,0,18,15,gfpga_pad_IO_F2A[303],F2A_GPIO2_11,
Top,0,18,14,gfpga_pad_IO_F2A[302],F2A_GPIO2_10,
Top,0,18,13,gfpga_pad_IO_F2A[301],F2A_GPIO2_9,
Top,0,18,12,gfpga_pad_IO_F2A[300],F2A_GPIO2_8,
Top,0,18,11,gfpga_pad_IO_A2F[299],A2F_GPIO2_11,
Top,0,18,10,gfpga_pad_IO_A2F[298],A2F_GPIO2_10,
Top,0,18,9,gfpga_pad_IO_A2F[297],A2F_GPIO2_9,
Top,0,18,8,gfpga_pad_IO_A2F[296],A2F_GPIO2_8,
Top,0,18,5,gfpga_pad_IO_F2A[293],F2A_TSC9_EVENT,
Top,0,18,4,gfpga_pad_IO_F2A[292],F2A_TSC8_EVENT,
Top,0,18,3,gfpga_pad_IO_F2A[291],RFU,
Top,0,18,2,gfpga_pad_IO_F2A[290],RFU,
Top,0,18,1,gfpga_pad_IO_A2F[289],A2F_IRQ8_ACK,
Top,0,18,0,gfpga_pad_IO_F2A[288],F2A_IRQ8,
Top,0,17,15,gfpga_pad_IO_F2A[287],F2A_GPIO2_7,
Top,0,17,14,gfpga_pad_IO_F2A[286],F2A_GPIO2_6,
Top,0,17,13,gfpga_pad_IO_F2A[285],F2A_GPIO2_5,
Top,0,17,12,gfpga_pad_IO_F2A[284],F2A_GPIO2_4,
Top,0,17,11,gfpga_pad_IO_A2F[283],A2F_GPIO2_7,
Top,0,17,10,gfpga_pad_IO_A2F[282],A2F_GPIO2_6,
Top,0,17,9,gfpga_pad_IO_A2F[281],A2F_GPIO2_5,
Top,0,17,8,gfpga_pad_IO_A2F[280],A2F_GPIO2_4,
Top,0,17,4,gfpga_pad_IO_F2A[276],F2A_TSC6_EVENT,
Top,0,17,3,gfpga_pad_IO_A2F[275],A2F_GPIO2_WR_ACK,
Top,0,17,2,gfpga_pad_IO_A2F[274],A2F_GPIO2_RD_ACK,
Top,0,17,1,gfpga_pad_IO_A2F[273],A2F_IRQ6_ACK,
Top,0,17,0,gfpga_pad_IO_F2A[272],F2A_IRQ6,
Top,0,16,15,gfpga_pad_IO_F2A[271],F2A_GPIO2_3,
Top,0,16,14,gfpga_pad_IO_F2A[270],F2A_GPIO2_2,
Top,0,16,13,gfpga_pad_IO_F2A[269],F2A_GPIO2_1,
Top,0,16,12,gfpga_pad_IO_F2A[268],F2A_GPIO2_0,
Top,0,16,11,gfpga_pad_IO_A2F[267],A2F_GPIO2_3,
Top,0,16,10,gfpga_pad_IO_A2F[266],A2F_GPIO2_2,
Top,0,16,9,gfpga_pad_IO_A2F[265],A2F_GPIO2_1,
Top,0,16,8,gfpga_pad_IO_A2F[264],A2F_GPIO2_0,
Top,0,16,5,gfpga_pad_IO_F2A[261],F2A_TSC5_EVENT,
Top,0,16,4,gfpga_pad_IO_F2A[260],F2A_TSC4_EVENT,
Top,0,16,3,gfpga_pad_IO_A2F[259],A2F_GPIO2_WR_ACK,
Top,0,16,2,gfpga_pad_IO_A2F[258],A2F_GPIO2_RD_ACK,
Top,0,16,1,gfpga_pad_IO_A2F[257],A2F_IRQ5_ACK,
Top,0,16,0,gfpga_pad_IO_F2A[256],F2A_IRQ5,
Top,0,15,15,gfpga_pad_IO_F2A[255],F2A_GPIO1_31,
Top,0,15,14,gfpga_pad_IO_F2A[254],F2A_GPIO1_30,
Top,0,15,13,gfpga_pad_IO_F2A[253],F2A_GPIO1_29,
Top,0,15,12,gfpga_pad_IO_F2A[252],F2A_GPIO1_28,
Top,0,15,11,gfpga_pad_IO_A2F[251],A2F_GPIO1_31,
Top,0,15,10,gfpga_pad_IO_A2F[250],A2F_GPIO1_30,
Top,0,15,9,gfpga_pad_IO_A2F[249],A2F_GPIO1_29,
Top,0,15,8,gfpga_pad_IO_A2F[248],A2F_GPIO1_28,
Top,0,15,5,gfpga_pad_IO_A2F[245],RFU,
Top,0,15,4,gfpga_pad_IO_A2F[244],RFU,
Top,0,15,3,gfpga_pad_IO_F2A[243],RFU,
Top,0,15,2,gfpga_pad_IO_F2A[242],RFU,
Top,0,15,1,gfpga_pad_IO_F2A[241],F2A_RAM_WE1_HS,
Top,0,15,0,gfpga_pad_IO_F2A[240],F2A_RAM_WE0_HS,
Top,0,14,15,gfpga_pad_IO_F2A[239],F2A_GPIO1_27,
Top,0,14,14,gfpga_pad_IO_F2A[238],F2A_GPIO1_26,
Top,0,14,13,gfpga_pad_IO_F2A[237],F2A_GPIO1_25,
Top,0,14,12,gfpga_pad_IO_F2A[236],F2A_GPIO1_24,
Top,0,14,11,gfpga_pad_IO_A2F[235],A2F_GPIO1_27,
Top,0,14,10,gfpga_pad_IO_A2F[234],A2F_GPIO1_26,
Top,0,14,9,gfpga_pad_IO_A2F[233],A2F_GPIO1_25,
Top,0,14,8,gfpga_pad_IO_A2F[232],A2F_GPIO1_24,
Top,0,14,7,gfpga_pad_IO_F2A[231],F2A_RAM_DATA15_HS,
Top,0,14,6,gfpga_pad_IO_F2A[230],F2A_RAM_DATA14_HS,
Top,0,14,5,gfpga_pad_IO_F2A[229],F2A_RAM_DATA13_HS,
Top,0,14,4,gfpga_pad_IO_F2A[228],F2A_RAM_DATA12_HS,
Top,0,14,3,gfpga_pad_IO_F2A[227],F2A_RAM_DATA11_HS,
Top,0,14,2,gfpga_pad_IO_F2A[226],F2A_RAM_DATA10_HS,
Top,0,14,1,gfpga_pad_IO_F2A[225],F2A_RAM_DATA9_HS,
Top,0,14,0,gfpga_pad_IO_F2A[224],F2A_RAM_DATA8_HS,
Top,0,13,15,gfpga_pad_IO_F2A[223],F2A_GPIO1_23,
Top,0,13,14,gfpga_pad_IO_F2A[222],F2A_GPIO1_22,
Top,0,13,13,gfpga_pad_IO_F2A[221],F2A_GPIO1_21,
Top,0,13,12,gfpga_pad_IO_F2A[220],F2A_GPIO1_20,
Top,0,13,11,gfpga_pad_IO_A2F[219],A2F_GPIO1_23,
Top,0,13,10,gfpga_pad_IO_A2F[218],A2F_GPIO1_22,
Top,0,13,9,gfpga_pad_IO_A2F[217],A2F_GPIO1_21,
Top,0,13,8,gfpga_pad_IO_A2F[216],A2F_GPIO1_20,
Top,0,13,7,gfpga_pad_IO_F2A[215],F2A_RAM_DATA7_HS,
Top,0,13,6,gfpga_pad_IO_F2A[214],F2A_RAM_DATA6_HS,
Top,0,13,5,gfpga_pad_IO_F2A[213],F2A_RAM_DATA5_HS,
Top,0,13,4,gfpga_pad_IO_F2A[212],F2A_RAM_DATA4_HS,
Top,0,13,3,gfpga_pad_IO_F2A[211],F2A_RAM_DATA3_HS,
Top,0,13,2,gfpga_pad_IO_F2A[210],F2A_RAM_DATA2_HS,
Top,0,13,1,gfpga_pad_IO_F2A[209],F2A_RAM_DATA1_HS,
Top,0,13,0,gfpga_pad_IO_F2A[208],F2A_RAM_DATA0_HS,
Top,0,12,15,gfpga_pad_IO_F2A[207],F2A_GPIO1_19,
Top,0,12,14,gfpga_pad_IO_F2A[206],F2A_GPIO1_18,
Top,0,12,13,gfpga_pad_IO_F2A[205],F2A_GPIO1_17,
Top,0,12,12,gfpga_pad_IO_F2A[204],F2A_GPIO1_16,
Top,0,12,11,gfpga_pad_IO_A2F[203],A2F_GPIO1_19,
Top,0,12,10,gfpga_pad_IO_A2F[202],A2F_GPIO1_18,
Top,0,12,9,gfpga_pad_IO_A2F[201],A2F_GPIO1_17,
Top,0,12,8,gfpga_pad_IO_A2F[200],A2F_GPIO1_16,
Top,0,12,6,gfpga_pad_IO_F2A[198],F2A_RAM_ADDR14_HS,
Top,0,12,5,gfpga_pad_IO_F2A[197],F2A_RAM_ADDR13_HS,
Top,0,12,4,gfpga_pad_IO_F2A[196],F2A_RAM_ADDR12_HS,
Top,0,12,3,gfpga_pad_IO_F2A[195],F2A_RAM_ADDR11_HS,
Top,0,12,2,gfpga_pad_IO_F2A[194],F2A_RAM_ADDR10_HS,
Top,0,12,1,gfpga_pad_IO_F2A[193],F2A_RAM_ADDR9_HS,
Top,0,12,0,gfpga_pad_IO_F2A[192],F2A_RAM_ADDR8_HS,
Top,0,11,15,gfpga_pad_IO_F2A[191],F2A_GPIO1_15,
Top,0,11,14,gfpga_pad_IO_F2A[190],F2A_GPIO1_14,
Top,0,11,13,gfpga_pad_IO_F2A[189],F2A_GPIO1_13,
Top,0,11,12,gfpga_pad_IO_F2A[188],F2A_GPIO1_12,
Top,0,11,11,gfpga_pad_IO_A2F[187],A2F_GPIO1_15,
Top,0,11,10,gfpga_pad_IO_A2F[186],A2F_GPIO1_14,
Top,0,11,9,gfpga_pad_IO_A2F[185],A2F_GPIO1_13,
Top,0,11,8,gfpga_pad_IO_A2F[184],A2F_GPIO1_12,
Top,0,11,7,gfpga_pad_IO_F2A[183],F2A_RAM_ADDR7_HS,
Top,0,11,6,gfpga_pad_IO_F2A[182],F2A_RAM_ADDR6_HS,
Top,0,11,5,gfpga_pad_IO_F2A[181],F2A_RAM_ADDR5_HS,
Top,0,11,4,gfpga_pad_IO_F2A[180],F2A_RAM_ADDR4_HS,
Top,0,11,3,gfpga_pad_IO_F2A[179],F2A_RAM_ADDR3_HS,
Top,0,11,2,gfpga_pad_IO_F2A[178],F2A_RAM_ADDR2_HS,
Top,0,11,1,gfpga_pad_IO_F2A[177],F2A_RAM_ADDR1_HS,
Top,0,11,0,gfpga_pad_IO_F2A[176],F2A_RAM_CE_HS,
Top,0,10,15,gfpga_pad_IO_F2A[175],F2A_GPIO1_11,
Top,0,10,14,gfpga_pad_IO_F2A[174],F2A_GPIO1_10,
Top,0,10,13,gfpga_pad_IO_F2A[173],F2A_GPIO1_9,
Top,0,10,12,gfpga_pad_IO_F2A[172],F2A_GPIO1_8,
Top,0,10,11,gfpga_pad_IO_A2F[171],A2F_GPIO1_11,
Top,0,10,10,gfpga_pad_IO_A2F[170],A2F_GPIO1_10,
Top,0,10,9,gfpga_pad_IO_A2F[169],A2F_GPIO1_9,
Top,0,10,8,gfpga_pad_IO_A2F[168],A2F_GPIO1_8,
Top,0,10,7,gfpga_pad_IO_A2F[167],A2F_RAM_DATA7_HS,
Top,0,10,6,gfpga_pad_IO_A2F[166],A2F_RAM_DATA6_HS,
Top,0,10,5,gfpga_pad_IO_A2F[165],A2F_RAM_DATA5_HS,
Top,0,10,4,gfpga_pad_IO_A2F[164],A2F_RAM_DATA4_HS,
Top,0,10,3,gfpga_pad_IO_A2F[163],A2F_RAM_DATA3_HS,
Top,0,10,2,gfpga_pad_IO_A2F[162],A2F_RAM_DATA2_HS,
Top,0,10,1,gfpga_pad_IO_A2F[161],A2F_RAM_DATA1_HS,
Top,0,10,0,gfpga_pad_IO_A2F[160],A2F_RAM_DATA0_HS,
Top,0,9,15,gfpga_pad_IO_F2A[159],F2A_GPIO1_7,
Top,0,9,14,gfpga_pad_IO_F2A[158],F2A_GPIO1_6,
Top,0,9,13,gfpga_pad_IO_F2A[157],F2A_GPIO1_5,
Top,0,9,12,gfpga_pad_IO_F2A[156],F2A_GPIO1_4,
Top,0,9,11,gfpga_pad_IO_A2F[155],A2F_GPIO1_7,
Top,0,9,10,gfpga_pad_IO_A2F[154],A2F_GPIO1_6,
Top,0,9,9,gfpga_pad_IO_A2F[153],A2F_GPIO1_5,
Top,0,9,8,gfpga_pad_IO_A2F[152],A2F_GPIO1_4,
Top,0,9,7,gfpga_pad_IO_A2F[151],A2F_RAM_DATA15_HS,
Top,0,9,6,gfpga_pad_IO_A2F[150],A2F_RAM_DATA14_HS,
Top,0,9,5,gfpga_pad_IO_A2F[149],A2F_RAM_DATA13_HS,
Top,0,9,4,gfpga_pad_IO_A2F[148],A2F_RAM_DATA12_HS,
Top,0,9,3,gfpga_pad_IO_A2F[147],A2F_RAM_DATA11_HS,
Top,0,9,2,gfpga_pad_IO_A2F[146],A2F_RAM_DATA10_HS,
Top,0,9,1,gfpga_pad_IO_A2F[145],A2F_RAM_DATA9_HS,
Top,0,9,0,gfpga_pad_IO_A2F[144],A2F_RAM_DATA8_HS,
Top,0,8,15,gfpga_pad_IO_F2A[143],F2A_GPIO1_3,
Top,0,8,14,gfpga_pad_IO_F2A[142],F2A_GPIO1_2,
Top,0,8,13,gfpga_pad_IO_F2A[141],F2A_GPIO1_1,
Top,0,8,12,gfpga_pad_IO_F2A[140],F2A_GPIO1_0,
Top,0,8,11,gfpga_pad_IO_A2F[139],A2F_GPIO1_3,
Top,0,8,10,gfpga_pad_IO_A2F[138],A2F_GPIO1_2,
Top,0,8,9,gfpga_pad_IO_A2F[137],A2F_GPIO1_1,
Top,0,8,8,gfpga_pad_IO_A2F[136],A2F_GPIO1_0,
Top,0,8,5,gfpga_pad_IO_F2A[133],F2A_TSC3_EVENT,
Top,0,8,4,gfpga_pad_IO_F2A[132],F2A_TSC2_EVENT,
Top,0,8,3,gfpga_pad_IO_A2F[131],A2F_GPIO0_WR_ACK,
Top,0,8,2,gfpga_pad_IO_A2F[130],A2F_GPIO0_RD_ACK,
Top,0,8,1,gfpga_pad_IO_A2F[129],A2F_IRQ4_ACK,
Top,0,8,0,gfpga_pad_IO_F2A[128],F2A_IRQ4,
Top,0,7,15,gfpga_pad_IO_F2A[127],F2A_GPIO0_31,
Top,0,7,14,gfpga_pad_IO_F2A[126],F2A_GPIO0_30,
Top,0,7,13,gfpga_pad_IO_F2A[125],F2A_GPIO0_29,
Top,0,7,12,gfpga_pad_IO_F2A[124],F2A_GPIO0_28,
Top,0,7,11,gfpga_pad_IO_A2F[123],A2F_GPIO0_31,
Top,0,7,10,gfpga_pad_IO_A2F[122],A2F_GPIO0_30,
Top,0,7,9,gfpga_pad_IO_A2F[121],A2F_GPIO0_29,
Top,0,7,8,gfpga_pad_IO_A2F[120],A2F_GPIO0_28,
Top,0,7,5,gfpga_pad_IO_F2A[117],F2A_TSC1_EVENT,
Top,0,7,4,gfpga_pad_IO_F2A[116],F2A_TSC0_EVENT,
Top,0,7,3,gfpga_pad_IO_A2F[115],A2F_GPIO1_WR_ACK,
Top,0,7,2,gfpga_pad_IO_A2F[114],A2F_GPIO1_RD_ACK,
Top,0,7,1,gfpga_pad_IO_A2F[113],A2F_IRQ3_ACK,
Top,0,7,0,gfpga_pad_IO_F2A[112],F2A_IRQ3,
Top,0,6,15,gfpga_pad_IO_F2A[111],F2A_GPIO0_27,
Top,0,6,14,gfpga_pad_IO_F2A[110],F2A_GPIO0_26,
Top,0,6,13,gfpga_pad_IO_F2A[109],F2A_GPIO0_25,
Top,0,6,12,gfpga_pad_IO_F2A[108],F2A_GPIO0_24,
Top,0,6,11,gfpga_pad_IO_A2F[107],A2F_GPIO0_27,
Top,0,6,10,gfpga_pad_IO_A2F[106],A2F_GPIO0_26,
Top,0,6,9,gfpga_pad_IO_A2F[105],A2F_GPIO0_25,
Top,0,6,8,gfpga_pad_IO_A2F[104],A2F_GPIO0_24,
Top,0,6,5,gfpga_pad_IO_A2F[101],RFU,
Top,0,6,4,gfpga_pad_IO_A2F[100],RFU,
Top,0,6,3,gfpga_pad_IO_F2A[99],RFU,
Top,0,6,2,gfpga_pad_IO_F2A[98],RFU,
Top,0,6,1,gfpga_pad_IO_A2F[97],A2F_IRQ2_ACK,
Top,0,6,0,gfpga_pad_IO_F2A[96],F2A_IRQ2,
Top,0,5,15,gfpga_pad_IO_F2A[95],F2A_GPIO0_23,
Top,0,5,14,gfpga_pad_IO_F2A[94],F2A_GPIO0_22,
Top,0,5,13,gfpga_pad_IO_F2A[93],F2A_GPIO0_21,
Top,0,5,12,gfpga_pad_IO_F2A[92],F2A_GPIO0_20,
Top,0,5,11,gfpga_pad_IO_A2F[91],A2F_GPIO0_23,
Top,0,5,10,gfpga_pad_IO_A2F[90],A2F_GPIO0_22,
Top,0,5,9,gfpga_pad_IO_A2F[89],A2F_GPIO0_21,
Top,0,5,8,gfpga_pad_IO_A2F[88],A2F_GPIO0_20,
Top,0,5,5,gfpga_pad_IO_A2F[85],RFU,
Top,0,5,4,gfpga_pad_IO_A2F[84],RFU,
Top,0,5,3,gfpga_pad_IO_F2A[83],RFU,
Top,0,5,2,gfpga_pad_IO_F2A[82],RFU,
Top,0,5,1,gfpga_pad_IO_A2F[81],A2F_IRQ1_ACK,
Top,0,5,0,gfpga_pad_IO_F2A[80],F2A_IRQ1,
Top,0,4,15,gfpga_pad_IO_F2A[79],F2A_GPIO0_19,
Top,0,4,14,gfpga_pad_IO_F2A[78],F2A_GPIO0_18,
Top,0,4,13,gfpga_pad_IO_F2A[77],F2A_GPIO0_17,
Top,0,4,12,gfpga_pad_IO_F2A[76],F2A_GPIO0_16,
Top,0,4,11,gfpga_pad_IO_A2F[75],A2F_GPIO0_19,
Top,0,4,10,gfpga_pad_IO_A2F[74],A2F_GPIO0_18,
Top,0,4,9,gfpga_pad_IO_A2F[73],A2F_GPIO0_17,
Top,0,4,8,gfpga_pad_IO_A2F[72],A2F_GPIO0_16,
Top,0,4,1,gfpga_pad_IO_A2F[65],A2F_IRQ0_ACK,
Top,0,4,0,gfpga_pad_IO_F2A[64],F2A_IRQ0,
Top,0,3,15,gfpga_pad_IO_F2A[63],F2A_GPIO0_15,
Top,0,3,14,gfpga_pad_IO_F2A[62],F2A_GPIO0_14,
Top,0,3,13,gfpga_pad_IO_F2A[61],F2A_GPIO0_13,
Top,0,3,12,gfpga_pad_IO_F2A[60],F2A_GPIO0_12,
Top,0,3,11,gfpga_pad_IO_A2F[59],A2F_GPIO0_15,
Top,0,3,10,gfpga_pad_IO_A2F[58],A2F_GPIO0_14,
Top,0,3,9,gfpga_pad_IO_A2F[57],A2F_GPIO0_13,
Top,0,3,8,gfpga_pad_IO_A2F[56],A2F_GPIO0_12,
Top,0,3,0,gfpga_pad_IO_A2F[48],A2F_GLOBAL_MUTE,
Top,0,2,15,gfpga_pad_IO_F2A[47],F2A_GPIO0_11,
Top,0,2,14,gfpga_pad_IO_F2A[46],F2A_GPIO0_10,
Top,0,2,13,gfpga_pad_IO_F2A[45],F2A_GPIO0_9,
Top,0,2,12,gfpga_pad_IO_F2A[44],F2A_GPIO0_8,
Top,0,2,11,gfpga_pad_IO_A2F[43],A2F_GPIO0_11,
Top,0,2,10,gfpga_pad_IO_A2F[42],A2F_GPIO0_10,
Top,0,2,9,gfpga_pad_IO_A2F[41],A2F_GPIO0_9,
Top,0,2,8,gfpga_pad_IO_A2F[40],A2F_GPIO0_8,
Top,0,2,0,gfpga_pad_IO_F2A[32],F2A_LB_CLK_T,
Top,0,1,15,gfpga_pad_IO_F2A[31],F2A_GPIO0_7,
Top,0,1,14,gfpga_pad_IO_F2A[30],F2A_GPIO0_6,
Top,0,1,13,gfpga_pad_IO_F2A[29],F2A_GPIO0_5,
Top,0,1,12,gfpga_pad_IO_F2A[28],F2A_GPIO0_4,
Top,0,1,11,gfpga_pad_IO_A2F[27],A2F_GPIO0_7,
Top,0,1,10,gfpga_pad_IO_A2F[26],A2F_GPIO0_6,
Top,0,1,9,gfpga_pad_IO_A2F[25],A2F_GPIO0_5,
Top,0,1,8,gfpga_pad_IO_A2F[24],A2F_GPIO0_4,
Top,0,0,15,gfpga_pad_IO_F2A[15],F2A_GPIO0_3,
Top,0,0,14,gfpga_pad_IO_F2A[14],F2A_GPIO0_2,
Top,0,0,13,gfpga_pad_IO_F2A[13],F2A_GPIO0_1,
Top,0,0,12,gfpga_pad_IO_F2A[12],F2A_GPIO0_0,
Top,0,0,11,gfpga_pad_IO_A2F[11],A2F_GPIO0_3,
Top,0,0,10,gfpga_pad_IO_A2F[10],A2F_GPIO0_2,
Top,0,0,9,gfpga_pad_IO_A2F[9],A2F_GPIO0_1,
Top,0,0,8,gfpga_pad_IO_A2F[8],A2F_GPIO0_0,
Right,20,24,2,gfpga_pad_IO_A2F[706],P2F_GPIO112_IN,
Right,20,24,1,gfpga_pad_IO_F2A[705],F2P_GPIO112_OUT,
Right,20,24,0,gfpga_pad_IO_F2A[704],F2P_GPIO112_OE,
Right,19,24,6,gfpga_pad_IO_A2F[694],P2F_GPIO113_IN,
Right,19,24,5,gfpga_pad_IO_F2A[693],F2P_GPIO113_OUT,
Right,19,24,4,gfpga_pad_IO_F2A[692],F2P_GPIO113_OE,
Right,19,24,2,gfpga_pad_IO_A2F[690],P2F_GPIO114_IN,
Right,19,24,1,gfpga_pad_IO_F2A[689],F2P_GPIO114_OUT,
Right,19,24,0,gfpga_pad_IO_F2A[688],F2P_GPIO114_OE,
Right,18,24,6,gfpga_pad_IO_A2F[678],P2F_GPIO115_IN,
Right,18,24,5,gfpga_pad_IO_F2A[677],F2P_GPIO115_OUT,
Right,18,24,4,gfpga_pad_IO_F2A[676],F2P_GPIO115_OE,
Right,18,24,2,gfpga_pad_IO_A2F[674],P2F_GPIO116_IN,
Right,18,24,1,gfpga_pad_IO_F2A[673],F2P_GPIO116_OUT,
Right,18,24,0,gfpga_pad_IO_F2A[672],F2P_GPIO116_OE,
Right,17,24,14,gfpga_pad_IO_A2F[670],RFU,
Right,17,24,13,gfpga_pad_IO_F2A[669],RFU,
Right,17,24,12,gfpga_pad_IO_F2A[668],RFU,
Right,17,24,10,gfpga_pad_IO_A2F[666],RFU,
Right,17,24,9,gfpga_pad_IO_F2A[665],RFU,
Right,17,24,8,gfpga_pad_IO_F2A[664],RFU,
Right,17,24,6,gfpga_pad_IO_A2F[662],P2F_GPIO117_IN,
Right,17,24,5,gfpga_pad_IO_F2A[661],F2P_GPIO117_OUT,
Right,17,24,4,gfpga_pad_IO_F2A[660],F2P_GPIO117_OE,
Right,17,24,2,gfpga_pad_IO_A2F[658],P2F_GPIO118_IN,
Right,17,24,1,gfpga_pad_IO_F2A[657],F2P_GPIO118_OUT,
Right,17,24,0,gfpga_pad_IO_F2A[656],F2P_GPIO118_OE,
Right,16,24,14,gfpga_pad_IO_A2F[654],RFU,
Right,16,24,13,gfpga_pad_IO_F2A[653],RFU,
Right,16,24,12,gfpga_pad_IO_F2A[652],RFU,
Right,16,24,10,gfpga_pad_IO_A2F[650],RFU,
Right,16,24,9,gfpga_pad_IO_F2A[649],RFU,
Right,16,24,8,gfpga_pad_IO_F2A[648],RFU,
Right,16,24,6,gfpga_pad_IO_A2F[646],P2F_GPIO119_IN,
Right,16,24,5,gfpga_pad_IO_F2A[645],F2P_GPIO119_OUT,
Right,16,24,4,gfpga_pad_IO_F2A[644],F2P_GPIO119_OE,
Right,16,24,2,gfpga_pad_IO_A2F[642],P2F_GPIO120_IN,
Right,16,24,1,gfpga_pad_IO_F2A[641],F2P_GPIO120_OUT,
Right,16,24,0,gfpga_pad_IO_F2A[640],F2P_GPIO120_OE,
Right,15,24,14,gfpga_pad_IO_A2F[638],P2F_GPIO121_IN,
Right,15,24,13,gfpga_pad_IO_F2A[637],F2P_GPIO121_OUT,
Right,15,24,12,gfpga_pad_IO_F2A[636],F2P_GPIO121_OE,
Right,15,24,10,gfpga_pad_IO_A2F[634],P2F_GPIO122_IN,
Right,15,24,9,gfpga_pad_IO_F2A[633],F2P_GPIO122_OUT,
Right,15,24,8,gfpga_pad_IO_F2A[632],F2P_GPIO122_OE,
Right,15,24,6,gfpga_pad_IO_A2F[630],P2F_GPIO123_IN,
Right,15,24,5,gfpga_pad_IO_F2A[629],F2P_GPIO123_OUT,
Right,15,24,4,gfpga_pad_IO_F2A[628],F2P_GPIO123_OE,
Right,15,24,2,gfpga_pad_IO_A2F[626],P2F_GPIO124_IN,
Right,15,24,1,gfpga_pad_IO_F2A[625],F2P_GPIO124_OUT,
Right,15,24,0,gfpga_pad_IO_F2A[624],F2P_GPIO124_OE,
Right,14,24,14,gfpga_pad_IO_A2F[622],P2F_GPIO125_IN,
Right,14,24,13,gfpga_pad_IO_F2A[621],F2P_GPIO125_OUT,
Right,14,24,12,gfpga_pad_IO_F2A[620],F2P_GPIO125_OE,
Right,14,24,10,gfpga_pad_IO_A2F[618],P2F_GPIO126_IN,
Right,14,24,9,gfpga_pad_IO_F2A[617],F2P_GPIO126_OUT,
Right,14,24,8,gfpga_pad_IO_F2A[616],F2P_GPIO126_OE,
Right,14,24,6,gfpga_pad_IO_A2F[614],P2F_GPIO127_IN,
Right,14,24,5,gfpga_pad_IO_F2A[613],F2P_GPIO127_OUT,
Right,14,24,4,gfpga_pad_IO_F2A[612],F2P_GPIO127_OE,
Right,14,24,2,gfpga_pad_IO_A2F[610],P2F_GPIO128_IN,
Right,14,24,1,gfpga_pad_IO_F2A[609],F2P_GPIO128_OUT,
Right,14,24,0,gfpga_pad_IO_F2A[608],F2P_GPIO128_OE,
Right,13,24,14,gfpga_pad_IO_A2F[606],P2F_GPIO129_IN,
Right,13,24,13,gfpga_pad_IO_F2A[605],F2P_GPIO129_OUT,
Right,13,24,12,gfpga_pad_IO_F2A[604],F2P_GPIO129_OE,
Right,13,24,10,gfpga_pad_IO_A2F[602],P2F_GPIO130_IN,
Right,13,24,9,gfpga_pad_IO_F2A[601],F2P_GPIO130_OUT,
Right,13,24,8,gfpga_pad_IO_F2A[600],F2P_GPIO130_OE,
Right,13,24,6,gfpga_pad_IO_A2F[598],P2F_GPIO131_IN,
Right,13,24,5,gfpga_pad_IO_F2A[597],F2P_GPIO131_OUT,
Right,13,24,4,gfpga_pad_IO_F2A[596],F2P_GPIO131_OE,
Right,13,24,2,gfpga_pad_IO_A2F[594],P2F_GPIO132_IN,
Right,13,24,1,gfpga_pad_IO_F2A[593],F2P_GPIO132_OUT,
Right,13,24,0,gfpga_pad_IO_F2A[592],F2P_GPIO132_OE,
Right,12,24,14,gfpga_pad_IO_A2F[590],P2F_GPIO133_IN,
Right,12,24,13,gfpga_pad_IO_F2A[589],F2P_GPIO133_OUT,
Right,12,24,12,gfpga_pad_IO_F2A[588],F2P_GPIO133_OE,
Right,12,24,10,gfpga_pad_IO_A2F[586],P2F_GPIO134_IN,
Right,12,24,9,gfpga_pad_IO_F2A[585],F2P_GPIO134_OUT,
Right,12,24,8,gfpga_pad_IO_F2A[584],F2P_GPIO134_OE,
Right,12,24,6,gfpga_pad_IO_A2F[582],P2F_AES0_RX_IN,
Right,12,24,5,gfpga_pad_IO_F2A[581],F2P_AES0_RX_OUT,
Right,12,24,4,gfpga_pad_IO_F2A[580],F2P_AES0_RX_OE,
Right,12,24,2,gfpga_pad_IO_A2F[578],P2F_AES0_TX_IN,
Right,12,24,1,gfpga_pad_IO_F2A[577],F2P_AES0_TX_OUT,
Right,12,24,0,gfpga_pad_IO_F2A[576],F2P_AES0_TX_OE,
Right,11,24,14,gfpga_pad_IO_A2F[574],P2F_AES1_RX_IN,
Right,11,24,13,gfpga_pad_IO_F2A[573],F2P_AES1_RX_OUT,
Right,11,24,12,gfpga_pad_IO_F2A[572],F2P_AES1_RX_OE,
Right,11,24,10,gfpga_pad_IO_A2F[570],P2F_AES1_TX_IN,
Right,11,24,9,gfpga_pad_IO_F2A[569],F2P_AES1_TX_OUT,
Right,11,24,8,gfpga_pad_IO_F2A[568],F2P_AES1_TX_OE,
Right,11,24,6,gfpga_pad_IO_A2F[566],P2F_AES2_RX_IN,
Right,11,24,5,gfpga_pad_IO_F2A[565],F2P_AES2_RX_OUT,
Right,11,24,4,gfpga_pad_IO_F2A[564],F2P_AES2_RX_OE,
Right,11,24,2,gfpga_pad_IO_A2F[562],P2F_AES2_TX_IN,
Right,11,24,1,gfpga_pad_IO_F2A[561],F2P_AES2_TX_OUT,
Right,11,24,0,gfpga_pad_IO_F2A[560],F2P_AES2_TX_OE,
Right,10,24,14,gfpga_pad_IO_A2F[558],P2F_AES3_RX_IN,
Right,10,24,13,gfpga_pad_IO_F2A[557],F2P_AES3_RX_OUT,
Right,10,24,12,gfpga_pad_IO_F2A[556],F2P_AES3_RX_OE,
Right,10,24,10,gfpga_pad_IO_A2F[554],P2F_AES3_TX_IN,
Right,10,24,9,gfpga_pad_IO_F2A[553],F2P_AES3_TX_OUT,
Right,10,24,8,gfpga_pad_IO_F2A[552],F2P_AES3_TX_OE,
Right,10,24,6,gfpga_pad_IO_A2F[550],P2F_I2C_1_SDA_IN,
Right,10,24,5,gfpga_pad_IO_F2A[549],F2P_I2C_1_SDA_OUT,
Right,10,24,4,gfpga_pad_IO_F2A[548],F2P_I2C_1_SDA_OE,
Right,10,24,2,gfpga_pad_IO_A2F[546],P2F_I2C_1_SCL_IN,
Right,10,24,1,gfpga_pad_IO_F2A[545],F2P_I2C_1_SCL_OUT,
Right,10,24,0,gfpga_pad_IO_F2A[544],F2P_I2C_1_SCL_OE,
Right,9,24,14,gfpga_pad_IO_A2F[542],P2F_WCLKO_IN,
Right,9,24,13,gfpga_pad_IO_F2A[541],F2P_WCLKO_OUT,
Right,9,24,12,gfpga_pad_IO_F2A[540],F2P_WCLKO_OE,
Right,9,24,10,gfpga_pad_IO_A2F[538],P2F_WCLKI_IN,
Right,9,24,9,gfpga_pad_IO_F2A[537],F2P_WCLKI_OUT,
Right,9,24,8,gfpga_pad_IO_F2A[536],F2P_WCLKI_OE,
Right,9,24,6,gfpga_pad_IO_A2F[534],P2F_I2C_G_SDA_IN,
Right,9,24,5,gfpga_pad_IO_F2A[533],F2P_I2C_G_SDA_OUT,
Right,9,24,4,gfpga_pad_IO_F2A[532],F2P_I2C_G_SDA_OE,
Right,9,24,2,gfpga_pad_IO_A2F[530],P2F_I2C_G_SCL_IN,
Right,9,24,1,gfpga_pad_IO_F2A[529],F2P_I2C_G_SCL_OUT,
Right,9,24,0,gfpga_pad_IO_F2A[528],F2P_I2C_G_SCL_OE,
Right,8,24,14,gfpga_pad_IO_A2F[526],P2F_SPI_M_MISO_IN,
Right,8,24,13,gfpga_pad_IO_F2A[525],F2P_SPI_M_MISO_OUT,
Right,8,24,12,gfpga_pad_IO_F2A[524],F2P_SPI_M_MISO_OE,
Right,8,24,10,gfpga_pad_IO_A2F[522],P2F_SPI_M_MOSI_IN,
Right,8,24,9,gfpga_pad_IO_F2A[521],F2P_SPI_M_MOSI_OUT,
Right,8,24,8,gfpga_pad_IO_F2A[520],F2P_SPI_M_MOSI_OE,
Right,8,24,6,gfpga_pad_IO_A2F[518],P2F_SPI_M_CLK_IN,
Right,8,24,5,gfpga_pad_IO_F2A[517],F2P_SPI_M_CLK_OUT,
Right,8,24,4,gfpga_pad_IO_F2A[516],F2P_SPI_M_CLK_OE,
Right,8,24,2,gfpga_pad_IO_A2F[514],P2F_SPI_M_CS_B_IN,
Right,8,24,1,gfpga_pad_IO_F2A[513],F2P_SPI_M_CS_B_OUT,
Right,8,24,0,gfpga_pad_IO_F2A[512],F2P_SPI_M_CS_B_OE,
Right,7,24,14,gfpga_pad_IO_A2F[510],RFU,
Right,7,24,13,gfpga_pad_IO_F2A[509],RFU,
Right,7,24,12,gfpga_pad_IO_F2A[508],RFU,
Right,7,24,10,gfpga_pad_IO_A2F[506],P2F_SPI_S_CS_B_IN,
Right,7,24,9,gfpga_pad_IO_F2A[505],F2P_SPI_S_CS_B_OUT,
Right,7,24,8,gfpga_pad_IO_F2A[504],F2P_SPI_S_CS_B_OE,
Right,7,24,6,gfpga_pad_IO_A2F[502],P2F_SPI_S_MISO_IN,
Right,7,24,5,gfpga_pad_IO_F2A[501],F2P_SPI_S_MISO_OUT,
Right,7,24,4,gfpga_pad_IO_F2A[500],F2P_SPI_S_MISO_OE,
Right,7,24,2,gfpga_pad_IO_A2F[498],P2F_SPI_S_MOSI_IN,
Right,7,24,1,gfpga_pad_IO_F2A[497],F2P_SPI_S_MOSI_OUT,
Right,7,24,0,gfpga_pad_IO_F2A[496],F2P_SPI_S_MOSI_OE,
Right,6,24,14,gfpga_pad_IO_A2F[494],RFU,
Right,6,24,13,gfpga_pad_IO_F2A[493],RFU,
Right,6,24,12,gfpga_pad_IO_F2A[492],RFU,
Right,6,24,10,gfpga_pad_IO_A2F[490],RFU,
Right,6,24,9,gfpga_pad_IO_A2F[489],RFU,
Right,6,24,8,gfpga_pad_IO_A2F[488],RFU,
Right,6,24,6,gfpga_pad_IO_A2F[486],P2F_SPI_S_CLK_IN,
Right,6,24,5,gfpga_pad_IO_F2A[485],F2P_SPI_S_CLK_OUT,
Right,6,24,4,gfpga_pad_IO_F2A[484],F2P_SPI_S_CLK_OE,
Right,6,24,0,gfpga_pad_IO_F2A[480],F2A_LB_CLK_R,
Right,5,24,6,gfpga_pad_IO_A2F[470],P2F_UART_B_RX_IN,
Right,5,24,5,gfpga_pad_IO_F2A[469],F2P_UART_B_RX_OUT,
Right,5,24,4,gfpga_pad_IO_F2A[468],F2P_UART_B_RX_OE,
Right,5,24,2,gfpga_pad_IO_A2F[466],P2F_UART_B_TX_IN,
Right,5,24,1,gfpga_pad_IO_F2A[465],F2P_UART_B_TX_OUT,
Right,5,24,0,gfpga_pad_IO_F2A[464],F2P_UART_B_TX_OE,
Right,4,24,6,gfpga_pad_IO_A2F[454],P2F_MIDI_RX_IN,
Right,4,24,5,gfpga_pad_IO_F2A[453],F2P_MIDI_RX_OUT,
Right,4,24,4,gfpga_pad_IO_F2A[452],F2P_MIDI_RX_OE,
Right,4,24,2,gfpga_pad_IO_A2F[450],P2F_MIDI_TX_IN,
Right,4,24,1,gfpga_pad_IO_F2A[449],F2P_MIDI_TX_OUT,
Right,4,24,0,gfpga_pad_IO_F2A[448],F2P_MIDI_TX_OE,
Bottom,24,21,6,gfpga_pad_IO_A2F[1110],RFU,
Bottom,24,21,5,gfpga_pad_IO_F2A[1109],RFU,
Bottom,24,21,4,gfpga_pad_IO_F2A[1108],RFU,
Bottom,24,21,2,gfpga_pad_IO_A2F[1106],RFU,
Bottom,24,21,1,gfpga_pad_IO_F2A[1105],RFU,
Bottom,24,21,0,gfpga_pad_IO_F2A[1104],RFU,
Bottom,24,20,6,gfpga_pad_IO_A2F[1094],RFU,
Bottom,24,20,5,gfpga_pad_IO_F2A[1093],RFU,
Bottom,24,20,4,gfpga_pad_IO_F2A[1092],RFU,
Bottom,24,20,2,gfpga_pad_IO_A2F[1090],RFU,
Bottom,24,20,1,gfpga_pad_IO_F2A[1089],RFU,
Bottom,24,20,0,gfpga_pad_IO_F2A[1088],RFU,
Bottom,24,19,14,gfpga_pad_IO_A2F[1086],P2F_EEC_IN,
Bottom,24,19,13,gfpga_pad_IO_F2A[1085],F2P_EEC_OUT,
Bottom,24,19,12,gfpga_pad_IO_F2A[1084],F2P_EEC_OE,
Bottom,24,19,10,gfpga_pad_IO_A2F[1082],P2F_GPIO111_IN,
Bottom,24,19,9,gfpga_pad_IO_F2A[1081],F2P_GPIO111_OUT,
Bottom,24,19,8,gfpga_pad_IO_F2A[1080],F2P_GPIO111_OE,
Bottom,24,19,6,gfpga_pad_IO_A2F[1078],P2F_IXS0_SDI_IN,
Bottom,24,19,5,gfpga_pad_IO_F2A[1077],F2P_IXS0_SDI_OUT,
Bottom,24,19,4,gfpga_pad_IO_F2A[1076],F2P_IXS0_SDI_OE,
Bottom,24,19,2,gfpga_pad_IO_A2F[1074],P2F_IXS0_SDO_IN,
Bottom,24,19,1,gfpga_pad_IO_F2A[1073],F2P_IXS0_SDO_OUT,
Bottom,24,19,0,gfpga_pad_IO_F2A[1072],F2P_IXS0_SDO_OE,
Bottom,24,18,14,gfpga_pad_IO_A2F[1070],P2F_IXS1_SDI_IN,
Bottom,24,18,13,gfpga_pad_IO_F2A[1069],F2P_IXS1_SDI_OUT,
Bottom,24,18,12,gfpga_pad_IO_F2A[1068],F2P_IXS1_SDI_OE,
Bottom,24,18,10,gfpga_pad_IO_A2F[1066],P2F_IXS1_SDO_IN,
Bottom,24,18,9,gfpga_pad_IO_F2A[1065],F2P_IXS1_SDO_OUT,
Bottom,24,18,8,gfpga_pad_IO_F2A[1064],F2P_IXS1_SDO_OE,
Bottom,24,18,6,gfpga_pad_IO_A2F[1062],P2F_IXS2_SDI_IN,
Bottom,24,18,5,gfpga_pad_IO_F2A[1061],F2P_IXS2_SDI_OUT,
Bottom,24,18,4,gfpga_pad_IO_F2A[1060],F2P_IXS2_SDI_OE,
Bottom,24,18,2,gfpga_pad_IO_A2F[1058],P2F_IXS2_SDO_IN,
Bottom,24,18,1,gfpga_pad_IO_F2A[1057],F2P_IXS2_SDO_OUT,
Bottom,24,18,0,gfpga_pad_IO_F2A[1056],F2P_IXS2_SDO_OE,
Bottom,24,17,14,gfpga_pad_IO_A2F[1054],P2F_IXS3_SDI_IN,
Bottom,24,17,13,gfpga_pad_IO_F2A[1053],F2P_IXS3_SDI_OUT,
Bottom,24,17,12,gfpga_pad_IO_F2A[1052],F2P_IXS3_SDI_OE,
Bottom,24,17,10,gfpga_pad_IO_A2F[1050],P2F_IXS3_SDO_IN,
Bottom,24,17,9,gfpga_pad_IO_F2A[1049],F2P_IXS3_SDO_OUT,
Bottom,24,17,8,gfpga_pad_IO_F2A[1048],F2P_IXS3_SDO_OE,
Bottom,24,17,6,gfpga_pad_IO_A2F[1046],P2F_IXS4_SDI_IN,
Bottom,24,17,5,gfpga_pad_IO_F2A[1045],F2P_IXS4_SDI_OUT,
Bottom,24,17,4,gfpga_pad_IO_F2A[1044],F2P_IXS4_SDI_OE,
Bottom,24,17,2,gfpga_pad_IO_A2F[1042],P2F_IXS4_SDO_IN,
Bottom,24,17,1,gfpga_pad_IO_F2A[1041],F2P_IXS4_SDO_OUT,
Bottom,24,17,0,gfpga_pad_IO_F2A[1040],F2P_IXS4_SDO_OE,
Bottom,24,16,14,gfpga_pad_IO_A2F[1038],P2F_IXS5_SDI_IN,
Bottom,24,16,13,gfpga_pad_IO_F2A[1037],F2P_IXS5_SDI_OUT,
Bottom,24,16,12,gfpga_pad_IO_F2A[1036],F2P_IXS5_SDI_OE,
Bottom,24,16,10,gfpga_pad_IO_A2F[1034],P2F_IXS5_SDO_IN,
Bottom,24,16,9,gfpga_pad_IO_F2A[1033],F2P_IXS5_SDO_OUT,
Bottom,24,16,8,gfpga_pad_IO_F2A[1032],F2P_IXS5_SDO_OE,
Bottom,24,16,6,gfpga_pad_IO_A2F[1030],P2F_IXS6_SDI_IN,
Bottom,24,16,5,gfpga_pad_IO_F2A[1029],F2P_IXS6_SDI_OUT,
Bottom,24,16,4,gfpga_pad_IO_F2A[1028],F2P_IXS6_SDI_OE,
Bottom,24,16,2,gfpga_pad_IO_A2F[1026],P2F_IXS6_SDO_IN,
Bottom,24,16,1,gfpga_pad_IO_F2A[1025],F2P_IXS6_SDO_OUT,
Bottom,24,16,0,gfpga_pad_IO_F2A[1024],F2P_IXS6_SDO_OE,
Bottom,24,15,14,gfpga_pad_IO_A2F[1022],P2F_IXS7_SDI_IN,
Bottom,24,15,13,gfpga_pad_IO_F2A[1021],F2P_IXS7_SDI_OUT,
Bottom,24,15,12,gfpga_pad_IO_F2A[1020],F2P_IXS7_SDI_OE,
Bottom,24,15,10,gfpga_pad_IO_A2F[1018],P2F_IXS7_SDO_IN,
Bottom,24,15,9,gfpga_pad_IO_F2A[1017],F2P_IXS7_SDO_OUT,
Bottom,24,15,8,gfpga_pad_IO_F2A[1016],F2P_IXS7_SDO_OE,
Bottom,24,15,6,gfpga_pad_IO_A2F[1014],P2F_FCLKO_0_IN,
Bottom,24,15,5,gfpga_pad_IO_F2A[1013],F2P_FCLKO_0_OUT,
Bottom,24,15,4,gfpga_pad_IO_F2A[1012],F2P_FCLKO_0_OE,
Bottom,24,15,2,gfpga_pad_IO_A2F[1010],P2F_FCLKO_1_IN,
Bottom,24,15,1,gfpga_pad_IO_F2A[1009],F2P_FCLKO_1_OUT,
Bottom,24,15,0,gfpga_pad_IO_F2A[1008],F2P_FCLKO_1_OE,
Bottom,24,14,14,gfpga_pad_IO_A2F[1006],P2F_BCLKO_0_IN,
Bottom,24,14,13,gfpga_pad_IO_F2A[1005],F2P_BCLKO_0_OUT,
Bottom,24,14,12,gfpga_pad_IO_F2A[1004],F2P_BCLKO_0_OE,
Bottom,24,14,10,gfpga_pad_IO_A2F[1002],P2F_BCLKO_1_IN,
Bottom,24,14,9,gfpga_pad_IO_F2A[1001],F2P_BCLKO_1_OUT,
Bottom,24,14,8,gfpga_pad_IO_F2A[1000],F2P_BCLKO_1_OE,
Bottom,24,14,6,gfpga_pad_IO_A2F[998],P2F_BCLKO_2_IN,
Bottom,24,14,5,gfpga_pad_IO_F2A[997],F2P_BCLKO_2_OUT,
Bottom,24,14,4,gfpga_pad_IO_F2A[996],F2P_BCLKO_2_OE,
Bottom,24,14,2,gfpga_pad_IO_A2F[994],P2F_BCLKIO_IN,
Bottom,24,14,1,gfpga_pad_IO_F2A[993],F2P_BCLKIO_OUT,
Bottom,24,14,0,gfpga_pad_IO_F2A[992],F2P_BCLKIO_OE,
Bottom,24,13,14,gfpga_pad_IO_A2F[990],P2F_MCLKIO_IN,
Bottom,24,13,13,gfpga_pad_IO_F2A[989],F2P_MCLKIO_OUT,
Bottom,24,13,12,gfpga_pad_IO_F2A[988],F2P_MCLKIO_OE,
Bottom,24,13,10,gfpga_pad_IO_A2F[986],P2F_MCLKO_0_IN,
Bottom,24,13,9,gfpga_pad_IO_F2A[985],F2P_MCLKO_0_OUT,
Bottom,24,13,8,gfpga_pad_IO_F2A[984],F2P_MCLKO_0_OE,
Bottom,24,13,6,gfpga_pad_IO_A2F[982],P2F_MCLKO_1_IN,
Bottom,24,13,5,gfpga_pad_IO_F2A[981],F2P_MCLKO_1_OUT,
Bottom,24,13,4,gfpga_pad_IO_F2A[980],F2P_MCLKO_1_OE,
Bottom,24,13,2,gfpga_pad_IO_A2F[978],P2F_MCLKO_2_IN,
Bottom,24,13,1,gfpga_pad_IO_F2A[977],F2P_MCLKO_2_OUT,
Bottom,24,13,0,gfpga_pad_IO_F2A[976],F2P_MCLKO_2_OE,
Bottom,24,12,0,gfpga_pad_IO_A2F[960],P2F_FCLKIO_HS,
Bottom,24,11,7,gfpga_pad_IO_A2F[951],P2F_IXS8_SDI_HS,
Bottom,24,11,6,gfpga_pad_IO_A2F[950],P2F_IXS9_SDI_HS,
Bottom,24,11,5,gfpga_pad_IO_A2F[949],P2F_IXS10_SDI_HS,
Bottom,24,11,4,gfpga_pad_IO_A2F[948],P2F_IXS11_SDI_HS,
Bottom,24,11,3,gfpga_pad_IO_A2F[947],P2F_IXS12_SDI_HS,
Bottom,24,11,2,gfpga_pad_IO_A2F[946],P2F_IXS13_SDI_HS,
Bottom,24,11,1,gfpga_pad_IO_A2F[945],P2F_IXS14_SDI_HS,
Bottom,24,11,0,gfpga_pad_IO_A2F[944],P2F_IXS15_SDI_HS,
Bottom,24,10,4,gfpga_pad_IO_F2A[932],F2P_FCLKO_0_HS,
Bottom,24,10,3,gfpga_pad_IO_F2A[931],F2P_FCLKO_1_HS,
Bottom,24,10,2,gfpga_pad_IO_F2A[930],F2P_FCLKIO_HS,
Bottom,24,10,1,gfpga_pad_IO_F2A[929],F2P_FCLKO_2_HS,
Bottom,24,10,0,gfpga_pad_IO_F2A[928],F2P_FCLKO_3_HS,
Bottom,24,9,7,gfpga_pad_IO_F2A[919],F2P_IXS8_SDO_HS,
Bottom,24,9,6,gfpga_pad_IO_F2A[918],F2P_IXS9_SDO_HS,
Bottom,24,9,5,gfpga_pad_IO_F2A[917],F2P_IXS10_SDO_HS,
Bottom,24,9,4,gfpga_pad_IO_F2A[916],F2P_IXS11_SDO_HS,
Bottom,24,9,3,gfpga_pad_IO_F2A[915],F2P_IXS12_SDO_HS,
Bottom,24,9,2,gfpga_pad_IO_F2A[914],F2P_IXS13_SDO_HS,
Bottom,24,9,1,gfpga_pad_IO_F2A[913],F2P_IXS14_SDO_HS,
Bottom,24,9,0,gfpga_pad_IO_F2A[912],F2P_IXS15_SDO_HS,
Bottom,24,8,14,gfpga_pad_IO_A2F[910],P2F_FCLKIO_IN,
Bottom,24,8,13,gfpga_pad_IO_F2A[909],F2P_FCLKIO_OUT,
Bottom,24,8,12,gfpga_pad_IO_F2A[908],F2P_FCLKIO_OE,
Bottom,24,8,10,gfpga_pad_IO_A2F[906],P2F_FCLKO_2_IN,
Bottom,24,8,9,gfpga_pad_IO_F2A[905],F2P_FCLKO_2_OUT,
Bottom,24,8,8,gfpga_pad_IO_F2A[904],F2P_FCLKO_2_OE,
Bottom,24,8,6,gfpga_pad_IO_A2F[902],P2F_FCLKO_3_IN,
Bottom,24,8,5,gfpga_pad_IO_F2A[901],F2P_FCLKO_3_OUT,
Bottom,24,8,4,gfpga_pad_IO_F2A[900],F2P_FCLKO_3_OE,
Bottom,24,8,1,gfpga_pad_IO_F2A[897],F2A_LB_CLK_B,
Bottom,24,7,14,gfpga_pad_IO_A2F[894],P2F_IXS8_SDI_IN,
Bottom,24,7,13,gfpga_pad_IO_F2A[893],F2P_IXS8_SDI_OUT,
Bottom,24,7,12,gfpga_pad_IO_F2A[892],F2P_IXS8_SDI_OE,
Bottom,24,7,10,gfpga_pad_IO_A2F[890],P2F_IXS8_SDO_IN,
Bottom,24,7,9,gfpga_pad_IO_F2A[889],F2P_IXS8_SDO_OUT,
Bottom,24,7,8,gfpga_pad_IO_F2A[888],F2P_IXS8_SDO_OE,
Bottom,24,7,6,gfpga_pad_IO_A2F[886],P2F_IXS9_SDI_IN,
Bottom,24,7,5,gfpga_pad_IO_F2A[885],F2P_IXS9_SDI_OUT,
Bottom,24,7,4,gfpga_pad_IO_F2A[884],F2P_IXS9_SDI_OE,
Bottom,24,7,2,gfpga_pad_IO_A2F[882],P2F_IXS9_SDO_IN,
Bottom,24,7,1,gfpga_pad_IO_F2A[881],F2P_IXS9_SDO_OUT,
Bottom,24,7,0,gfpga_pad_IO_F2A[880],F2P_IXS9_SDO_OE,
Bottom,24,6,14,gfpga_pad_IO_A2F[878],P2F_IXS10_SDI_IN,
Bottom,24,6,13,gfpga_pad_IO_F2A[877],F2P_IXS10_SDI_OUT,
Bottom,24,6,12,gfpga_pad_IO_F2A[876],F2P_IXS10_SDI_OE,
Bottom,24,6,10,gfpga_pad_IO_A2F[874],P2F_IXS10_SDO_IN,
Bottom,24,6,9,gfpga_pad_IO_F2A[873],F2P_IXS10_SDO_OUT,
Bottom,24,6,8,gfpga_pad_IO_F2A[872],F2P_IXS10_SDO_OE,
Bottom,24,6,6,gfpga_pad_IO_A2F[870],P2F_IXS11_SDI_IN,
Bottom,24,6,5,gfpga_pad_IO_F2A[869],F2P_IXS11_SDI_OUT,
Bottom,24,6,4,gfpga_pad_IO_F2A[868],F2P_IXS11_SDI_OE,
Bottom,24,6,2,gfpga_pad_IO_A2F[866],P2F_IXS11_SDO_IN,
Bottom,24,6,1,gfpga_pad_IO_F2A[865],F2P_IXS11_SDO_OUT,
Bottom,24,6,0,gfpga_pad_IO_F2A[864],F2P_IXS11_SDO_OE,
Bottom,24,5,14,gfpga_pad_IO_A2F[862],P2F_IXS12_SDI_IN,
Bottom,24,5,13,gfpga_pad_IO_F2A[861],F2P_IXS12_SDI_OUT,
Bottom,24,5,12,gfpga_pad_IO_F2A[860],F2P_IXS12_SDI_OE,
Bottom,24,5,10,gfpga_pad_IO_A2F[858],P2F_IXS12_SDO_IN,
Bottom,24,5,9,gfpga_pad_IO_F2A[857],F2P_IXS12_SDO_OUT,
Bottom,24,5,8,gfpga_pad_IO_F2A[856],F2P_IXS12_SDO_OE,
Bottom,24,5,6,gfpga_pad_IO_A2F[854],P2F_IXS13_SDI_IN,
Bottom,24,5,5,gfpga_pad_IO_F2A[853],F2P_IXS13_SDI_OUT,
Bottom,24,5,4,gfpga_pad_IO_F2A[852],F2P_IXS13_SDI_OE,
Bottom,24,5,2,gfpga_pad_IO_A2F[850],P2F_IXS13_SDO_IN,
Bottom,24,5,1,gfpga_pad_IO_F2A[849],F2P_IXS13_SDO_OUT,
Bottom,24,5,0,gfpga_pad_IO_F2A[848],F2P_IXS13_SDO_OE,
Bottom,24,4,14,gfpga_pad_IO_A2F[846],P2F_IXS14_SDI_IN,
Bottom,24,4,13,gfpga_pad_IO_F2A[845],F2P_IXS14_SDI_OUT,
Bottom,24,4,12,gfpga_pad_IO_F2A[844],F2P_IXS14_SDI_OE,
Bottom,24,4,10,gfpga_pad_IO_A2F[842],P2F_IXS14_SDO_IN,
Bottom,24,4,9,gfpga_pad_IO_F2A[841],F2P_IXS14_SDO_OUT,
Bottom,24,4,8,gfpga_pad_IO_F2A[840],F2P_IXS14_SDO_OE,
Bottom,24,4,6,gfpga_pad_IO_A2F[838],P2F_IXS15_SDI_IN,
Bottom,24,4,5,gfpga_pad_IO_F2A[837],F2P_IXS15_SDI_OUT,
Bottom,24,4,4,gfpga_pad_IO_F2A[836],F2P_IXS15_SDI_OE,
Bottom,24,4,2,gfpga_pad_IO_A2F[834],P2F_IXS15_SDO_IN,
Bottom,24,4,1,gfpga_pad_IO_F2A[833],F2P_IXS15_SDO_OUT,
Bottom,24,4,0,gfpga_pad_IO_F2A[832],F2P_IXS15_SDO_OE,
Bottom,24,3,6,gfpga_pad_IO_A2F[822],RFU,
Bottom,24,3,5,gfpga_pad_IO_F2A[821],RFU,
Bottom,24,3,4,gfpga_pad_IO_F2A[820],RFU,
Bottom,24,3,2,gfpga_pad_IO_A2F[818],RFU,
Bottom,24,3,1,gfpga_pad_IO_F2A[817],RFU,
Bottom,24,3,0,gfpga_pad_IO_F2A[816],RFU,
Bottom,24,2,6,gfpga_pad_IO_A2F[806],RFU,
Bottom,24,2,5,gfpga_pad_IO_F2A[805],RFU,
Bottom,24,2,4,gfpga_pad_IO_F2A[804],RFU,
Bottom,24,2,2,gfpga_pad_IO_A2F[802],RFU,
Bottom,24,2,1,gfpga_pad_IO_F2A[801],RFU,
Bottom,24,2,0,gfpga_pad_IO_F2A[800],RFU,
Left,23,0,15,gfpga_pad_IO_F2A[1535],F2A_GPIO6_31,
Left,23,0,14,gfpga_pad_IO_F2A[1534],F2A_GPIO6_30,
Left,23,0,13,gfpga_pad_IO_F2A[1533],F2A_GPIO6_29,
Left,23,0,12,gfpga_pad_IO_F2A[1532],F2A_GPIO6_28,
Left,23,0,11,gfpga_pad_IO_A2F[1531],A2F_GPIO6_31,
Left,23,0,10,gfpga_pad_IO_A2F[1530],A2F_GPIO6_30,
Left,23,0,9,gfpga_pad_IO_A2F[1529],A2F_GPIO6_29,
Left,23,0,8,gfpga_pad_IO_A2F[1528],A2F_GPIO6_28,
Left,22,0,15,gfpga_pad_IO_F2A[1519],F2A_GPIO6_27,
Left,22,0,14,gfpga_pad_IO_F2A[1518],F2A_GPIO6_26,
Left,22,0,13,gfpga_pad_IO_F2A[1517],F2A_GPIO6_25,
Left,22,0,12,gfpga_pad_IO_F2A[1516],F2A_GPIO6_24,
Left,22,0,11,gfpga_pad_IO_A2F[1515],A2F_GPIO6_27,
Left,22,0,10,gfpga_pad_IO_A2F[1514],A2F_GPIO6_26,
Left,22,0,9,gfpga_pad_IO_A2F[1513],A2F_GPIO6_25,
Left,22,0,8,gfpga_pad_IO_A2F[1512],A2F_GPIO6_24,
Left,21,0,15,gfpga_pad_IO_F2A[1503],F2A_GPIO6_23,
Left,21,0,14,gfpga_pad_IO_F2A[1502],F2A_GPIO6_22,
Left,21,0,13,gfpga_pad_IO_F2A[1501],F2A_GPIO6_21,
Left,21,0,12,gfpga_pad_IO_F2A[1500],F2A_GPIO6_20,
Left,21,0,11,gfpga_pad_IO_A2F[1499],A2F_GPIO6_23,
Left,21,0,10,gfpga_pad_IO_A2F[1498],A2F_GPIO6_22,
Left,21,0,9,gfpga_pad_IO_A2F[1497],A2F_GPIO6_21,
Left,21,0,8,gfpga_pad_IO_A2F[1496],A2F_GPIO6_20,
Left,21,0,0,gfpga_pad_IO_F2A[1488],F2A_LB_CLK_L,
Left,20,0,15,gfpga_pad_IO_F2A[1487],F2A_GPIO6_19,
Left,20,0,14,gfpga_pad_IO_F2A[1486],F2A_GPIO6_18,
Left,20,0,13,gfpga_pad_IO_F2A[1485],F2A_GPIO6_17,
Left,20,0,12,gfpga_pad_IO_F2A[1484],F2A_GPIO6_16,
Left,20,0,11,gfpga_pad_IO_A2F[1483],A2F_GPIO6_19,
Left,20,0,10,gfpga_pad_IO_A2F[1482],A2F_GPIO6_18,
Left,20,0,9,gfpga_pad_IO_A2F[1481],A2F_GPIO6_17,
Left,20,0,8,gfpga_pad_IO_A2F[1480],A2F_GPIO6_16,
Left,20,0,1,gfpga_pad_IO_F2A[1473],F2A_ACM_AES1_RX_FCLK,
Left,20,0,0,gfpga_pad_IO_F2A[1472],F2A_ACM_WC_FCLK,
Left,19,0,15,gfpga_pad_IO_F2A[1471],F2A_GPIO6_15,
Left,19,0,14,gfpga_pad_IO_F2A[1470],F2A_GPIO6_14,
Left,19,0,13,gfpga_pad_IO_F2A[1469],F2A_GPIO6_13,
Left,19,0,12,gfpga_pad_IO_F2A[1468],F2A_GPIO6_12,
Left,19,0,11,gfpga_pad_IO_A2F[1467],A2F_GPIO6_15,
Left,19,0,10,gfpga_pad_IO_A2F[1466],A2F_GPIO6_14,
Left,19,0,9,gfpga_pad_IO_A2F[1465],A2F_GPIO6_13,
Left,19,0,8,gfpga_pad_IO_A2F[1464],A2F_GPIO6_12,
Left,19,0,3,gfpga_pad_IO_A2F[1459],RFU,
Left,19,0,1,gfpga_pad_IO_F2A[1457],F2A_ACM_AES0_RX_FCLK,
Left,19,0,0,gfpga_pad_IO_F2A[1456],F2A_ACM_IXS_RX_FCLK,
Left,18,0,15,gfpga_pad_IO_F2A[1455],F2A_GPIO6_11,
Left,18,0,14,gfpga_pad_IO_F2A[1454],F2A_GPIO6_10,
Left,18,0,13,gfpga_pad_IO_F2A[1453],F2A_GPIO6_9,
Left,18,0,12,gfpga_pad_IO_F2A[1452],F2A_GPIO6_8,
Left,18,0,11,gfpga_pad_IO_A2F[1451],A2F_GPIO6_11,
Left,18,0,10,gfpga_pad_IO_A2F[1450],A2F_GPIO6_10,
Left,18,0,9,gfpga_pad_IO_A2F[1449],A2F_GPIO6_9,
Left,18,0,8,gfpga_pad_IO_A2F[1448],A2F_GPIO6_8,
Left,18,0,5,gfpga_pad_IO_A2F[1445],A2F_GPIO7_WR_ACK,
Left,18,0,4,gfpga_pad_IO_A2F[1444],A2F_GPIO7_RD_ACK,
Left,18,0,3,gfpga_pad_IO_A2F[1443],RFU,
Left,18,0,2,gfpga_pad_IO_F2A[1442],F2A_ACM_AES1_RX_BCLK,
Left,18,0,1,gfpga_pad_IO_F2A[1441],F2A_ACM_AES0_RX_BCLK,
Left,18,0,0,gfpga_pad_IO_F2A[1440],F2A_ACM_IXS_RX_BCLK,
Left,17,0,15,gfpga_pad_IO_F2A[1439],F2A_GPIO6_7,
Left,17,0,14,gfpga_pad_IO_F2A[1438],F2A_GPIO6_6,
Left,17,0,13,gfpga_pad_IO_F2A[1437],F2A_GPIO6_5,
Left,17,0,12,gfpga_pad_IO_F2A[1436],F2A_GPIO6_4,
Left,17,0,11,gfpga_pad_IO_A2F[1435],A2F_GPIO6_7,
Left,17,0,10,gfpga_pad_IO_A2F[1434],A2F_GPIO6_6,
Left,17,0,9,gfpga_pad_IO_A2F[1433],A2F_GPIO6_5,
Left,17,0,8,gfpga_pad_IO_A2F[1432],A2F_GPIO6_4,
Left,17,0,7,gfpga_pad_IO_F2A[1431],RFU,
Left,17,0,6,gfpga_pad_IO_F2A[1430],RFU,
Left,17,0,5,gfpga_pad_IO_A2F[1429],A2F_GPIO6_WR_ACK,
Left,17,0,4,gfpga_pad_IO_A2F[1428],A2F_GPIO6_RD_ACK,
Left,17,0,3,gfpga_pad_IO_A2F[1427],RFU,
Left,17,0,1,gfpga_pad_IO_F2A[1425],F2A_ACM_FPGA_FCLK,
Left,17,0,0,gfpga_pad_IO_F2A[1424],F2A_ACM_APLL_FCLK,
Left,16,0,15,gfpga_pad_IO_F2A[1423],F2A_GPIO6_3,
Left,16,0,14,gfpga_pad_IO_F2A[1422],F2A_GPIO6_2,
Left,16,0,13,gfpga_pad_IO_F2A[1421],F2A_GPIO6_1,
Left,16,0,12,gfpga_pad_IO_F2A[1420],F2A_GPIO6_0,
Left,16,0,11,gfpga_pad_IO_A2F[1419],A2F_GPIO6_3,
Left,16,0,10,gfpga_pad_IO_A2F[1418],A2F_GPIO6_2,
Left,16,0,9,gfpga_pad_IO_A2F[1417],A2F_GPIO6_1,
Left,16,0,8,gfpga_pad_IO_A2F[1416],A2F_GPIO6_0,
Left,16,0,7,gfpga_pad_IO_F2A[1415],RFIU,
Left,16,0,6,gfpga_pad_IO_F2A[1414],RFU,
Left,16,0,5,gfpga_pad_IO_A2F[1413],A2F_GPIO4_WR_ACK,
Left,16,0,4,gfpga_pad_IO_A2F[1412],A2F_GPIO4_RD_ACK,
Left,16,0,3,gfpga_pad_IO_A2F[1411],RFU,
Left,16,0,1,gfpga_pad_IO_F2A[1409],F2A_ACM_FPGA_BCLK,
Left,16,0,0,gfpga_pad_IO_F2A[1408],F2A_ACM_APLL_BCLK,
Left,15,0,15,gfpga_pad_IO_F2A[1407],F2A_GPIO5_31,
Left,15,0,14,gfpga_pad_IO_F2A[1406],F2A_GPIO5_30,
Left,15,0,13,gfpga_pad_IO_F2A[1405],F2A_GPIO5_29,
Left,15,0,12,gfpga_pad_IO_F2A[1404],F2A_GPIO5_28,
Left,15,0,11,gfpga_pad_IO_A2F[1403],A2F_GPIO5_31,
Left,15,0,10,gfpga_pad_IO_A2F[1402],A2F_GPIO5_30,
Left,15,0,9,gfpga_pad_IO_A2F[1401],A2F_GPIO5_29,
Left,15,0,8,gfpga_pad_IO_A2F[1400],A2F_GPIO5_28,
Left,15,0,7,gfpga_pad_IO_A2F[1399],RFU,
Left,15,0,6,gfpga_pad_IO_A2F[1398],RFU,
Left,15,0,4,gfpga_pad_IO_A2F[1396],A2F_FIFOW_AEMPTY_HS,
Left,15,0,2,gfpga_pad_IO_F2A[1394],F2A_FIFO_WE_HS,
Left,15,0,1,gfpga_pad_IO_A2F[1393],A2F_FIFOW_FULL_HS,
Left,15,0,0,gfpga_pad_IO_A2F[1392],A2F_FIFOW_EMPTY_HS,
Left,14,0,15,gfpga_pad_IO_F2A[1391],F2A_GPIO5_27,
Left,14,0,14,gfpga_pad_IO_F2A[1390],F2A_GPIO5_26,
Left,14,0,13,gfpga_pad_IO_F2A[1389],F2A_GPIO5_25,
Left,14,0,12,gfpga_pad_IO_F2A[1388],F2A_GPIO5_24,
Left,14,0,11,gfpga_pad_IO_A2F[1387],A2F_GPIO5_27,
Left,14,0,10,gfpga_pad_IO_A2F[1386],A2F_GPIO5_26,
Left,14,0,9,gfpga_pad_IO_A2F[1385],A2F_GPIO5_25,
Left,14,0,8,gfpga_pad_IO_A2F[1384],A2F_GPIO5_24,
Left,14,0,7,gfpga_pad_IO_A2F[1383],A2F_FIFO_WD15_HS,
Left,14,0,6,gfpga_pad_IO_A2F[1382],A2F_FIFO_WD14_HS,
Left,14,0,5,gfpga_pad_IO_A2F[1381],A2F_FIFO_WD13_HS,
Left,14,0,4,gfpga_pad_IO_A2F[1380],A2F_FIFO_WD12_HS,
Left,14,0,3,gfpga_pad_IO_A2F[1379],A2F_FIFO_WD11_HS,
Left,14,0,2,gfpga_pad_IO_A2F[1378],A2F_FIFO_WD10_HS,
Left,14,0,1,gfpga_pad_IO_A2F[1377],A2F_FIFO_WD9_HS,
Left,14,0,0,gfpga_pad_IO_A2F[1376],A2F_FIFO_WD8_HS,
Left,13,0,15,gfpga_pad_IO_F2A[1375],F2A_GPIO5_23,
Left,13,0,14,gfpga_pad_IO_F2A[1374],F2A_GPIO5_22,
Left,13,0,13,gfpga_pad_IO_F2A[1373],F2A_GPIO5_21,
Left,13,0,12,gfpga_pad_IO_F2A[1372],F2A_GPIO5_20,
Left,13,0,11,gfpga_pad_IO_A2F[1371],A2F_GPIO5_23,
Left,13,0,10,gfpga_pad_IO_A2F[1370],A2F_GPIO5_22,
Left,13,0,9,gfpga_pad_IO_A2F[1369],A2F_GPIO5_21,
Left,13,0,8,gfpga_pad_IO_A2F[1368],A2F_GPIO5_20,
Left,13,0,7,gfpga_pad_IO_A2F[1367],A2F_FIFO_WD7_HS,
Left,13,0,6,gfpga_pad_IO_A2F[1366],A2F_FIFO_WD6_HS,
Left,13,0,5,gfpga_pad_IO_A2F[1365],A2F_FIFO_WD5_HS,
Left,13,0,4,gfpga_pad_IO_A2F[1364],A2F_FIFO_WD4_HS,
Left,13,0,3,gfpga_pad_IO_A2F[1363],A2F_FIFO_WD3_HS,
Left,13,0,2,gfpga_pad_IO_A2F[1362],A2F_FIFO_WD2_HS,
Left,13,0,1,gfpga_pad_IO_A2F[1361],A2F_FIFO_WD1_HS,
Left,13,0,0,gfpga_pad_IO_A2F[1360],A2F_FIFO_WD0_HS,
Left,12,0,15,gfpga_pad_IO_F2A[1359],F2A_GPIO5_19,
Left,12,0,14,gfpga_pad_IO_F2A[1358],F2A_GPIO5_18,
Left,12,0,13,gfpga_pad_IO_F2A[1357],F2A_GPIO5_17,
Left,12,0,12,gfpga_pad_IO_F2A[1356],F2A_GPIO5_16,
Left,12,0,11,gfpga_pad_IO_A2F[1355],A2F_GPIO5_19,
Left,12,0,10,gfpga_pad_IO_A2F[1354],A2F_GPIO5_18,
Left,12,0,9,gfpga_pad_IO_A2F[1353],A2F_GPIO5_17,
Left,12,0,8,gfpga_pad_IO_A2F[1352],A2F_GPIO5_16,
Left,12,0,7,gfpga_pad_IO_F2A[1351],F2A_FIFO_RD15_HS,
Left,12,0,6,gfpga_pad_IO_F2A[1350],F2A_FIFO_RD14_HS,
Left,12,0,5,gfpga_pad_IO_F2A[1349],F2A_FIFO_RD13_HS,
Left,12,0,4,gfpga_pad_IO_F2A[1348],F2A_FIFO_RD12_HS,
Left,12,0,3,gfpga_pad_IO_F2A[1347],F2A_FIFO_RD11_HS,
Left,12,0,2,gfpga_pad_IO_F2A[1346],F2A_FIFO_RD10_HS,
Left,12,0,1,gfpga_pad_IO_F2A[1345],F2A_FIFO_RD9_HS,
Left,12,0,0,gfpga_pad_IO_F2A[1344],F2A_FIFO_RD8_HS,
Left,11,0,15,gfpga_pad_IO_F2A[1343],F2A_GPIO5_15,
Left,11,0,14,gfpga_pad_IO_F2A[1342],F2A_GPIO5_14,
Left,11,0,13,gfpga_pad_IO_F2A[1341],F2A_GPIO5_13,
Left,11,0,12,gfpga_pad_IO_F2A[1340],F2A_GPIO5_12,
Left,11,0,11,gfpga_pad_IO_A2F[1339],A2F_GPIO5_15,
Left,11,0,10,gfpga_pad_IO_A2F[1338],A2F_GPIO5_14,
Left,11,0,9,gfpga_pad_IO_A2F[1337],A2F_GPIO5_13,
Left,11,0,8,gfpga_pad_IO_A2F[1336],A2F_GPIO5_12,
Left,11,0,7,gfpga_pad_IO_F2A[1335],F2A_FIFO_RD7_HS,
Left,11,0,6,gfpga_pad_IO_F2A[1334],F2A_FIFO_RD6_HS,
Left,11,0,5,gfpga_pad_IO_F2A[1333],F2A_FIFO_RD5_HS,
Left,11,0,4,gfpga_pad_IO_F2A[1332],F2A_FIFO_RD4_HS,
Left,11,0,3,gfpga_pad_IO_F2A[1331],F2A_FIFO_RD3_HS,
Left,11,0,2,gfpga_pad_IO_F2A[1330],F2A_FIFO_RD2_HS,
Left,11,0,1,gfpga_pad_IO_F2A[1329],F2A_FIFO_RD1_HS,
Left,11,0,0,gfpga_pad_IO_F2A[1328],F2A_FIFO_RD0_HS,
Left,10,0,15,gfpga_pad_IO_F2A[1327],F2A_GPIO5_11,
Left,10,0,14,gfpga_pad_IO_F2A[1326],F2A_GPIO5_10,
Left,10,0,13,gfpga_pad_IO_F2A[1325],F2A_GPIO5_9,
Left,10,0,12,gfpga_pad_IO_F2A[1324],F2A_GPIO5_8,
Left,10,0,11,gfpga_pad_IO_A2F[1323],A2F_GPIO5_11,
Left,10,0,10,gfpga_pad_IO_A2F[1322],A2F_GPIO5_10,
Left,10,0,9,gfpga_pad_IO_A2F[1321],A2F_GPIO5_9,
Left,10,0,8,gfpga_pad_IO_A2F[1320],A2F_GPIO5_8,
Left,10,0,7,gfpga_pad_IO_A2F[1319],RFU,
Left,10,0,6,gfpga_pad_IO_A2F[1318],RFU,
Left,10,0,5,gfpga_pad_IO_A2F[1317],A2F_FIFOR_AFULL_HS,
Left,10,0,2,gfpga_pad_IO_F2A[1314],F2A_FIFO_RE_HS,
Left,10,0,1,gfpga_pad_IO_A2F[1313],A2F_FIFOR_FULL_HS,
Left,10,0,0,gfpga_pad_IO_A2F[1312],A2F_FIFOR_EMPTY_HS,
Left,9,0,15,gfpga_pad_IO_F2A[1311],F2A_GPIO5_7,
Left,9,0,14,gfpga_pad_IO_F2A[1310],F2A_GPIO5_6,
Left,9,0,13,gfpga_pad_IO_F2A[1309],F2A_GPIO5_5,
Left,9,0,12,gfpga_pad_IO_F2A[1308],F2A_GPIO5_4,
Left,9,0,11,gfpga_pad_IO_A2F[1307],A2F_GPIO5_7,
Left,9,0,10,gfpga_pad_IO_A2F[1306],A2F_GPIO5_6,
Left,9,0,9,gfpga_pad_IO_A2F[1305],A2F_GPIO5_5,
Left,9,0,8,gfpga_pad_IO_A2F[1304],A2F_GPIO5_4,
Left,9,0,7,gfpga_pad_IO_A2F[1303],A2F_IXS15_SDO_HS,
Left,9,0,6,gfpga_pad_IO_A2F[1302],A2F_IXS14_SDO_HS,
Left,9,0,5,gfpga_pad_IO_A2F[1301],A2F_IXS13_SDO_HS,
Left,9,0,4,gfpga_pad_IO_A2F[1300],A2F_IXS12_SDO_HS,
Left,9,0,3,gfpga_pad_IO_A2F[1299],A2F_IXS11_SDO_HS,
Left,9,0,2,gfpga_pad_IO_A2F[1298],A2F_IXS10_SDO_HS,
Left,9,0,1,gfpga_pad_IO_A2F[1297],A2F_IXS9_SDO_HS,
Left,9,0,0,gfpga_pad_IO_A2F[1296],A2F_IXS8_SDO_HS,
Left,8,0,15,gfpga_pad_IO_F2A[1295],F2A_GPIO5_3,
Left,8,0,14,gfpga_pad_IO_F2A[1294],F2A_GPIO5_2,
Left,8,0,13,gfpga_pad_IO_F2A[1293],F2A_GPIO5_1,
Left,8,0,12,gfpga_pad_IO_F2A[1292],F2A_GPIO5_0,
Left,8,0,11,gfpga_pad_IO_A2F[1291],A2F_GPIO5_3,
Left,8,0,10,gfpga_pad_IO_A2F[1290],A2F_GPIO5_2,
Left,8,0,9,gfpga_pad_IO_A2F[1289],A2F_GPIO5_1,
Left,8,0,8,gfpga_pad_IO_A2F[1288],A2F_GPIO5_0,
Left,8,0,7,gfpga_pad_IO_F2A[1287],F2A_IXS15_SDI_HS,
Left,8,0,6,gfpga_pad_IO_F2A[1286],F2A_IXS14_SDI_HS,
Left,8,0,5,gfpga_pad_IO_F2A[1285],F2A_IXS13_SDI_HS,
Left,8,0,4,gfpga_pad_IO_F2A[1284],F2A_IXS12_SDI_HS,
Left,8,0,3,gfpga_pad_IO_F2A[1283],F2A_IXS11_SDI_HS,
Left,8,0,2,gfpga_pad_IO_F2A[1282],F2A_IXS10_SDI_HS,
Left,8,0,1,gfpga_pad_IO_F2A[1281],F2A_IXS9_SDI_HS,
Left,8,0,0,gfpga_pad_IO_F2A[1280],F2A_IXS8_SDI_HS,
Left,7,0,15,gfpga_pad_IO_F2A[1279],F2A_GPIO4_31,
Left,7,0,14,gfpga_pad_IO_F2A[1278],F2A_GPIO4_30,
Left,7,0,13,gfpga_pad_IO_F2A[1277],F2A_GPIO4_29,
Left,7,0,12,gfpga_pad_IO_F2A[1276],F2A_GPIO4_28,
Left,7,0,11,gfpga_pad_IO_A2F[1275],A2F_GPIO4_31,
Left,7,0,10,gfpga_pad_IO_A2F[1274],A2F_GPIO4_30,
Left,7,0,9,gfpga_pad_IO_A2F[1273],A2F_GPIO4_29,
Left,7,0,8,gfpga_pad_IO_A2F[1272],A2F_GPIO4_28,
Left,7,0,7,gfpga_pad_IO_F2A[1271],RFU,
Left,7,0,6,gfpga_pad_IO_F2A[1270],RFU,
Left,7,0,4,gfpga_pad_IO_F2A[1268],F2A_AC_IXS_RX_FCLK_HS,
Left,7,0,2,gfpga_pad_IO_A2F[1266],A2F_AC_FCLK_DIV_F_OUT_HS,
Left,7,0,1,gfpga_pad_IO_A2F[1265],A2F_AC_FCLK_FMT_F_OUT_HS,
Left,7,0,0,gfpga_pad_IO_A2F[1264],A2F_IXS_TX_FCLK_HS,
Left,6,0,15,gfpga_pad_IO_F2A[1263],F2A_GPIO4_27,
Left,6,0,14,gfpga_pad_IO_F2A[1262],F2A_GPIO4_26,
Left,6,0,13,gfpga_pad_IO_F2A[1261],F2A_GPIO4_25,
Left,6,0,12,gfpga_pad_IO_F2A[1260],F2A_GPIO4_24,
Left,6,0,11,gfpga_pad_IO_A2F[1259],A2F_GPIO4_27,
Left,6,0,10,gfpga_pad_IO_A2F[1258],A2F_GPIO4_26,
Left,6,0,9,gfpga_pad_IO_A2F[1257],A2F_GPIO4_25,
Left,6,0,8,gfpga_pad_IO_A2F[1256],A2F_GPIO4_24,
Left,6,0,7,gfpga_pad_IO_F2A[1255],RFU,
Left,6,0,6,gfpga_pad_IO_F2A[1254],RFU,
Left,6,0,4,gfpga_pad_IO_F2A[1252],F2A_AC_IXS_TX_FCLK_HS,
Left,6,0,3,gfpga_pad_IO_A2F[1251],A2F_AC_FCLK_0B0_IN_HS,
Left,6,0,1,gfpga_pad_IO_A2F[1249],A2F_AC_FCLK_FMT_F_IN_HS,
Left,6,0,0,gfpga_pad_IO_A2F[1248],A2F_IXS_RX_FCLK_HS,
Left,5,0,15,gfpga_pad_IO_F2A[1247],F2A_GPIO4_23,
Left,5,0,14,gfpga_pad_IO_F2A[1246],F2A_GPIO4_22,
Left,5,0,13,gfpga_pad_IO_F2A[1245],F2A_GPIO4_21,
Left,5,0,12,gfpga_pad_IO_F2A[1244],F2A_GPIO4_20,
Left,5,0,11,gfpga_pad_IO_A2F[1243],A2F_GPIO4_23,
Left,5,0,10,gfpga_pad_IO_A2F[1242],A2F_GPIO4_22,
Left,5,0,9,gfpga_pad_IO_A2F[1241],A2F_GPIO4_21,
Left,5,0,8,gfpga_pad_IO_A2F[1240],A2F_GPIO4_20,
Left,5,0,3,gfpga_pad_IO_A2F[1235],A2F_AC_FCLK_0B1_IN_HS,
Left,5,0,0,gfpga_pad_IO_F2A[1232],RFU,
Left,4,0,15,gfpga_pad_IO_F2A[1231],F2A_GPIO4_19,
Left,4,0,14,gfpga_pad_IO_F2A[1230],F2A_GPIO4_18,
Left,4,0,13,gfpga_pad_IO_F2A[1229],F2A_GPIO4_17,
Left,4,0,12,gfpga_pad_IO_F2A[1228],F2A_GPIO4_16,
Left,4,0,11,gfpga_pad_IO_A2F[1227],A2F_GPIO4_19,
Left,4,0,10,gfpga_pad_IO_A2F[1226],A2F_GPIO4_18,
Left,4,0,9,gfpga_pad_IO_A2F[1225],A2F_GPIO4_17,
Left,4,0,8,gfpga_pad_IO_A2F[1224],A2F_GPIO4_16,
Left,4,0,5,gfpga_pad_IO_A2F[1221],A2F_GPIO5_WR_ACK,
Left,4,0,4,gfpga_pad_IO_A2F[1220],A2F_GPIO5_RD_ACK,
Left,4,0,3,gfpga_pad_IO_F2A[1219],F2A_AC_IXS_RX_BCLK,
Left,4,0,2,gfpga_pad_IO_F2A[1218],F2A_ACM_AES3_RX_BCLK,
Left,4,0,1,gfpga_pad_IO_F2A[1217],F2A_ACM_AES2_RX_BCLK,
Left,4,0,0,gfpga_pad_IO_F2A[1216],F2A_AC_AES_TX_MCLK,
Left,3,0,15,gfpga_pad_IO_F2A[1215],F2A_GPIO4_15,
Left,3,0,14,gfpga_pad_IO_F2A[1214],F2A_GPIO4_14,
Left,3,0,13,gfpga_pad_IO_F2A[1213],F2A_GPIO4_13,
Left,3,0,12,gfpga_pad_IO_F2A[1212],F2A_GPIO4_12,
Left,3,0,11,gfpga_pad_IO_A2F[1211],A2F_GPIO4_15,
Left,3,0,10,gfpga_pad_IO_A2F[1210],A2F_GPIO4_14,
Left,3,0,9,gfpga_pad_IO_A2F[1209],A2F_GPIO4_13,
Left,3,0,8,gfpga_pad_IO_A2F[1208],A2F_GPIO4_12,
Left,3,0,1,gfpga_pad_IO_F2A[1201],F2A_ACM_AES2_RX_FCLK,
Left,3,0,0,gfpga_pad_IO_F2A[1200],F2A_AC_ADLL_IN,
Left,2,0,15,gfpga_pad_IO_F2A[1199],F2A_GPIO4_11,
Left,2,0,14,gfpga_pad_IO_F2A[1198],F2A_GPIO4_10,
Left,2,0,13,gfpga_pad_IO_F2A[1197],F2A_GPIO4_9,
Left,2,0,12,gfpga_pad_IO_F2A[1196],F2A_GPIO4_8,
Left,2,0,11,gfpga_pad_IO_A2F[1195],A2F_GPIO4_11,
Left,2,0,10,gfpga_pad_IO_A2F[1194],A2F_GPIO4_10,
Left,2,0,9,gfpga_pad_IO_A2F[1193],A2F_GPIO4_9,
Left,2,0,8,gfpga_pad_IO_A2F[1192],A2F_GPIO4_8,
Left,2,0,1,gfpga_pad_IO_F2A[1185],F2A_ACM_AES3_RX_FCLK,
Left,2,0,0,gfpga_pad_IO_F2A[1184],F2A_AC_IXS_TX_BCLK,
Left,1,0,15,gfpga_pad_IO_F2A[1183],F2A_GPIO4_7,
Left,1,0,14,gfpga_pad_IO_F2A[1182],F2A_GPIO4_6,
Left,1,0,13,gfpga_pad_IO_F2A[1181],F2A_GPIO4_5,
Left,1,0,12,gfpga_pad_IO_F2A[1180],F2A_GPIO4_4,
Left,1,0,11,gfpga_pad_IO_A2F[1179],A2F_GPIO4_7,
Left,1,0,10,gfpga_pad_IO_A2F[1178],A2F_GPIO4_6,
Left,1,0,9,gfpga_pad_IO_A2F[1177],A2F_GPIO4_5,
Left,1,0,8,gfpga_pad_IO_A2F[1176],A2F_GPIO4_4,
Left,0,0,15,gfpga_pad_IO_F2A[1167],F2A_GPIO4_3,
Left,0,0,14,gfpga_pad_IO_F2A[1166],F2A_GPIO4_2,
Left,0,0,13,gfpga_pad_IO_F2A[1165],F2A_GPIO4_1,
Left,0,0,12,gfpga_pad_IO_F2A[1164],F2A_GPIO4_0,
Left,0,0,11,gfpga_pad_IO_A2F[1163],A2F_GPIO4_3,
Left,0,0,10,gfpga_pad_IO_A2F[1162],A2F_GPIO4_2,
Left,0,0,9,gfpga_pad_IO_A2F[1161],A2F_GPIO4_1,
Left,0,0,8,gfpga_pad_IO_A2F[1160],A2F_GPIO4_0,


Syntax:

To set constraint for the IO
set_io <port_name> <Package IO>
To set constraint for the clock port
set_clk <clk_name> <port_name>

clock names supported: clk[0], clk[1], clk[2], clk[3]

For this csv file, the counter_16bit one can add these IO placements:

set_io enable user_IN_T[0]
set_io reset user_IN_T[1]
set_clk clk[0] clk
set_io count[0] user_OUT_T[8]
set_io count[1] user_OUT_T[9]
set_io count[2] user_OUT_T[10]
set_io count[3] user_OUT_T[11]
set_io count[4] user_OUT_T[12]
set_io count[5] user_OUT_T[13]
set_io count[6] user_OUT_T[14]
set_io count[7] user_OUT_T[15]
set_io count[8] user_OUT_T[16]
set_io count[9] user_OUT_T[17]
set_io count[10] user_OUT_T[18]
set_io count[11] user_OUT_T[19]
set_io count[12] user_OUT_T[20]
set_io count[13] user_OUT_T[21]
set_io count[14] user_OUT_T[22]
set_io count[15] user_OUT_T[23]

Note

> The pcf file support is only supported for the QLF_K4N8

BRAM and DSP

To infer BRAM:

In SymbiFlow, the synthesis of Verilog files is performed with Yosys which infers the BRAM for the device qlf_k6n10.

Syntax:

ql_symbiflow -synth -src <source complete path> -d <device> -t <top module name> -v <verilog files>

Output files for synthesis are present in ‘build’ folder:

<TOP>.eblif : netlist file for the design
<TOP>_synth.log : synthesis log information, refer this file for any issues during synthesis

Resource utilization in the top_synth.log of the BRAM design:

io             : 42
 inpad         : 26
 outpad        : 16
clb            : 2
  fle          : 2
   lut5inter   : 2
    ble5       : 2
     flut5     : 2
      lut5     : 2
       lut     : 2
 memory        : 1
   mem_16K_dp  : 1

All the output log files will be dumped in {source path}/build folder

//Verilog code for the BRAM configuration of 16x1024
module BRAM_16x1024_TOP( clk, rce, ra, rq, wce, wa, wd);

parameter AWIDTH = 10;
parameter DWIDTH = 16;
input  clk;
input  rce;
input  [AWIDTH-1:0] ra;
input  wce;
input  [AWIDTH-1:0] wa;
input  [DWIDTH-1:0] wd;
output [DWIDTH-1:0] rq;

        BRAM #(.AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) BRAM_16x1024 (.clk(clk), .rce(rce), .ra(ra), .rq(rq), .wce(wce), .wa(wa), .wd(wd));

endmodule

module BRAM #(parameter AWIDTH = 9,
parameter DWIDTH = 32)( clk, rce, ra, rq, wce, wa, wd);

input  clk;
input  rce;
input  wce;
input  [AWIDTH-1:0] ra;
input  [AWIDTH-1:0] wa;
input  [DWIDTH-1:0] wd;
output reg [DWIDTH-1:0] rq;
reg    [DWIDTH-1:0] memory[0:AWIDTH-1];

always @(posedge clk) begin
        if (rce)
                rq <= memory[ra];
        if (wce)
                memory[wa] <= wd;
end

integer i;
initial
   begin
        for(i = 0; i < AWIDTH-1; i = i + 1)
                memory[i] = 0;
   end
endmodule
The various configuration of the BRAMS can be configured by changing the AWIDTH and DWIDTH parameters as shown below.
BRAM 4x4096 : AWIDTH=12, DWIDTH=4
BRAM 8x2048 : AWIDTH=11, DWIDTH=8
BRAM 32x512 : AWIDTH=10, DWIDTH=16
To infer DSP:

To infer the DSP block for multiplier, refer the mac_16 verilog example.

Resource utilization in the top_synth.log of the MAC_16 design:

io              : 64
 inpad          : 48
 outpad         : 16
clb             : 1
  fle           : 1
   lut5inter    : 1
    ble5        : 1
     flut5      : 1
      lut5      : 1
       lut      : 1
 QL_DSP         : 1
   QL_DSP_slice : 1

All the output log files will be dumped in {source path}/build folder

//Verilog code for the multiplier+adder block
module mac_16(a, b, c, out);

parameter DATA_WIDTH = 16;
input [DATA_WIDTH - 1 : 0] a, b, c;
output [DATA_WIDTH - 1 : 0] out;

assign out = a * b + c;

endmodule

Note

> The programming files are only supported for the QLF_K6N10

 

S3B Device

This provides the details of running designs and in-built RAMs/FIFOs/Multipliers in S3B.

Symbiflow: Design flow (EOS-S3)

The below figure shows the complete design flow from the HDL to the programming file:

Design flow

Supported Commands

Command option

Represented for

Options

-synth

Synthesis using yosys

-

-compile

Run pack, place, route and generate fasm file

-

-src <source path>

Source file folder

-

-d <device>

Device supported

ql-eos-s3

-P <package>

Packages

PD64 (BGA), WR42(WLCSP), PU64 (QFN)

-p <pcf file>

Fix Placement constraints of IO’s

-

-s <sdc file>

Timing Constraint File (SDC)

Refer online documents section for SDC constraints supported

-r <router flag>

Timing: means no attention is paid to delay. Congestion: means nets on the critical path pay no attention to congestion.

timing, congestion

-t <top module>

Top module of the Verilog design

-

-v <Verilog list files>

Verilog source files

Only Verilog supported

-dump <output to be dumped>

Dump the output format file

Jlink, post_verilog, header

Run design flow on a simple counter design (EOS-S3)

Setup environment

To run any example, perform these steps once.

export INSTALL_DIR="specify the installpath"
#adding symbiflow toolchain binaries to PATH
export PATH="$INSTALL_DIR/quicklogic-arch-defs/bin:$INSTALL_DIR/quicklogic-arch-defs/bin/python:$PATH"
source "$INSTALL_DIR/conda/etc/profile.d/conda.sh"
conda activate

Entering an HDL Design:

1.Write a Verilog code for the design using any text editor.
2.Verify the syntax.
3.Create the simulation stimuli using any text editor.

The code and testbench for the example design are present at:
<Install_Path>/quicklogic-arch-defs/tests/counter_16bit/

Performing the Pre-Layout Simulation

To perform a pre-layout simulation:

Using Icarus Verilog:

To create the VCD output file that will be used to perform graphical analysis of the
Design, the following lines are added in the TB:

initial begin
 $dumpfile("counter_16bit_tb.vcd");
 $dumpvars(0,counter_16bit_tb);
 $display("\\t\\ttime,\\tclk,\\treset,\\tenable,\\tcount");
 $monitor("%d,\\t%b,\\t%b,\\t%b,\\t%d",$time, clk,reset,enable,count);
end

The “iverilog” and “vvp” commands are the most important commands available to users of Icarus Verilog. The “iverilog” command is the compiler, and the “vvp” command is the simulation runtime engine.

cd <INSTALL_PATH>/quicklogic-arch-defs/tests/counter_16bit

The “iverilog” command supports multi-file designs by two methods. The simplest is to list the files on the command line:

iverilog -o my_design counter_16bit.v counter_16bit_tb.v
vvp my_design

This command compiles the design, which is spread across two input files, and generates the compiled result into the “my_design” file.
Another technique is to use a commandfile, which lists the input files in a text file. For example, create a text file called “file_list.txt” with the files listed one per line:

#Inside file_list.txt
counter_16bit.v
counter_16bit_tb.v
#Then compile and execute the design with command:
iverilog -o my_design -c file_list.txt
vvp my_design

VCD file is created, it can be viewed using GTKWave:

gtkwave testbench.vcd &
Waveform

Performing Design Synthesis

To perform a design synthesis:

In SymbiFlow, the synthesis of Verilog files is performed with Yosys. Yosys parses Verilog files, applies basic optimizations, performs technological mapping to FPGA blocks, and generates JSON and EBLIF files for the place and route tool.

Syntax:

ql_symbiflow -synth -src <source complete path> -d <device> -t <top module name> -v <verilog files>
cd <INSTALL_PATH>/quicklogic-arch-defs/tests/counter_16bit

and run the below command:

ql_symbiflow -synth -d ql-eos-s3 -t top -v counter_16bit.v

Output files for synthesis are:
<TOP>.eblif : netlist file for the design
<TOP>_synth.log : synthesis log information, refer this file for any issues during synthesis


Resource utilization in the top_synth.log of the counter:

Number of wires: 384
Number of wire bits: 384
Number of public wires: 382
Number of public wire bits: 382
Number of memories: 0
Number of memory bits: 0
Number of processes: 0
Number of cells: 67
BIDIR_CELL 18
CLOCK_CELL 1
C_FRAG 4
GMUX_IP 1
Q_FRAG 16
T_FRAG 27

Note

> All the output log files will be dumped in {source path}/build folder
> -src command is optional if run from the same directory where source files are present.

 

Running pack, Place and Route tools (EOS-S3)

The eblif file generated during the synthesis is used for pack, place and route along with device information, pcf and the sdc file.


Syntax:

ql_symbiflow -compile -src <source complete path> -d <device> -t <top module name> -v <verilog files> -p <pcf file> -P <Package file> -s <SDC file>
The output files dumped will be:


<TOP>.net : Once packing is complete.
<TOP>.place : Placer file from VPR
<TOP>.route  : Router file from VPR

One can refer to the pack.log, placer.log, router.log for more information related to each tool.

cd <INSTALL_PATH>/quicklogic-arch-defs/tests/counter_16bit
ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc

The above command will also run synthesis if it was not run before.

To Generate Various files during compile, use the below options Common command with just output file change:

ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc -dump jlink/post_verilog/header

To Generate the Post-Layout Verilog file

This is the Verilog file used for the functional simulation to verify the Place and Route output.

Syntax:

ql_symbiflow -compile -src <source complete path> -d <device> -t <top module name> -v <verilog files> -p <pcf file> -P <Package file> -s <SDC file> -dump post_verilog

The output files dumped will be:

top_bit.v : Post layout Verilog file (for verifying the configuration bits)
top_post_synthesis.v : Post layout Verilog file (for timing simulation)
top_post_synthesis.sdf : SDF file (for timing simulation)

ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc -dump post_verilog

The Timing analysis refer the files report_timing.hold.rpt, report_timing.setup.rpt and top.log inside the build folder

For the counter design below is the timing report from the top.log file:

Hold Worst Negative Slack (hWNS): 0 ns
Hold Total Negative Slack (hTNS): 0 ns
Setup Worst Negative Slack (sWNS): -35.2295 ns
Setup Total Negative Slack (sTNS): -1062.29 ns
Final critical path: 35.2295 ns, Fmax: 28.3853 MHz

Performing the Post-Layout Simulation (verifying the configuration bits)

Post layout Simulation using the configuration bits, uses the device configuration bit file top_bit.v

The testbench for the counter design is present at:
<Install_Path>/quicklogic-arch-defs/tests/counter_16bit/

The post-layout design netlist is present at:
<Install_Path>/quicklogic-arch-defs/counter_16bit/top_bit.v

The primitive file library file is present at:
<Install_Path>/conda/share/yosys/quicklogic/cells_sim.v

Note

cells_sim.v : This file has the definition for predefined macros

Performing the Post-Layout Timing Simulation

Post layout Timing simulation uses the SDF(Standard Delay Format) file.

The testbench for the counter design is present at:
<Install_Path>/quicklogic-arch-defs/tests/counter_16bit/

The post-layout design netlist is present at:
<Install_Path>/quicklogic-arch-defs/counter_16bit/build/top_post_synthesis.v

The SDF file is present at:
<Install_Path>/quicklogic-arch-defs/counter_16bit/build/top_post_synthesis.sdf

The primitive file library file is present at:
<Install_Path>/quicklogic-arch-defs/share/techmaps/quicklogic/techmap/cells_sim.v

The ram primitive file is present at:
<Install_Path>/quicklogic-arch-defs/share/arch/ql-eos-s3_wlcsp/cells/ram_sim.v

To perform a post-layout simulation:


- Perform a post-layout simulation of the Verilog code use iverilog.
- View the simulation results in the Waveform/ Data Analyzer and verify.

Note

cells_sim.v : This file has the definition for technology mapped macros
ram_sim.v : Has the ram definition

Generate the ASCII header file format

Ascii header file can be generated from the jlink or the .bit file.

Syntax:

ql_symbiflow -compile -src <source complete path> -d <device> -t <top module name> -v <verilog files> -p <pcf file> -P <Package file> -s <SDC file> -dump header
The output files dumped will be :


<TOP>_bit.h - file generated from the bit file input

ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc  -dump header
The generated header file can be used in M4 application program to load FPGA


The output files can be dumped for all as:

ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc  -dump header jlink post_verilog

Generate the Binary File format

FPGA Binary file can be generated, which will contain the following components:

  1. FPGA Bitstream

  2. FPGA MemInit (RAM Block Initialization)

  3. FPGA IOMux Configuration

Then, FPGA bin [${TOP}.bin] == bitstream bin + meminit bin + iomux bin

We will need a header in the FPGA bin which indicates the component information (sizes).

The diagrams below show a complete picture of the FPGA bin structure.

FPGA bin header

_images/fpga-bin-structure-header.png

The header contains the fields:

  • FPGA BIN VERSION - which will help handle future changes in bin structure if needed. Currently at v0.1.

  • BITSTREAM BIN SIZE, CRC - size in bytes, and crc of the bitstream binary content

  • MEMINIT BIN SIZE, CRC - size in bytes, and crc of the meminit binary content

  • IOMUX BIN SIZE, CRC - size in bytes, and crc of the iomux binary content

  • RESERVED WORD - for future usage

FPGA bitstream bin

_images/fpga-bin-structure-bitstream.png

The bitstream bin will have 4B words, exactly as is currently generated in ${TOP}.bit

FPGA meminit bin

_images/fpga-bin-structure-meminit.png

The meminit bin will have the same structure as is currently generated in the header method.

For each RAM block, we will have:

  • RAM block start address 4B

  • RAM block size 4B

  • size B of initialization values

This set will be repeated for as many RAM blocks intialized in the design.

FPGA iomux bin

_images/fpga-bin-structure-iomux.png

The iomux bin will have a set of pad configurations, each pad configuration is:

  • 4B Reg Address

  • 4B Reg Value

The number of pad configurations would be equal to the number of pads used by the FPGA design.

Syntax:

ql_symbiflow -compile -src <source complete path> -d <device> -t <top module name> -v <verilog files> -p <pcf file> -P <Package file> -s <SDC file> -dump binary

The output files dumped will be :

<TOP>.bin - file generated from the bit file input

ql_symbiflow -compile -src $PWD -d ql-eos-s3 -t top -v counter_16bit.v -p chandalar.pcf -P PD64 -s counter_16bit.sdc -dump binary

The generated binary file can then be flashed into the board with the programmer, and the bootloader can automatically can load the FPGA design.

PCF Sample

The PCF file is for fix placing the IO to a particular IO location on the device. For S3B device we have 3 packages PD64, PU64 and WR42.

For package PD64, the counter_16bit has the below IO placements:
Syntax: set_io <port_name> <Package IO>

set_io clk A3
set_io enable C1
set_io reset A1
set_io count(0) A2
set_io count(1) B2
set_io count(2) C3
set_io count(3) B3
set_io count(4) B1
set_io count(5) C4
set_io count(6) B4
set_io count(7) A4
set_io count(8) C5
set_io count(9) B5
set_io count(10) D6
set_io count(11) A5
set_io count(12) C6
set_io count(13) E7
set_io count(14) D7
set_io count(15) E8

PCF reference file for various the below packages

The highlighted pins are the clock ports and can also be used as BIDIR IO. Either IO Location or Alias name can be used.

_images/table_1.PNG

Hardware Limitations and Online References

Limitations:

  • RAM/FIFO: Only symmetrical combinations of RAM are supported

References:
SDC constraints information
VPR flow and the files info

S3B Device

Hardmacro Resources

  • RAMs
    - 8 blocks of 8K bits

  • FIFO
    - 8 in-build FIFO controllers
    - Can be configured into FIFOs using above RAM blocks

  • Multipliers
    - 2 (32X32) in-built multipliers

RAM Features

  • 8Kbits/RAM

  • X8, x16 and x32 data bus width

  • Independent programmability of read and write data bus widths

  • Asynchronous clocks

  • Supports 2 RAM block vertical or horizontal concatenation((i.e. 16Kbits RAM combining 2 8Kbits RAM Blocks)

  • Supports clock disabling during idle operation

FIFO Features

  • X8, x16 and x32 data bus width

  • Configurable Synchronous/Asynchronous operation

  • Supports 2 RAM block vertical or horizontal concatenation((i.e. 16Kbits RAM combining 2 - 8Kbits RAM Blocks)

  • Independent programmability of data bus width on PUSH and POP side

  • Switchable clock domain between PUSH and POP side during asynchronous operation

  • Supports clock disabling during idle operation

  • Asynchronous Reset (aside from the synchronous FLUSH) going to the pointers

Multiplier Features

  • 2 (32-bit) Multiplier

  • Can be configured as 4 16-bit multipliers

  • Signed multiplier

  • Supports Latched input

Macro Usage and examples

RAM Usage

The RAM macros (RAM_8K_BLK.v & RAM_16K_BLK.v) are part of pp3_cells_sim.v at:
<Install_Path>/conda/share/yosys/quicklogic

The examples of RAMs are present at:
<Install_Path>/quicklogic-arch-defs/tests/RAM_Examples

The Design example using S3 SRAM block are present at:
<Install_Path>/quicklogic-arch-defs/tests/ram_test

  1. RAM_8K_BLK RAM macro is 8K bits block which can be configured as:

  • 1 independent 8Kbits RAM block

  • RAM can be initialized through INIT or INIT_FILE

  1. RAM_16K_BLK RAM macro is a 16K bits block which can be configured as:

  • A horizontal concatenated block (16Kbits)

  • A vertical concatenated block (16Kbits)

  • RAM can be initialized through INIT or INIT_FILE

Example 1: 1 8Kbits RAM

module r512x16_512x16 (WA,RA,WD,WClk,RClk,WClk_En,RClk_En,WEN,RD);
    input [8:0] WA;
    input [8:0] RA;
    input WClk,RClk;
    input WClk_En,RClk_En;
    input [1:0] WEN;
    input [15:0] WD;
    output [15:0] RD;

    parameter [16383:0] INIT = 16384'b0;
    parameter INIT_FILE="init_512x16.hex";

    parameter addr_int = 9 ;
    parameter data_depth_int = 512;
    parameter data_width_int = 16;
    parameter wr_enable_int = 2;
    parameter reg_rd_int = 0;

    RAM_8K_BLK #(.addr_int(addr_int),.data_depth_int(data_depth_int),.data_width_int(data_width_int),.wr_enable_int(wr_enable_int),.reg_rd_int(reg_rd_int),
                              .INIT(INIT),.INIT_FILE(INIT_FILE)
                              )
    RAM_INST (      .WA(WA), .RA(RA), .WD(WD), .WClk(WClk), .RClk(RClk), .WClk_En(WClk_En), .RClk_En(RClk_En), .WEN(WEN), .RD(RD));
endmodule

Example 2: Horizontal Concatenation

  • 512x32 RAM (16 Kbits)

  • RAM can be initialized through INIT or INIT_FILE

module r512x32_512x32 (WA,RA,WD,WClk,RClk,WClk_En,RClk_En,WEN,RD);
    input [8:0] WA;
    input [8:0] RA;
    input WClk,RClk;
    input WClk_En,RClk_En;
    input [3:0] WEN;
    input [31:0] WD;
    output [31:0] RD;

    parameter [16383:0] INIT = 16384'b0;
    parameter INIT_FILE="init_512x32.hex";

    parameter addr_int = 9 ;
    parameter data_depth_int = 512;
    parameter data_width_int = 32;
    parameter wr_enable_int = 4;
    parameter reg_rd_int = 0;

    RAM_16K_BLK #(.addr_int(addr_int),.data_depth_int(data_depth_int),.data_width_int(data_width_int),.wr_enable_int(wr_enable_int),.reg_rd_int(reg_rd_int),
                              .INIT(INIT),.INIT_FILE(INIT_FILE)
                              )
    RAM_INST (      .WA(WA), .RA(RA), .WD(WD), .WClk(WClk), .RClk(RClk), .WClk_En(WClk_En), .RClk_En(RClk_En), .WEN(WEN), .RD(RD));
endmodule

Example 3: Vertical Concatenation

  • 2048 x 8 RAM (16 Kbits)

  • RAM can be initialized through INIT or INIT_FILE

module r2048x8_2048x8 (WA,RA,WD,WClk,RClk,WClk_En,RClk_En,WEN,RD);
    input [10:0] WA;
    input [10:0] RA;
    input WClk,RClk;
    input WClk_En,RClk_En;
    input WEN;
    input [7:0] WD;
    output [7:0] RD;

    parameter [16383:0] INIT = 16384'b0;
    parameter INIT_FILE="init_2048x8.hex";

    parameter addr_int = 11 ;
    parameter data_depth_int = 2048;
    parameter data_width_int = 8;
    parameter wr_enable_int = 1;
    parameter reg_rd_int = 0;


    RAM_16K_BLK #(.addr_int(addr_int),.data_depth_int(data_depth_int),.data_width_int(data_width_int),.wr_enable_int(wr_enable_int),.reg_rd_int(reg_rd_int),
                        .INIT(INIT),.INIT_FILE(INIT_FILE)
                              )
    RAM_INST (      .WA(WA), .RA(RA), .WD(WD), .WClk(WClk), .RClk(RClk), .WClk_En(WClk_En), .RClk_En(RClk_En), .WEN(WEN), .RD(RD));
endmodule

FIFO Usage

The FIFO macros (FIFO_8K_BLK.v & FIFO_16K_BLK.v) are part of pp3_cells_sim.v at:
<Install_Path>/conda/share/yosys/quicklogic

The examples of FIFOs are present at:
<Install_Path>/quicklogic-arch-defs/tests/FIFO_Examples

The Design example using S3 FIFO block are present at:
<Install_Path>/quicklogic-arch-defs/tests/fifo_test

Example 1: 1 8Kbits FIFO

  • FIFO 512 x 16

  • Asynchronous FIFO

module af512x16_512x16 (DIN,Fifo_Push_Flush,Fifo_Pop_Flush,PUSH,POP,Push_Clk,Pop_Clk,Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush,Almost_Full,Almost_Empty,PUSH_FLAG,POP_FLAG,DOUT);
    input Fifo_Push_Flush,Fifo_Pop_Flush;
    input Push_Clk,Pop_Clk;
    input PUSH,POP;
    input [15:0] DIN;
    input Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush;
    output [15:0] DOUT;
    output [3:0] PUSH_FLAG,POP_FLAG;
    output Almost_Full,Almost_Empty;

    parameter data_depth_int = 512;
    parameter data_width_int = 16;
    parameter reg_rd_int = 0;
    parameter sync_fifo_int = 0;

    FIFO_8K_BLK  # (.data_depth_int(data_depth_int),.data_width_int(data_width_int),.reg_rd_int(reg_rd_int),.sync_fifo_int(sync_fifo_int)
             )
      FIFO_INST  ( .DIN(DIN), .PUSH(PUSH), .POP(POP), .Fifo_Push_Flush(Fifo_Push_Flush), .Fifo_Pop_Flush(Fifo_Pop_Flush), .Push_Clk(Push_Clk),
            .Pop_Clk(Pop_Clk),.PUSH_FLAG(PUSH_FLAG), .POP_FLAG(POP_FLAG), .Push_Clk_En(Push_Clk_En), .Pop_Clk_En(Pop_Clk_En),
            .Fifo_Dir(Fifo_Dir),  .Async_Flush(Async_Flush), .Almost_Full(Almost_Full), .Almost_Empty(Almost_Empty), .DOUT(DOUT));
endmodule


Example 2: Horizontal Concatenation

  • FIFO 512 x 32

  • Asynchronous FIFO

module af512x32_512x32 (DIN,Fifo_Push_Flush,Fifo_Pop_Flush,PUSH,POP,Push_Clk,Pop_Clk,Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush,Almost_Full,Almost_Empty,PUSH_FLAG,POP_FLAG,DOUT);
    input Fifo_Push_Flush,Fifo_Pop_Flush;
    input Push_Clk,Pop_Clk;
    input PUSH,POP;
    input [31:0] DIN;
    input Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush;
    output [31:0] DOUT;
    output [3:0] PUSH_FLAG,POP_FLAG;
    output Almost_Full,Almost_Empty;

    parameter data_depth_int = 512;
    parameter data_width_int = 32;
    parameter reg_rd_int = 0;
    parameter sync_fifo_int = 0;

    FIFO_16K_BLK  # (.data_depth_int(data_depth_int),.data_width_int(data_width_int),.reg_rd_int(reg_rd_int),.sync_fifo_int(sync_fifo_int)
                                     )
      FIFO_INST  ( .DIN(DIN), .PUSH(PUSH), .POP(POP), .Fifo_Push_Flush(Fifo_Push_Flush), .Fifo_Pop_Flush(Fifo_Pop_Flush), .Push_Clk(Push_Clk),
            .Pop_Clk(Pop_Clk), .PUSH_FLAG(PUSH_FLAG), .POP_FLAG(POP_FLAG), .Push_Clk_En(Push_Clk_En), .Pop_Clk_En(Pop_Clk_En), .Fifo_Dir(Fifo_Dir),
            .Async_Flush(Async_Flush), .Almost_Full(Almost_Full), .Almost_Empty(Almost_Empty), .DOUT(DOUT));

endmodule

Example 3: Vertical Concatenation

  • FIFO 1024 x 16

  • Synchronous FIFO

module f1024x16_1024x16 (DIN,Fifo_Push_Flush,Fifo_Pop_Flush,PUSH,POP,Clk,Clk_En,Fifo_Dir,Async_Flush,Almost_Full,Almost_Empty,PUSH_FLAG,POP_FLAG,DOUT);
    input Fifo_Push_Flush,Fifo_Pop_Flush;
    input Clk;
    input PUSH,POP;
    input [15:0] DIN;
    input Clk_En,Fifo_Dir,Async_Flush;
    output [15:0] DOUT;
    output [3:0] PUSH_FLAG,POP_FLAG;
    output Almost_Full,Almost_Empty;

    parameter data_depth_int = 1024;
    parameter data_width_int = 16;
    parameter reg_rd_int = 0;
    parameter sync_fifo_int = 1;

    FIFO_16K_BLK  # (.data_depth_int(data_depth_int),.data_width_int(data_width_int),.reg_rd_int(reg_rd_int),.sync_fifo_int(sync_fifo_int)
                                     )
      FIFO_INST (.DIN(DIN), .PUSH(PUSH), .POP(POP), .Fifo_Push_Flush(Fifo_Push_Flush), .Fifo_Pop_Flush(Fifo_Pop_Flush), .Push_Clk(Clk),
            .Pop_Clk(Clk), .PUSH_FLAG(PUSH_FLAG), .POP_FLAG(POP_FLAG), .Push_Clk_En(Clk_En), .Pop_Clk_En(Clk_En), .Fifo_Dir(Fifo_Dir),
            .Async_Flush(Async_Flush), .Almost_Full(Almost_Full), .Almost_Empty(Almost_Empty), .DOUT(DOUT));
endmodule

Multiplier Usage

The Multiplier macros are present at:
<Install_Path>/conda/share/yosys/quicklogic

  1. 32 x 32 Multiplier

  • Configured as 1 32x32 multiplier

module MULT_32BIT (Amult, Bmult, Valid_mult, Cmult);
    input [31:0] Amult;
    input [31:0] Bmult;
    input  Valid_mult;
    output [63:0] Cmult;

    wire [1:0] valit_int;

    assign valit_int = {Valid_mult,Valid_mult};

    //qlal4s3_mult_cell_macro
    qlal4s3_mult_cell_macro u_qlal4s3_mult_cell_macro (.Amult(Amult), .Bmult(Bmult), .Valid_mult(valit_int), .sel_mul_32x32(1'b1), .Cmult(Cmult));
endmodule
  1. 16 x 16 Multiplier

  • Configured as 1 16x16 multiplier

module MULT_16BIT_X2 ( Amult1, Bmult1, Valid_mult1, Cmult1,
                       Amult2, Bmult2, Valid_mult2, Cmult2 );
    input [15:0] Amult1;
    input [15:0] Bmult1;
    input Valid_mult1;
    output [31:0] Cmult1;

    input [15:0] Amult2;
    input [15:0] Bmult2;
    input Valid_mult2;
    output [31:0] Cmult2;

    wire [31:0] amult_int;
    wire [31:0] bmult_int;
    wire [63:0] cmult_int;
    wire [1:0] valit_int;

    assign valit_int = {Valid_mult2,Valid_mult1};
    assign amult_int = {Amult2,Amult1};
    assign bmult_int = {Bmult2,Bmult1};
    assign Cmult1 = cmult_int[31:0];
    assign Cmult2 = cmult_int[63:32];

    //qlal4s3_mult_cell_macro
    qlal4s3_mult_cell_macro u_qlal4s3_mult_cell_macro (.Amult(amult_int), .Bmult(bmult_int), .Valid_mult(valit_int), .sel_mul_32x32(1'b0), .Cmult(cmult_int));
endmodule

Design example Using SRAMs

The Design example using S3 SRAM block are present at:
<Install_Path>/quicklogic-arch-defs/tests/ram_test

Address Map:

Address Table

RAM Initialization files are at:
<Install_Path>/quicklogic-arch-defs/tests/ram_test
Ex. init_2048x8.hex, init_512x32.hex, init_1024x8.hex

Design example Using FIFOs

The Design example using S3 FIFO block are present at:
<Install_Path>/quicklogic-arch-defs/tests/fifo_test

Address Map:

Address Table

Push Flag Description:

Value

Status

0000

Full

0001

Empty

0010

Room for more than one-half

0011

Room for more than one-fourth

0100

Room for less than one-fourth full to 64

1010

Room for 32 to 63

1011

Room for 16 to 31

1100

Room for 8 to 15

1101

Room for 4 to 7

1110

Room for at least 2

1111

Room for at least 1

Others

Reserved

Pop Flag Description:

Value

Status

0000

Empty

0001

1 entry in FIFO

0010

At least 2 entries in FIFO

0011

At least 4 entries in FIFO

0100

At least 8 entries in FIFO

0101

At least 16 entries in FIFO

0110

At least 32 entries in FIFO

1000

Less than one-fourth to 64 full

1101

One-fourth or more full

1110

One-half or more full

1111

Full

Others

Reserved