| /* |
| * Copyright 2020-2022 F4PGA Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| */ |
| |
| #include "uhdmcommonfrontend.h" |
| |
| namespace systemverilog_plugin |
| { |
| |
| using namespace ::Yosys; |
| |
| /* Stub for AST::process */ |
| static void set_line_num(int) {} |
| |
| /* Stub for AST::process */ |
| static int get_line_num(void) { return 1; } |
| |
| void UhdmCommonFrontend::print_read_options() |
| { |
| log(" -noassert\n"); |
| log(" ignore assert() statements"); |
| log("\n"); |
| log(" -debug\n"); |
| log(" alias for -dump_ast1 -dump_ast2 -dump_vlog1 -dump_vlog2\n"); |
| log("\n"); |
| log(" -dump_ast1\n"); |
| log(" dump abstract syntax tree (before simplification)\n"); |
| log("\n"); |
| log(" -dump_ast2\n"); |
| log(" dump abstract syntax tree (after simplification)\n"); |
| log("\n"); |
| log(" -no_dump_ptr\n"); |
| log(" do not include hex memory addresses in dump (easier to diff dumps)\n"); |
| log("\n"); |
| log(" -dump_vlog1\n"); |
| log(" dump ast as Verilog code (before simplification)\n"); |
| log("\n"); |
| log(" -dump_vlog2\n"); |
| log(" dump ast as Verilog code (after simplification)\n"); |
| log("\n"); |
| log(" -dump_rtlil\n"); |
| log(" dump generated RTLIL netlist\n"); |
| log("\n"); |
| log(" -report [directory]\n"); |
| log(" write a coverage report for the UHDM file\n"); |
| log("\n"); |
| log(" -defer\n"); |
| log(" only read the abstract syntax tree and defer actual compilation\n"); |
| log(" to a later 'hierarchy' command. Useful in cases where the default\n"); |
| log(" parameters of modules yield invalid or not synthesizable code.\n"); |
| log(" Needs to be followed by read_systemverilog -link after reading\n"); |
| log(" all files.\n"); |
| log("\n"); |
| log(" -link\n"); |
| log(" performs linking and elaboration of the files read with -defer\n"); |
| log("\n"); |
| log(" -parse-only\n"); |
| log(" this parameter only applies to read_systemverilog command,\n"); |
| log(" it runs only Surelog to parse design, but doesn't load generated\n"); |
| log(" tree into Yosys.\n"); |
| log("\n"); |
| log(" -formal\n"); |
| log(" enable support for SystemVerilog assertions and some Yosys extensions\n"); |
| log(" replace the implicit -D SYNTHESIS with -D FORMAL\n"); |
| log("\n"); |
| } |
| |
| void UhdmCommonFrontend::execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) |
| { |
| this->call_log_header(design); |
| this->args = args; |
| |
| bool defer = false; |
| bool dump_ast1 = false; |
| bool dump_ast2 = false; |
| bool dump_vlog1 = false; |
| bool dump_vlog2 = false; |
| bool no_dump_ptr = false; |
| bool dump_rtlil = false; |
| std::vector<std::string> unhandled_args; |
| |
| for (size_t i = 0; i < args.size(); i++) { |
| if (args[i] == "-debug") { |
| dump_ast1 = true; |
| dump_ast2 = true; |
| dump_vlog1 = true; |
| dump_vlog2 = true; |
| this->shared.debug_flag = true; |
| } else if (args[i] == "-report" && ++i < args.size()) { |
| this->report_directory = args[i]; |
| this->shared.stop_on_error = false; |
| } else if (args[i] == "-noassert") { |
| this->shared.no_assert = true; |
| } else if (args[i] == "-defer") { |
| this->shared.defer = true; |
| } else if (args[i] == "-dump_ast1") { |
| dump_ast1 = true; |
| } else if (args[i] == "-dump_ast2") { |
| dump_ast2 = true; |
| } else if (args[i] == "-dump_vlog1") { |
| dump_vlog1 = true; |
| } else if (args[i] == "-dump_vlog2") { |
| dump_vlog2 = true; |
| } else if (args[i] == "-no_dump_ptr") { |
| no_dump_ptr = true; |
| } else if (args[i] == "-dump_rtlil") { |
| dump_rtlil = true; |
| } else if (args[i] == "-parse-only") { |
| this->shared.parse_only = true; |
| } else if (args[i] == "-link") { |
| this->shared.link = true; |
| // Surelog needs it in the command line to link correctly |
| unhandled_args.push_back(args[i]); |
| } else if (args[i] == "-formal") { |
| this->shared.formal = true; |
| // Surelog needs it in the command line to annotate UHDM |
| unhandled_args.push_back(args[i]); |
| } else { |
| unhandled_args.push_back(args[i]); |
| } |
| } |
| // Yosys gets confused when extra_args are passed with -link or no option |
| // It's done fully by Surelog, so skip it in this case |
| if (!this->shared.link) |
| extra_args(f, filename, args, args.size() - 1); |
| // pass only unhandled args to Surelog |
| // unhandled args starts with command name, |
| // but Surelog expects args[0] to be program name |
| // and skips it |
| this->args = unhandled_args; |
| |
| AST::current_filename = filename; |
| AST::set_line_num = &set_line_num; |
| AST::get_line_num = &get_line_num; |
| |
| bool dont_redefine = false; |
| bool default_nettype_wire = true; |
| |
| AST::AstNode *current_ast = parse(filename); |
| |
| if (current_ast) { |
| AST::process(design, current_ast, dump_ast1, dump_ast2, no_dump_ptr, dump_vlog1, dump_vlog2, dump_rtlil, false, false, false, false, false, |
| false, false, false, false, false, dont_redefine, false, defer, default_nettype_wire); |
| delete current_ast; |
| } |
| } |
| |
| } // namespace systemverilog_plugin |