# Fuzzer for the PIPs of CMT_TOP_[LR]_LOWER_B tiles.

The fuzzer instantiates a MMCM in each available site with 2/3 probability of using it. Once used it is connected randomly to various clock and logic resources.

For some nets a randomized "manual" route is chosen to cover as many routing scenarios as possible.

The information whether a MMCM is used or not is stored in a file (`"design.txt"`) along with the randomized route (`route.txt`)

After the design synthesis the `generate.py` sets fixed routes on some nets which is read from the `route.txt` file. The rest of the design is routed in the regular way. The script also dumps all used PIPs (as reported by Vivado) to the `design_pips.txt`.

The tag generation is done in the following way:

- If a MMCM site is occupied then tags for all active PIPs are emitted as 1s. No tags are emitted for inactive PIPs.
- When a MMCM site is not occupied (IN_USE=0) then tags for all PIPs for the CMT tile are emitted as 0s.
- The IN_USE tag is emitted directly.

The raw solution of tag bits is postprocessed via the custom script `fixup_and_group.py`. The script does two things:

- Clears all bits found for the IN_USE tag in all other tags. Those bits are common to all of them.
- Groups tags according to the group definitions read from the `tag_groups.txt` file. Bits that are common to the group are set as 0 in each tag that belongs to it (tags within a group are exclusive).
