blob: 7fd38713589ce40d2df6512e4b467f6a5b967891 [file] [log] [blame]
/*
* 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