From 6ec238d0c39e42867ad07f52d0d38d13b617bf8e Mon Sep 17 00:00:00 2001 From: Alex Mykyta Date: Thu, 8 Jun 2023 21:54:54 -0700 Subject: [PATCH] Add command line option to inject define macros into RDL preprocessor namespace #24 --- setup.py | 2 +- src/peakrdl/cmd/preprocess.py | 12 +++++++++++- src/peakrdl/process_input.py | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 7c718e6..440bdec 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ "systemrdl-compiler >= 1.26.0", "peakrdl-html >= 2.10.1", "peakrdl-ipxact >= 3.4.1", - "peakrdl-regblock >= 0.14.0", + "peakrdl-regblock >= 0.15.0", "peakrdl-systemrdl >= 0.3.0", "peakrdl-uvm >= 2.3.0", "tomli;python_version<'3.11'" diff --git a/src/peakrdl/cmd/preprocess.py b/src/peakrdl/cmd/preprocess.py index 722f195..064911c 100644 --- a/src/peakrdl/cmd/preprocess.py +++ b/src/peakrdl/cmd/preprocess.py @@ -3,6 +3,7 @@ from systemrdl import RDLCompiler from ..subcommand import Subcommand +from ..process_input import parse_defines if TYPE_CHECKING: import argparse @@ -25,6 +26,14 @@ def add_arguments(self, parser: 'argparse._ActionsContainer', importers: 'List[I action="append", help='Search directory for files included with `include "filename"', ) + parser.add_argument( + "-D", + dest="defines", + metavar="MACRO[=VALUE]", + action="append", + default=[], + help="Pre-define a Verilog-style preprocessor macro" + ) grp.add_argument( "-o", dest="output", @@ -34,6 +43,7 @@ def add_arguments(self, parser: 'argparse._ActionsContainer', importers: 'List[I def main(self, importers: 'List[ImporterPlugin]', options: 'argparse.Namespace') -> None: rdlc = RDLCompiler() - f_info = rdlc.preprocess_file(options.file, options.incdirs) + defines = parse_defines(rdlc, options.defines) + f_info = rdlc.preprocess_file(options.file, options.incdirs, defines=defines) with open(options.output, 'w', encoding='utf-8') as f: f.write(f_info.preprocessed_text) diff --git a/src/peakrdl/process_input.py b/src/peakrdl/process_input.py index afc0e68..a533e54 100644 --- a/src/peakrdl/process_input.py +++ b/src/peakrdl/process_input.py @@ -25,6 +25,14 @@ def add_rdl_compile_arguments(parser: 'argparse._ActionsContainer') -> None: action="append", help='Search directory for files included with `include "filename"', ) + parser.add_argument( + "-D", + dest="defines", + metavar="MACRO[=VALUE]", + action="append", + default=[], + help="Pre-define a Verilog-style preprocessor macro" + ) def add_importer_arguments(parser: 'argparse._ActionsContainer', importers: 'Sequence[Importer]') -> None: @@ -75,8 +83,22 @@ def parse_parameters(rdlc: 'RDLCompiler', parameter_options: List[str]) -> Dict[ return parameters +def parse_defines(rdlc: 'RDLCompiler', define_options: List[str]) -> Dict[str, str]: + defines = {} + for raw_def in define_options: + m = re.fullmatch(r"(\w+)(?:=(.+))?", raw_def) + if not m: + rdlc.msg.fatal(f"Invalid define argument: {raw_def}") + + k = m.group(1) + v = m.group(2) or "" + defines[k] = v + return defines + def process_input(rdlc: 'RDLCompiler', importers: 'Sequence[Importer]', input_files: List[str], options: 'argparse.Namespace') -> None: + defines = parse_defines(rdlc, options.defines) + for file in input_files: if not os.path.exists(file): rdlc.msg.fatal(f"Input file does not exist: {file}") @@ -87,6 +109,7 @@ def process_input(rdlc: 'RDLCompiler', importers: 'Sequence[Importer]', input_fi rdlc.compile_file( file, incl_search_paths=options.incdirs, + defines=defines, ) else: # Is foreign input file.