|  | #!/usr/bin/env python3 | 
|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  | r"""Given an ECC encoding matrix, this script generates random life cycle | 
|  | state encodings that can be incrementally written to a memory protected with | 
|  | the ECC code specified. | 
|  | """ | 
|  | import argparse | 
|  | import logging as log | 
|  | import random | 
|  | from pathlib import Path | 
|  |  | 
|  | import hjson | 
|  | from lib.common import wrapped_docstring | 
|  | from lib.LcStEnc import LcStEnc | 
|  | from mako.template import Template | 
|  |  | 
|  | # State encoding definition | 
|  | LC_STATE_DEFINITION_FILE = "hw/ip/lc_ctrl/data/lc_ctrl_state.hjson" | 
|  | # Code templates to render | 
|  | TEMPLATES = ["hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv.tpl"] | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | log.basicConfig(level=log.WARNING, | 
|  | format="%(levelname)s: %(message)s") | 
|  |  | 
|  | parser = argparse.ArgumentParser( | 
|  | prog="gen-lc-state-enc", | 
|  | description=wrapped_docstring(), | 
|  | formatter_class=argparse.RawDescriptionHelpFormatter) | 
|  |  | 
|  | parser.add_argument('-s', | 
|  | '--seed', | 
|  | type=int, | 
|  | metavar='<seed>', | 
|  | help='Custom seed for RNG.') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | with open(LC_STATE_DEFINITION_FILE, 'r') as infile: | 
|  | config = hjson.load(infile) | 
|  |  | 
|  | # If specified, override the seed for random netlist constant computation. | 
|  | if args.seed: | 
|  | log.warning('Commandline override of seed with {}.'.format( | 
|  | args.seed)) | 
|  | config['seed'] = args.seed | 
|  | # Otherwise, we either take it from the .hjson if present, or | 
|  | # randomly generate a new seed if not. | 
|  | else: | 
|  | random.seed() | 
|  | new_seed = random.getrandbits(64) | 
|  | if config.setdefault('seed', new_seed) == new_seed: | 
|  | log.warning( | 
|  | 'No seed specified, setting to {}.'.format(new_seed)) | 
|  |  | 
|  | # validate config and generate encoding | 
|  | try: | 
|  | lc_st_enc = LcStEnc(config) | 
|  | except RuntimeError as err: | 
|  | log.error(err) | 
|  | exit(1) | 
|  |  | 
|  | # render all templates | 
|  | for template in TEMPLATES: | 
|  | with open(template, 'r') as tplfile: | 
|  | tpl = Template(tplfile.read()) | 
|  | with open( | 
|  | Path(template).parent.joinpath(Path(template).stem), | 
|  | 'w') as outfile: | 
|  | outfile.write(tpl.render(lc_st_enc=lc_st_enc)) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |