Skip to content

Commit

Permalink
Add slang_defaults command
Browse files Browse the repository at this point in the history
  • Loading branch information
povik committed Jan 6, 2025
1 parent 4c4b183 commit d686d51
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
62 changes: 62 additions & 0 deletions src/slang_frontend.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3128,6 +3128,9 @@ NetlistContext::~NetlistContext()

USING_YOSYS_NAMESPACE

static std::vector<std::string> default_options;
static std::vector<std::vector<std::string>> defaults_stack;

struct SlangFrontend : Frontend {
SlangFrontend() : Frontend("slang", "read SystemVerilog (slang)") {}

Expand Down Expand Up @@ -3197,12 +3200,18 @@ struct SlangFrontend : Frontend {
driver.sourceLoader.addBuffer(buffer);
}

args.insert(args.begin() + 1, default_options.begin(), default_options.end());

std::vector<std::unique_ptr<char[]>> c_args_guard;
std::vector<char *> c_args;

for (auto arg : args) {
char *c = new char[arg.size() + 1];
strcpy(c, arg.c_str());
c_args_guard.emplace_back(c);
c_args.push_back(c);
}

if (!driver.parseCommandLine(c_args.size(), &c_args[0]))
log_cmd_error("Bad command\n");
}
Expand Down Expand Up @@ -3290,6 +3299,59 @@ struct SlangFrontend : Frontend {
}
} SlangFrontend;

struct SlangDefaultsPass : Pass {
SlangDefaultsPass() : Pass("slang_defaults", "set default options for read_slang") {}

void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" slang_defaults -add [options]\n");
log("\n");
log("Add default options for subsequent calls to read_slang.\n");
log("\n");
log("\n");
log(" slang_defaults -clear\n");
log("\n");
log("Clear the list of default options to read_slang.\n");
log("\n");
log("\n");
log(" slang_defaults -push\n");
log(" slang_defaults -pop\n");
log("\n");
log("Push or pop the default option list to a stack. On -push the list isn't cleared.\n");
log("\n");
}

void execute(std::vector<std::string> args, RTLIL::Design *d) override
{
if (args.size() < 2)
cmd_error(args, 1, "Missing argument");

if (args[1] == "-add") {
default_options.insert(default_options.end(), args.begin() + 2, args.end());
} else {
if (args.size() != 2)
cmd_error(args, 2, "Extra argument");

if (args[1] == "-clear") {
default_options.clear();
} else if (args[1] == "-push") {
defaults_stack.push_back(default_options);
} else if (args[1] == "-pop") {
if (!defaults_stack.empty()) {
default_options.swap(defaults_stack.back());
defaults_stack.pop_back();
} else {
default_options.clear();
}
} else {
cmd_error(args, 1, "Unknown option");
}
}
}
} SlangDefaultsPass;

struct UndrivenPass : Pass {
UndrivenPass() : Pass("undriven", "assign initializers to undriven signals") {}
void execute(std::vector<std::string> args, RTLIL::Design *d) override
Expand Down
44 changes: 44 additions & 0 deletions tests/various/defaults.ys
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
slang_defaults -add -D HELLO

read_slang <<EOF
module top();
`ifndef HELLO
initial $error("No define!");
`endif
endmodule
EOF

slang_defaults -clear

design -reset
read_slang <<EOF
module top();
`ifdef HELLO
initial $error("Define!");
`endif
endmodule
EOF

slang_defaults -add -D HELLO
slang_defaults -push
slang_defaults -clear

design -reset
read_slang <<EOF
module top();
`ifdef HELLO
initial $error("Define!");
`endif
endmodule
EOF

slang_defaults -pop

design -reset
read_slang <<EOF
module top();
`ifndef HELLO
initial $error("No define!");
`endif
endmodule
EOF

0 comments on commit d686d51

Please sign in to comment.