blob: 2db36a6f55d986f23a63a599be1f63e323a59098 [file] [log] [blame]
#!/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()