|  | #!/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"""Clock Manager Generator | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import logging as log | 
|  | import sys | 
|  | import subprocess | 
|  | from collections import OrderedDict | 
|  | from io import StringIO | 
|  | from pathlib import Path | 
|  |  | 
|  | import hjson | 
|  | from mako import exceptions | 
|  | from mako.template import Template | 
|  |  | 
|  | # Common header for generated files | 
|  | def main(): | 
|  |  | 
|  | current = Path(__file__).parent.absolute() | 
|  |  | 
|  | hjson_tpl = Template(filename=str(current / '../data/clkmgr.hjson.tpl')) | 
|  | rtl_tpl   = Template(filename=str(current / '../data/clkmgr.sv.tpl')) | 
|  | pkg_tpl   = Template(filename=str(current / '../data/clkmgr_pkg.sv.tpl')) | 
|  |  | 
|  | hjson_out = current / '../data/clkmgr.hjson' | 
|  | rtl_out   = current / '../rtl/clkmgr.sv' | 
|  | pkg_out   = current / '../rtl/clkmgr_pkg.sv' | 
|  |  | 
|  | cfgpath   = current / '../data/clkmgr.cfg.example.hjson' | 
|  |  | 
|  | try: | 
|  | with open(cfgpath, 'r') as cfg: | 
|  | topcfg = hjson.load(cfg,use_decimal=True,object_pairs_hook=OrderedDict) | 
|  | except ValueError: | 
|  | log.error("{} not found".format(cfgpath)) | 
|  | raise SystemExit(sys.exc_info()[1]) | 
|  |  | 
|  | clks_attr = topcfg['clocks'] | 
|  | grps = clks_attr['groups'] | 
|  |  | 
|  | # feedthrough clocks | 
|  | ft_clks = OrderedDict() | 
|  | rg_clks = OrderedDict() | 
|  | sw_clks = OrderedDict() | 
|  | hint_clks = OrderedDict() | 
|  |  | 
|  | ft_clks   = {clk:src for grp in grps for (clk,src) in grp['clocks'].items() | 
|  | if grp['name'] == 'powerup'} | 
|  |  | 
|  | # root-gate clocks | 
|  | rg_clks   = {clk:src for grp in grps for (clk,src) in grp['clocks'].items() | 
|  | if grp['name'] != 'powerup' and grp['sw_cg'] == 'no'} | 
|  |  | 
|  | # direct sw control clocks | 
|  | sw_clks   = {clk:src for grp in grps for (clk,src) in grp['clocks'].items() | 
|  | if grp['sw_cg'] == 'yes'} | 
|  |  | 
|  | # sw hint clocks | 
|  | hint_clks = {clk:src for grp in grps for (clk,src) in grp['clocks'].items() | 
|  | if grp['sw_cg'] == 'hint'} | 
|  |  | 
|  |  | 
|  | # generate hjson | 
|  | hjson_out.write_text( | 
|  | hjson_tpl.render(cfg=topcfg, | 
|  | ft_clks=ft_clks, | 
|  | rg_clks=rg_clks, | 
|  | sw_clks=sw_clks, | 
|  | hint_clks=hint_clks)) | 
|  |  | 
|  | # generate rtl package | 
|  | pkg_out.write_text( | 
|  | pkg_tpl.render(cfg=topcfg, | 
|  | ft_clks=ft_clks, | 
|  | rg_clks=rg_clks, | 
|  | sw_clks=sw_clks, | 
|  | hint_clks=hint_clks)) | 
|  |  | 
|  | # generate top level | 
|  | rtl_out.write_text( | 
|  | rtl_tpl.render(cfg=topcfg, | 
|  | ft_clks=ft_clks, | 
|  | rg_clks=rg_clks, | 
|  | sw_clks=sw_clks, | 
|  | hint_clks=hint_clks)) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |