| Device Architecture Notes | 
 | ========================= | 
 |  | 
 | The following notes describe in more details the approach required to add new architectures, or enhance an already | 
 | existing architecture with additional tiles and primitives. | 
 |  | 
 | Adding new tiles and primitives | 
 | ------------------------------- | 
 |  | 
 | In Symbiflow Architecture Definitions, this process requires modifications of two parts in the flow which can be | 
 | summarized in the following points: | 
 |  | 
 | - **VTR** Physical Block type definition | 
 | - **Yosys** techmap definition | 
 |  | 
 | Physical Block Type Definition | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | This is a VTR-related file which includes a detailed description of the internal logic of the block, as well as its I/O | 
 | interface. | 
 |  | 
 | More details can be gathered in the :ref:`official VTR documentation <vtr:arch_reference>`. | 
 |  | 
 | The primitives are located under `<vendor>/<fpga-family>/common/primitives/`. | 
 | In general, there should be one subdirectory for each different primitive, or in alternative for each intermediate site | 
 | that contains a primitive. | 
 |  | 
 | It is common that a primitive is included in a hierarchy of Physical Block Types (PB types) before reaching the | 
 | Top-level one. | 
 |  | 
 | The PB types must conform to the physical representation of the primitive/site that needs to be modeled. | 
 | To understand the interconnections and composition of each primitive/site, usually it is necessary to read the | 
 | vendor-provided documentation of the particular block that needs to be modeled. | 
 |  | 
 | CMake is used to generate all the targets to include the newly added primitive to the architecture | 
 |  | 
 | The Symbiflow Architecture Definitions project provides a well documented CMake library of functions to aid in this | 
 | process. | 
 | The common functions are located under `common/cmake/` while the vendor-specific ones are located under | 
 | `<vendor>/<fpga-family>/common/cmake`. | 
 |  | 
 | The new tiles and primitives must be enabled by creating new `CMakeLists.txt` files within the corresponding directories | 
 | in the following locations: | 
 |  | 
 | - **Primitives**: `<vendor>/<fpga-family>/common/primitives/<primitive>` | 
 | - **Tile**: `<vendor>/<fpga-family>/archs/<arch>/tiles/<tile>` | 
 |  | 
 | Moreover, each new directory needs to be added to the parent `CMakeLists.txt`, so that CMake can find and process the | 
 | new additions. | 
 |  | 
 | The enable a new tile/pb_type in a target device, the device CMake file needs to be changed accordingly, as follows: | 
 |  | 
 | .. code-block:: cmake | 
 |  | 
 |    add_xc_device_define_type( | 
 |      ARCH artix7 | 
 |      DEVICE xc7a50t | 
 |      TILE_TYPES | 
 |        CLBLL_L | 
 |        CLBLL_R | 
 |        CLBLM_L | 
 |        CLBLM_R | 
 |        NEW_TILE | 
 |      PB_TYPES | 
 |        SLICEL | 
 |        SLICEM | 
 |        NEW_PB_TYPE | 
 |    ) | 
 |  | 
 | The device `CMakeLists.txt` file is located under `<vendor>/<fpga-family>/archs/<arch>/devices/<device>/`. | 
 |  | 
 | Yosys Techmap and Simulation models | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | Yosys is the synthesis tool used in Symbiflow, but, to allow VPR to elaborate Yosys output netlist, we need to perform a | 
 | technology mapping pass to transform the Yosys-generated primitives to the VPR-compatible ones. | 
 |  | 
 | To do so, there are two relevant files to modify, both located under `<vendor>/<fpga-family>/techmap`: | 
 |  | 
 | - `cellmap.v`: Defines how specific cells need to be re-mapped. | 
 | - `cellsim.v`: Defines the VPR-specific cells that will be present in the `.eblif` output. |