| Guide to adding a new device to an existing family | 
 | ================================================== | 
 |  | 
 | This documents how to add support for a new device. The running example | 
 | is the addition of the xc7a100t device to the Artix-7 family. | 
 |  | 
 | Adding a new device to an existing family is much simpler than adding a | 
 | new family, since the building blocks (tiles) are already known. There | 
 | are just more or fewer of them, arranged differently. No new fuzzers are | 
 | needed. You just need to rerun some fuzzers for the new device to | 
 | understand how the tiles are connected to each other and to IOs. | 
 |  | 
 | Note: Since this guide was written, the xc7a100t has become the primary | 
 | device in the database, not a secondary device as it was when it was | 
 | originally added. Therefore the files currently in the repo don’t match | 
 | what is described here. But if you look at the original PRs, they match | 
 | what is described in the examples here. | 
 |  | 
 | The main PR from the example is | 
 | `#1313 <https://github.com/SymbiFlow/prjxray/pull/1313>`__. Followup | 
 | fixes for problems revealed during testing are | 
 | `#1334 <https://github.com/SymbiFlow/prjxray/pull/1334>`__ and | 
 | `#1336 <https://github.com/SymbiFlow/prjxray/pull/1336>`__. | 
 |  | 
 | Step 0 | 
 | ~~~~~~ | 
 |  | 
 | Fork a copy of https://github.com/SymbiFlow/prjxray on GitHub (go to the | 
 | page, click “Fork” button, select your own workspace). | 
 |  | 
 | Clone your fork, and make a new branch, with a name related to the new | 
 | device/package: | 
 |  | 
 | :: | 
 |  | 
 |    git clone git@github.com:<yourUserID>/prjxray.git | 
 |    cd prjxray | 
 |    git checkout -b <new_branch_name> | 
 |  | 
 | Step 1 | 
 | ~~~~~~ | 
 |  | 
 | Follow the Project X-Ray developer setup instructions in the | 
 | `documentation <https://symbiflow.readthedocs.io/en/latest/prjxray/docs/db_dev_process/readme.html>`__, | 
 | up through Step 7 and choose Option 1 (invoke the | 
 | ``./download-latest-db.sh`` script). This script will clone the official | 
 | prjxray-db database under ``database/``. The following steps will make | 
 | changes under this directory. You may want to put these changes on your | 
 | own fork of ``prjxray-db`` for testing. This is explained at the end, | 
 | under “Database Updates”. | 
 |  | 
 | Step 2 | 
 | ~~~~~~ | 
 |  | 
 | Add a new settings file. Usually you will start with an existing | 
 | settings file and modify it. Assuming you’re in prjxray/, | 
 |  | 
 | :: | 
 |  | 
 |    cp settings/<baseline_device>.sh settings/<new_device>.sh | 
 |    git add settings/<new_device>.sh | 
 |  | 
 | Example: | 
 |  | 
 | :: | 
 |  | 
 |    cp settings/artix7_200t.sh settings/artix7_100t.sh | 
 |    git add settings/artix7_100t.sh | 
 |  | 
 | Update the following values in the new settings file: | 
 |  | 
 | -  ``XRAY_PART`` – | 
 |    Important: choose a package that is fully bonded (typically the one with | 
 |    the largest number of pins). If the part that you’re actually interested | 
 |    in is different (with fewer bonded pins), it will be handled later. In | 
 |    the running example, the actual part of interest was the xc7a100tcsg324, | 
 |    since that is on the Arty A7-100T board. But here, the xc7a100tfgg676 | 
 |    part is used; the xc7a100tcsg324 is handled later. | 
 |  | 
 | -  ``XRAY_ROI_TILEGRID`` – modify the bounding boxes to be a tight fit on | 
 |    your new part. | 
 |  | 
 | -  ``XRAY_IOI3_TILES`` – These tiles need special | 
 |    handling for an irregularity in Xilinx 7-series FPGAs. See the | 
 |    `comments <https://github.com/SymbiFlow/prjxray/blob/master/fuzzers/005-tilegrid/generate_full.py#L401>`__ | 
 |    in the 005 fuzzer for more information. | 
 |  | 
 | `This <https://github.com/SymbiFlow/prjxray/blob/master/settings/artix7_100t.sh>`__ | 
 | is what the new settings file looked like in the example. | 
 |  | 
 | Source this new settings file: | 
 |  | 
 | :: | 
 |  | 
 |    source settings/<new_device>.sh | 
 |  | 
 | Step 3 | 
 | ~~~~~~ | 
 |  | 
 | The project needs to know which device is now available and which fabric it | 
 | uses. Because some devices share the same fabric, this mapping needs to be | 
 | done manually. Edit the device.yaml file for the used family under | 
 | settings/<familiy>/device.yaml be adding the device-fabric mapping: | 
 |  | 
 | :: | 
 |  | 
 |   # device to fabric mapping | 
 |   "xc7a200t": | 
 |     fabric: "xc7a200t" | 
 |   "xc7a100t": | 
 |     fabric: "xc7a100t" | 
 |   "xc7a50t": | 
 |     fabric: "xc7a50t" | 
 |   "xc7a35t": | 
 |     fabric: "xc7a50t" | 
 |  | 
 | Now, generate all device information for the family: | 
 |  | 
 | :: | 
 |  | 
 |   make db-prepare-artix7 | 
 |  | 
 | Step 4 | 
 | ~~~~~~ | 
 |  | 
 | Edit the top Makefile | 
 |  | 
 | -  Update the Makefile by adding the new device to the `correct | 
 |    list <https://github.com/tcal-x/prjxray/blob/fbf4dd897d5a1025ebfeb7c51c5077a6b6c9bc47/Makefile#L171>`__, | 
 |    so that the Makefile generates targets for the new device (used in | 
 |    Step 4). ``<new_device>`` is the basename of the new settings file | 
 |    that you just created. | 
 |  | 
 | :: | 
 |  | 
 |    <FAMILY>_PARTS=<existing_devices> <new_device> | 
 |  | 
 | -  In our running example, we add ``artix7_100t`` to ``ARTIX_PARTS``: | 
 |  | 
 | :: | 
 |  | 
 |    ARTIX_PARTS=artix7_200t artix7_100t | 
 |  | 
 | Step 5 | 
 | ~~~~~~ | 
 |  | 
 | Make sure you’ve sourced your new device settings file (see the end of | 
 | step 2) and generated the device information (see the end of set 3). Now it is | 
 | time to run some fuzzers to figure out how the tiles on your new device are | 
 | connected. | 
 |  | 
 | Make the following target, with ``<new_device>`` as above, and setting | 
 | the parallelism factor ``-j<n>`` appropriate for the number of cores | 
 | your host has. The make job can benefit from large numbers of cores. | 
 |  | 
 | :: | 
 |  | 
 |    make -j<n> MAX_VIVADO_PROCESS=<n> db-part-only-<new_device> | 
 |  | 
 | Again, ``<new_device>`` must match the base name of the new settings | 
 | file that was added. For example, | 
 |  | 
 | :: | 
 |  | 
 |    make -j32 MAX_VIVADO_PROCESS=32 db-part-only-artix7_100t | 
 |  | 
 | -  It should run fuzzers 000, 001, 005, 072, 073, 074, and 075. | 
 |  | 
 | -  005 will take a long time. Using multiple cores will help. | 
 |  | 
 | -  074 *will fail* the first time, since it hasn’t been told to ignore | 
 |    certain wires. | 
 |  | 
 |    -  After it fails, go to the build directory | 
 |       ``cd fuzzers/074-dump_all/build_<XRAY_PART>`` (this is the | 
 |       ``XRAY_PART`` from the new settings script; in our example, the | 
 |       build directory is | 
 |       ``fuzzers/074-dump_all/build_xc7a100tfgg676-1/``). | 
 |    -  Run | 
 |       ``python3 ../analyze_errors.py --output_ignore_list  > new-ignored`` | 
 |    -  Inspect and compare ``new-ignored`` against existing ignored wire | 
 |       files in ``../ignored_wires/``. | 
 |    -  If it looks good, copy it to an appropriately-named file: | 
 |       ``cp new-ignored ../ignored_wires/artix7/<XRAY_PART>_ignored_wires.txt`` | 
 |       (in our example, it is | 
 |       ``../ignored_wires/artix7/xc7a100tfgg676-1_ignored_wires.txt``). | 
 |    -  Add it: | 
 |       ``git add ../ignored_wires/artix7/<XRAY_PART>_ignored_wires.txt`` | 
 |  | 
 | -  Return to prjxray/ directory, and clean up 074 to prepare for the | 
 |    rerun: ``make -C fuzzers/074-dump-all clean`` | 
 |  | 
 | -  Rerun the top make command, | 
 |    e.g. ``make -j32 MAX_VIVADO_PROCESS=32 db-part-only-artix7_100t`` | 
 |  | 
 | Step 6 | 
 | ~~~~~~ | 
 |  | 
 | The next task is handling the extra parts – those not fully bonded out. | 
 | These are usually the parts you actually have on the boards you buy. | 
 |  | 
 | After the fabric data is generated with step 5, an further target can generate | 
 | all extra parts for the device. | 
 |  | 
 | :: | 
 |  | 
 |    make -j<n> MAX_VIVADO_PROCESS=<n> db-roi-only-<new_device> | 
 |  | 
 | Step 7 | 
 | ~~~~~~ | 
 |  | 
 | Do a spot check. | 
 |  | 
 | -  Check that there are new part directories in the database under the family subdirectory, for example: | 
 |  | 
 | :: | 
 |  | 
 |    $ ll database/artix7/xc7a* | 
 |    xc7a35tftg256-1: | 
 |    total 48 | 
 |    -rw-rw-r-- 1 daniel daniel  8234 Jan  9 13:01 package_pins.csv | 
 |    -rw-rw-r-- 1 daniel daniel 18816 Jan  9 13:01 part.json | 
 |    -rw-rw-r-- 1 daniel daniel 13099 Jan  9 13:01 part.yaml | 
 |  | 
 |    xc7a50t: | 
 |    total 15480 | 
 |    -rw-rw-r-- 1 daniel daniel  695523 Jan  9 12:53 node_wires.json | 
 |    -rw-rw-r-- 1 daniel daniel 8587682 Jan  9 12:53 tileconn.json | 
 |    -rw-rw-r-- 1 daniel daniel 6562851 Jan  9 10:31 tilegrid.json | 
 |  | 
 |    xc7a50tfgg484-1: | 
 |    total 52 | 
 |    -rw-rw-r-- 1 daniel daniel 13056 Jan  9 09:54 package_pins.csv | 
 |    -rw-rw-r-- 1 daniel daniel 18840 Jan  9 09:58 part.json | 
 |    -rw-rw-r-- 1 daniel daniel 13099 Jan  9 09:58 part.yaml | 
 |  | 
 | Note: These changes/additions under ``database/`` do *not* get checked | 
 | in. They are in the ``prjxray-db`` repo. This spot check is to make sure | 
 | that your changes in ``prjxray`` will do the right thing when the | 
 | official database is fully rebuilt. See “Database Updates” below for | 
 | more information. | 
 |  | 
 | Step 8 | 
 | ~~~~~~ | 
 |  | 
 | Assuming everything looks good, commit to your ``prjxray`` fork/branch. | 
 | You should have a new file under settings/, a new ignored_wires file, | 
 | and a modified Makefile (see the `initial | 
 | PR <https://github.com/SymbiFlow/prjxray/pull/1313/files?file-filters%5B%5D=>`__ | 
 | of the example for reference). | 
 |  | 
 | :: | 
 |  | 
 |    git add Makefile settings/artix7_100t.sh | 
 |    git status | 
 |    git commit --signoff | 
 |  | 
 | Step 9 | 
 | ~~~~~~ | 
 |  | 
 | Push to GitHub: | 
 |  | 
 | :: | 
 |  | 
 |    git push origin <new_branch_name> | 
 |  | 
 | Then make a pull request. Navigate to the GitHub page for your | 
 | ``prjxray`` fork/branch, and click the “New pull request” button. | 
 | Making the pull request will kick off continuous integration tests. | 
 | Watch the results and fix any issues. | 
 |  | 
 | Database Updates | 
 | ~~~~~~~~~~~~~~~~ | 
 |  | 
 | The process above (steps 4 and 5) will create some new files and modify | 
 | some existing files under database/, which is a different repo, | 
 | ``prjxray-db``. | 
 |  | 
 | To test these changes before the next official prjxray-db gets built | 
 | (and even before your PR on prjxray is merged), you can put these | 
 | changes on your own fork of prjxray-db, and then test them in the | 
 | context of | 
 | `symbiflow-arch-defs <https://github.com/SymbiFlow/symbiflow-arch-defs>`__. | 
 |  | 
 | To put the db updates on your own fork, create your fork of | 
 | https://github.com/SymbiFlow/prjxray-db if you haven’t already. Then | 
 | follow one of the approaches suggested in the checked solution of this | 
 | StackOverflow | 
 | `post <https://stackoverflow.com/questions/25545613/how-can-i-push-to-my-fork-from-a-clone-of-the-original-repo>`__. | 
 |  | 
 | You are NEVER going to send a pull request on `prjxray-db`. The database is always rebuilt | 
 | from scratch. After your changes on prjxray are merged, they will | 
 | reflected in the next prjxray-db rebuild. The changes submitted to your | 
 | prjxray-db fork are only for your own testing. | 
 |  | 
 | To use your new repo/branch under | 
 | symbiflow-arch-defs/third_party/prjxray-db/, you will need to change the | 
 | submodule reference to point to your fork/branch of ``prjxray-db``. |