Added check if the Yosys version found is supported. Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
diff --git a/conf/environment.yml b/conf/environment.yml index c7a801f..fcdf0c1 100644 --- a/conf/environment.yml +++ b/conf/environment.yml
@@ -2,7 +2,7 @@ channels: - symbiflow dependencies: - - yosys + - symbiflow-yosys - pip: - tox - flake8
diff --git a/v2x/vlog_to_model.py b/v2x/vlog_to_model.py index f234925..e3a7199 100755 --- a/v2x/vlog_to_model.py +++ b/v2x/vlog_to_model.py
@@ -90,6 +90,14 @@ def vlog_to_model(infiles, includes, top, outfile=None): + + # Check Yosys version + pfx = run.determine_select_prefix() + if pfx != "=": + print("ERROR The version of Yosys found is outdated and not supported" + " by V2X") + sys.exit(-1) + iname = os.path.basename(infiles[0]) if outfile is None:
diff --git a/v2x/vlog_to_pbtype.py b/v2x/vlog_to_pbtype.py index e0a0e66..338a766 100755 --- a/v2x/vlog_to_pbtype.py +++ b/v2x/vlog_to_pbtype.py
@@ -910,6 +910,14 @@ def vlog_to_pbtype(infiles, outfile, top=None): + + # Check Yosys version + pfx = run.determine_select_prefix() + if pfx != "=": + print("ERROR The version of Yosys found is outdated and not supported" + " by V2X") + sys.exit(-1) + iname = os.path.basename(infiles[0]) run.add_define("PB_TYPE")
diff --git a/v2x/yosys/run.py b/v2x/yosys/run.py index 4636e2c..1a51dbd 100755 --- a/v2x/yosys/run.py +++ b/v2x/yosys/run.py
@@ -62,17 +62,43 @@ return None +def determine_select_prefix(): + """ + Older and newer versions of Yosys exhibit different behavior of the + 'select' command regarding black/white boxes. Newer version requires a + prefix before some queries. This function determines whether the prefix + is required or not. + """ + + # Query help string of the select command + cmd = ["-p", "help select"] + stdout = get_output(cmd, no_common_args=True) + + # Look for the phrase. If found then the prefix is required + PHRASE = "prefix the pattern with '='" + if PHRASE in stdout: + return "=" + + # No prefix needed + return "" + + def get_yosys_common_args(): return ["-e", "wire '[^']*' is assigned in a block", "-q"] -def get_output(params): +def get_output(params, no_common_args=False): """Run Yosys with given command line parameters, and return stdout as a string. Raises CalledProcessError on a non-zero exit code.""" verbose = get_verbose() - cmd = [get_yosys()] + get_yosys_common_args() + params + cmd = [get_yosys()] + if not no_common_args: + cmd += get_yosys_common_args() + + cmd += params + if verbose: msg = "" msg += "command".ljust(9).ljust(80, "=") + "\n" @@ -312,7 +338,8 @@ """ return do_select( infiles, module, - "select -list ={} %a %co* %x =i:* =o:* %u %i =a:ASSOC_CLOCK={} %u ={} %d". + "select -list ={} %a %co* %x =i:* =o:* %u %i =a:ASSOC_CLOCK={} %u ={} " + "%d". format(clk, clk, clk) )