def generate_xbars(top, out_path): topname = top["name"] gencmd = ("// util/topgen.py -t hw/top_{topname}/data/top_{topname}.hjson " "-o hw/top_{topname}/\n\n".format(topname=topname)) for obj in top["xbar"]: xbar_path = out_path / 'ip/xbar_{}/data/autogen'.format(obj["name"]) xbar_path.mkdir(parents=True, exist_ok=True) xbar = tlgen.validate(obj) xbar.ip_path = 'hw/top_' + top["name"] + '/ip/{dut}' # Generate output of crossbar with complete fields xbar_hjson_path = xbar_path / "xbar_{}.gen.hjson".format(xbar.name) xbar_hjson_path.write_text(genhdr + gencmd + hjson.dumps(obj, for_json=True)) if not tlgen.elaborate(xbar): log.error("Elaboration failed." + repr(xbar)) try: results = tlgen.generate(xbar, "top_" + top["name"]) except: # noqa: E722 log.error(exceptions.text_error_template().render()) ip_path = out_path / 'ip/xbar_{}'.format(obj["name"]) for filename, filecontent in results: filepath = ip_path / filename filepath.parent.mkdir(parents=True, exist_ok=True) with filepath.open(mode='w', encoding='UTF-8') as fout: fout.write(filecontent) dv_path = out_path / 'ip/xbar_{}/dv/autogen'.format(obj["name"]) dv_path.mkdir(parents=True, exist_ok=True) # generate testbench for xbar tlgen.generate_tb(xbar, dv_path, "top_" + top["name"]) # Read back the comportable IP and amend to Xbar xbar_ipfile = ip_path / ("data/autogen/xbar_%s.hjson" % obj["name"]) with xbar_ipfile.open() as fxbar: xbar_ipobj = hjson.load(fxbar, use_decimal=True, object_pairs_hook=OrderedDict) r_inter_signal_list = check_list( xbar_ipobj.get('inter_signal_list', []), 'inter_signal_list field') obj['inter_signal_list'] = [ InterSignal.from_raw( 'entry {} of the inter_signal_list field'.format(idx + 1), entry) for idx, entry in enumerate(r_inter_signal_list) ]
def from_raw(cls, where: str, raw: object) -> 'TemplateParams': """ Produce a TemplateParams instance from an object as it is in Hjson. """ ret = cls() rl = check_list(raw, where) for idx, r_param in enumerate(rl): entry_where = 'entry {} in {}'.format(idx + 1, where) param = _parse_template_parameter(entry_where, r_param) if param.name in ret: raise ValueError('At {}, found a duplicate parameter with ' 'name {}.'.format(entry_where, param.name)) ret.add(param) return ret