| # Design-related Tooling Scripts | 
 |  | 
 | ## Life Cycle and OTP Tools | 
 |  | 
 | ### OTP Memory Map Translation Script | 
 |  | 
 | The `gen-otp-mmap.py` script is used to translate the OTP memory map definition Hjson file into documentation and SV package collateral. | 
 | The memory map definition file for top_earlgrey is currently located at `hw/ip/otp_ctrl/data/otp_ctrl_mmap.hjson`. | 
 |  | 
 | The script can either be invoked via the makefile | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ make -C hw otp-mmap | 
 |  | 
 | ``` | 
 |  | 
 | or directly using the command | 
 |  | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ ./util/design/gen-otp-mmap.py | 
 | ``` | 
 |  | 
 | The seed value used for generating OTP-related random netlist constants can optionally be overridden with the `--seed` switch when calling the script directly. | 
 | Otherwise that seed value is taken from the Hjson file, or generated on-the-fly if the Hjson file does not contain a seed. | 
 |  | 
 | ### Life Cycle State Encoding Generator | 
 |  | 
 | The `gen-lc-state-enc.py` script is used to generate the redundant life cycle state encoding and print the constants and type definitions into the life cycle state package. | 
 | The life cycle definition file for top_earlgrey is currently located at `hw/ip/lc_ctrl/data/lc_ctrl_state.hjson`. | 
 |  | 
 | The script can either be invoked via the makefile | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ make -C hw lc-state-enc | 
 |  | 
 | ``` | 
 |  | 
 | or directly using the command | 
 |  | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ ./util/design/gen-lc-state-enc.py | 
 | ``` | 
 |  | 
 | The seed value used for generating life-cycle-state-related random netlist constants can optionally be overridden with the `--seed` switch when calling the script directly. | 
 | Otherwise that seed value is taken from the Hjson file, or generated on-the-fly if the Hjson file does not contain a seed. | 
 |  | 
 | ### OTP Preload Image Generator | 
 |  | 
 | The OTP preload image generation tool builds on top of the memory map and life cycle state generation Python classes in order to transform a memory image configuration into a memory hexfile that can be used for OTP preloading in simulation and FPGA emulation runs. | 
 | The generated hexfile is compatible with the Verilog `$readmemh` command. | 
 |  | 
 | The OTP memory image configuration file is basically an Hjson file that lists the names and corresponding values of items defined in the OTP memory map definition. | 
 | Further, since the life cycle state is stored in OTP, the image generator script also supports generating the correct life cycle state encodings. | 
 | To that end, the desired life cycle state name can be declared in the image configuration file, and the generator script looks up and assigns the correct netlist constants. | 
 |  | 
 | The following snippet shows a memory image configuration that puts the device into the `DEV` life cycle state, and that defines the SECRET2 partition items and locks down the partition: | 
 | ``` | 
 | { | 
 |     // Seed to be used for generation of partition randomized values. | 
 |     // Can be overridden on the command line. | 
 |     seed: 01931961561863975174 | 
 |  | 
 |     // The partition and item names must correspond with the OTP memory map. | 
 |     partitions: [ | 
 |         { | 
 |             name:  "SECRET2", | 
 |             // If True, a digest will be calculated for this partition. | 
 |             // Note that this only applies to partitions with a hardware digest. | 
 |             lock:  "True", | 
 |             items: [ | 
 |                 { | 
 |                     name:  "RMA_TOKEN", | 
 |                     // This item is assigned is a fixed Hex value | 
 |                     value: "0x9cfbd7383959a62a4438bc468d76eed6 ", | 
 |                 } | 
 |                 { | 
 |                     name:  "CREATOR_ROOT_KEY_SHARE0", | 
 |                     // This item will be assigned a random value, based on the seed above. | 
 |                     value: "<random>", | 
 |                 } | 
 |                 { | 
 |                     name:  "CREATOR_ROOT_KEY_SHARE1", | 
 |                     // This item will be assigned a random value, based on the seed above. | 
 |                     value: "<random>", | 
 |                 } | 
 |             ], | 
 |         } | 
 |         { | 
 |             name:  "LIFE_CYCLE", | 
 |             // Can be one of the following strings: | 
 |             // RAW, TEST_UNLOCKED0-3, TEST_LOCKED0-2, DEV, PROD, PROD_END, RMA, SCRAP | 
 |             state: "DEV", | 
 |             // Can be either "RAW", or any number from 1 to 16. | 
 |             count: "5" | 
 |         } | 
 |     ] | 
 | } | 
 | ``` | 
 |  | 
 | Common example configuration files that can be used for simulation and emulation are checked in under `hw/ip/otp_ctrl/data`, e.g. `hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson` which provisions all buffered partitions and puts the device into the `DEV` life cycle. | 
 |  | 
 | Note that the preload image generator script automatically scrambles secret partitions, computes digests of locked partitions using the PRESENT cipher, and computes the OTP ECC bits. | 
 |  | 
 | The OTP preload image generator expects at least one main image configuration file to be specified with the `--img-cfg` switch, for example: | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ ./util/design/gen-otp-img.py --img-cfg hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson \ | 
 |                                --out otp-img.mem | 
 | ``` | 
 |  | 
 | Additional configuration files can be added using the `--add-cfg` switch. | 
 | The switch can be specified multiple times, and the configuration files are processed in the order they are specified. | 
 | This allows to incrementally "patch in" additional data, if needed. | 
 |  | 
 | For example, this can be used to patch in additional software configuration data, specified in an additional file `otp_ctrl_img_sw_cfg.hjson` that looks as follows (it is also possible to split the individual items into their own files): | 
 | ``` | 
 | { | 
 |    // The partition and item names must correspond with the OTP memory map. | 
 |     partitions: [ | 
 |         { | 
 |             name:  "CREATOR_SW_CFG", | 
 |             items: [ | 
 |                 { | 
 |                     name:  "CREATOR_SW_CFG_CONTENT", | 
 |                     value: "0x0", // data to be put into this partition | 
 |                 } | 
 |                 { | 
 |                     name:  "CREATOR_SW_CFG_DIGEST", | 
 |                     value: "0x0", // 64bit digest to be written to this partition | 
 |                 } | 
 |             ], | 
 |         }, | 
 |         { | 
 |             name:  "OWNER_SW_CFG", | 
 |             items: [ | 
 |                 { | 
 |                     name:  "OWNER_SW_CFG_CONTENT", | 
 |                     value: "0x0", // data to be put into this partition | 
 |                 } | 
 |                 { | 
 |                     name:  "OWNER_SW_CFG_DIGEST", | 
 |                     value: "0x0", // 64bit digest to be written to this partition | 
 |                 } | 
 |             ], | 
 |         } | 
 |     ] | 
 | } | 
 | ``` | 
 |  | 
 | The generator script call would then look as follows: | 
 | ```console | 
 | $ cd ${PROJ_ROOT} | 
 | $ ./util/design/gen-otp-img.py --img-cfg hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson \ | 
 |                                --add-cfg otp_ctrl_img_sw_cfg.hjson \ | 
 |                                --out otp-img.mem | 
 | ``` | 
 |  | 
 | ## ECC Generator Tool | 
 |  | 
 | TODO | 
 |  | 
 | ## LFSR Coefficient Generator Tool | 
 |  | 
 | TODO | 
 |  | 
 | ## LFSR Seed Generator Tool | 
 |  | 
 | TODO | 
 |  | 
 | ## Sparse FSM State Encoding Tool | 
 |  | 
 | TODO | 
 |  | 
 | ## KECCAK Coefficient Generation Tool | 
 |  | 
 | TODO | 
 |  |