# SymbiFlow Architecture Definitions Import Functions

This directory contains python scripts used to import the prjxray architectures to F4PGA architecture definition repository.

The purpose of these scripts are the following:

* Create a correct XML representation of the XC7 series FPGAs.
* Create a database containing correct routing information (e.g. channels, pin assignments, etc.).

This document gives an overview of the dependencies among these scripts and their functionalities.

## Tile import

Tiles are the top level FPGA blocks that can be instantiated:

* CLB (Configurable Logic Block)
* IOB (Input Output Blcok)
* BRAM (Block RAM)
* DSP (Digital Signal Processor)
* INT (Interconnect Blocks)

They are represented by three different XML definitions:

* model.xml
* pb_type.xml
* tile.xml

`prjxray_tile_import.py` generates the `pb_type` and `model` definitions. It takes the name of the top level tile as an argument.
This script needs to be called for each different tile that has to be generated.

`prjxray_tile_type_import.py` generates the `tile` definition. It is located in a different script as it relies on the `pb_type` definitions.
In fact, each `tile` can be associated to other tiles which are defined `equivalent`. In this case, the `tile.xml` definition must include the pin mapping between the two equivalent tiles.
The pin mapping is created with the information included in the `pb_type.xml` of both the tiles, hence the `tile.xml` generation can be performed only when all the `pb_type.xml` definitions have been produced.
`pb_type.xml` are parsed to extract the pin connections of the equivalent tiles that are used to generate the pin mapping when producing `tile.xml` definitions.
