blob: 84e966a4353c681916330dd579a34a5361999eb5 [file] [log] [blame]
Pirmin Vogel67240592020-12-16 13:54:29 +01001#!/usr/bin/env python3
2# Copyright lowRISC contributors.
3# Licensed under the Apache License, Version 2.0, see LICENSE for details.
4# SPDX-License-Identifier: Apache-2.0
Philipp Wagner83d3b332021-09-29 18:10:14 +01005r"""Stopgap script to generate some cores for the englishbreakfast toplevel.
Pirmin Vogel67240592020-12-16 13:54:29 +01006
Philipp Wagner83d3b332021-09-29 18:10:14 +01007All output files are written to $REPO_TOP/build/$TOPNAME-autogen/.
Pirmin Vogel67240592020-12-16 13:54:29 +01008"""
Philipp Wagner83d3b332021-09-29 18:10:14 +01009
10import argparse
Pirmin Vogel67240592020-12-16 13:54:29 +010011import sys
12import yaml
Philipp Wagner83d3b332021-09-29 18:10:14 +010013import shutil
Pirmin Vogel67240592020-12-16 13:54:29 +010014import subprocess
15import os
16
17try:
Philipp Wagner83d3b332021-09-29 18:10:14 +010018 from yaml import CSafeDumper as YamlDumper
Pirmin Vogel67240592020-12-16 13:54:29 +010019except ImportError:
Philipp Wagner83d3b332021-09-29 18:10:14 +010020 from yaml import SafeDumper as YamlDumper
Pirmin Vogel67240592020-12-16 13:54:29 +010021
22
23def write_core(core_filepath, generated_core):
24 with open(core_filepath, 'w') as f:
25 # FuseSoC requires this line to appear first in the YAML file.
26 # Inserting this line through the YAML serializer requires ordered dicts
27 # to be used everywhere, which is annoying syntax-wise on Python <3.7,
28 # where native dicts are not sorted.
29 f.write('CAPI=2:\n')
30 yaml.dump(generated_core,
31 f,
32 encoding="utf-8",
Pirmin Vogel67240592020-12-16 13:54:29 +010033 Dumper=YamlDumper)
34 print("Core file written to %s" % (core_filepath, ))
35
36
37def main():
Philipp Wagner83d3b332021-09-29 18:10:14 +010038 parser = argparse.ArgumentParser()
39 parser.add_argument('--files-root', required=True)
40 parser.add_argument('--topname', required=True)
Pirmin Vogel67240592020-12-16 13:54:29 +010041
Philipp Wagner83d3b332021-09-29 18:10:14 +010042 args = parser.parse_args()
43 topname = args.topname
44 files_root = args.files_root
Pirmin Vogel67240592020-12-16 13:54:29 +010045
46 # Call topgen.
47 files_data = files_root + "/hw/" + topname + "/data/"
Philipp Wagner83d3b332021-09-29 18:10:14 +010048 files_out = os.path.abspath(files_root + "/build/" + topname + "-autogen/")
49 shutil.rmtree(files_out, ignore_errors=True)
50 os.makedirs(files_out, exist_ok=False)
Pirmin Vogel67240592020-12-16 13:54:29 +010051 cmd = [files_root + "/util/topgen.py", # "--verbose",
52 "-t", files_data + topname + ".hjson",
Pirmin Vogel67240592020-12-16 13:54:29 +010053 "-o", files_out]
54 try:
55 print("Running topgen.")
56 subprocess.run(cmd,
57 check=True,
58 stdout=subprocess.PIPE,
59 stderr=subprocess.STDOUT,
60 universal_newlines=True)
61
62 except subprocess.CalledProcessError as e:
63 print("topgen failed: " + str(e))
Philipp Wagner4fe07f92021-03-15 11:06:11 +000064 print(e.stdout)
Pirmin Vogel67240592020-12-16 13:54:29 +010065 sys.exit(1)
66
67 # Create core files.
68 print("Creating core files.")
69
70 # For some cores such IP package files, we need a separate dependency for the register file.
71 # Combining this with the generated topgen core file below leads to cyclic dependencies. For
72 # example, flash_ctrl depends on topgen but also on pwrmgr_pkg which depends on
73 # pwrmgr_reg_pkg generated by topgen.
Timothy Chen8adb20d2021-03-25 16:49:04 -070074 reg_top_suffix = {
Timothy Chen8adb20d2021-03-25 16:49:04 -070075 'clkmgr': '',
76 'flash_ctrl': '_core',
77 'pinmux': '',
78 'pwrmgr': '',
79 'rstmgr': '',
Timothy Chen8adb20d2021-03-25 16:49:04 -070080 }
81
Philipp Wagner83d3b332021-09-29 18:10:14 +010082 # reg-only
Philipp Wagner0d7bd2c2021-03-19 10:33:52 +000083 for ip in ['clkmgr', 'flash_ctrl', 'pinmux', 'pwrmgr', 'rstmgr']:
Philipp Wagner83d3b332021-09-29 18:10:14 +010084 core_filepath = os.path.abspath(os.path.join(files_out, 'generated-%s.core' % ip))
85 name = 'lowrisc:ip:%s_reggen' % ip,
86 files = ['ip/%s/rtl/autogen/%s_reg_pkg.sv' % (ip, ip),
87 'ip/%s/rtl/autogen/%s_reg_top.sv' % (ip, ip + reg_top_suffix[ip])]
Pirmin Vogel67240592020-12-16 13:54:29 +010088 generated_core = {
Philipp Wagner83d3b332021-09-29 18:10:14 +010089 'name': '%s' % name,
Pirmin Vogel67240592020-12-16 13:54:29 +010090 'filesets': {
91 'files_rtl': {
92 'depend': [
Philipp Wagner83d3b332021-09-29 18:10:14 +010093 'lowrisc:ip:tlul',
Pirmin Vogel67240592020-12-16 13:54:29 +010094 ],
Philipp Wagner83d3b332021-09-29 18:10:14 +010095 'files': files,
Pirmin Vogel67240592020-12-16 13:54:29 +010096 'file_type': 'systemVerilogSource'
97 },
98 },
99 'targets': {
100 'default': {
101 'filesets': [
102 'files_rtl',
103 ],
104 },
105 },
106 }
107 write_core(core_filepath, generated_core)
108
Philipp Wagner83d3b332021-09-29 18:10:14 +0100109 # topgen
110 nameparts = topname.split('_')
111 if nameparts[0] == 'top' and len(nameparts) > 1:
112 chipname = 'chip_' + '_'.join(nameparts[1:])
113 else:
114 chipname = topname
115
116 core_filepath = os.path.abspath(os.path.join(files_out, 'generated-topgen.core'))
117 generated_core = {
118 'name': "lowrisc:systems:generated-topgen",
119 'filesets': {
120 'files_rtl': {
121 'depend': [
122 # Ibex and OTBN constants
123 'lowrisc:ibex:ibex_pkg',
124 'lowrisc:ip:otbn_pkg',
125 # flash_ctrl
126 'lowrisc:constants:top_pkg',
127 'lowrisc:prim:util',
128 'lowrisc:ip:lc_ctrl_pkg',
129 'lowrisc:ip:pwrmgr_pkg',
130 # rstmgr
131 'lowrisc:prim:clock_mux2',
132 # clkmgr
133 'lowrisc:prim:all',
134 'lowrisc:prim:clock_gating',
135 'lowrisc:prim:clock_buf',
136 'lowrisc:prim:clock_div',
137 'lowrisc:ip:clkmgr_components',
138 # Top
139 # ast and sensor_ctrl not auto-generated, re-used from top_earlgrey
140 'lowrisc:systems:sensor_ctrl',
141 'lowrisc:systems:ast_pkg',
142 # TODO: absorb this into AST longerm
143 'lowrisc:systems:clkgen_xil7series',
144 ],
145 'files': [
146 # IPs
147 'ip/clkmgr/rtl/autogen/clkmgr.sv',
148 'ip/flash_ctrl/rtl/autogen/flash_ctrl_pkg.sv',
149 'ip/flash_ctrl/rtl/autogen/flash_ctrl.sv',
Timothy Chen936cc942021-09-21 10:48:19 -0700150 'ip/flash_ctrl/rtl/autogen/flash_ctrl_region_cfg.sv',
Philipp Wagner83d3b332021-09-29 18:10:14 +0100151 'ip/rstmgr/rtl/autogen/rstmgr_pkg.sv',
152 'ip/rstmgr/rtl/autogen/rstmgr.sv',
Philipp Wagner83d3b332021-09-29 18:10:14 +0100153 # Top
154 'rtl/autogen/%s_rnd_cnst_pkg.sv' % topname,
155 'rtl/autogen/%s_pkg.sv' % topname,
156 'rtl/autogen/%s.sv' % topname,
157 # TODO: this is not ideal. we should extract
158 # this info from the target configuration and
159 # possibly generate separate core files for this.
160 'rtl/autogen/%s_cw305.sv' % chipname,
161 ],
162 'file_type': 'systemVerilogSource'
163 },
164 },
165 'targets': {
166 'default': {
167 'filesets': [
168 'files_rtl',
169 ],
170 },
171 },
172 }
173 write_core(core_filepath, generated_core)
174
Pirmin Vogel67240592020-12-16 13:54:29 +0100175 return 0
176
177
178if __name__ == "__main__":
179 main()