Run formatting on all plugins
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/bank_tiles.h b/bank_tiles.h
index 3197ee0..3ff5220 100644
--- a/bank_tiles.h
+++ b/bank_tiles.h
@@ -20,36 +20,34 @@
#include "kernel/log.h"
#include "libs/json11/json11.hpp"
-
USING_YOSYS_NAMESPACE
// Coordinates of HCLK_IOI tiles associated with a specified bank
using BankTilesMap = std::unordered_map<int, std::string>;
// Find the part's JSON file with information including the IO Banks
// and extract the bank tiles.
-inline BankTilesMap get_bank_tiles(const std::string json_file_name) {
- BankTilesMap bank_tiles;
- std::ifstream json_file(json_file_name);
- if (!json_file.good()) {
- log_cmd_error("Can't open JSON file %s", json_file_name.c_str());
- }
- std::string json_str((std::istreambuf_iterator<char>(json_file)),
- std::istreambuf_iterator<char>());
- std::string error;
- auto json = json11::Json::parse(json_str, error);
- if (!error.empty()) {
- log_cmd_error("%s\n", error.c_str());
- }
- auto json_objects = json.object_items();
- auto iobanks = json_objects.find("iobanks");
- if (iobanks == json_objects.end()) {
- log_cmd_error("IO Bank information missing in the part's json: %s\n", json_file_name.c_str());
- }
+inline BankTilesMap get_bank_tiles(const std::string json_file_name)
+{
+ BankTilesMap bank_tiles;
+ std::ifstream json_file(json_file_name);
+ if (!json_file.good()) {
+ log_cmd_error("Can't open JSON file %s", json_file_name.c_str());
+ }
+ std::string json_str((std::istreambuf_iterator<char>(json_file)), std::istreambuf_iterator<char>());
+ std::string error;
+ auto json = json11::Json::parse(json_str, error);
+ if (!error.empty()) {
+ log_cmd_error("%s\n", error.c_str());
+ }
+ auto json_objects = json.object_items();
+ auto iobanks = json_objects.find("iobanks");
+ if (iobanks == json_objects.end()) {
+ log_cmd_error("IO Bank information missing in the part's json: %s\n", json_file_name.c_str());
+ }
- for (auto iobank : iobanks->second.object_items()) {
- bank_tiles.emplace(std::atoi(iobank.first.c_str()), iobank.second.string_value());
- }
+ for (auto iobank : iobanks->second.object_items()) {
+ bank_tiles.emplace(std::atoi(iobank.first.c_str()), iobank.second.string_value());
+ }
- return bank_tiles;
+ return bank_tiles;
}
-
diff --git a/design_introspection-plugin/design_introspection.cc b/design_introspection-plugin/design_introspection.cc
index 64fdbbc..4bd348d 100644
--- a/design_introspection-plugin/design_introspection.cc
+++ b/design_introspection-plugin/design_introspection.cc
@@ -18,22 +18,21 @@
*
*/
-#include "get_nets.h"
-#include "get_ports.h"
#include "get_cells.h"
+#include "get_nets.h"
#include "get_pins.h"
+#include "get_ports.h"
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
struct DesignIntrospection {
- DesignIntrospection(){}
+ DesignIntrospection() {}
GetNets get_nets_cmd;
GetPorts get_ports_cmd;
GetCells get_cells_cmd;
GetPins get_pins_cmd;
} DesignIntrospection;
-
PRIVATE_NAMESPACE_END
diff --git a/design_introspection-plugin/get_cells.cc b/design_introspection-plugin/get_cells.cc
index 937545d..d0e6ce0 100644
--- a/design_introspection-plugin/get_cells.cc
+++ b/design_introspection-plugin/get_cells.cc
@@ -25,24 +25,24 @@
std::string GetCells::SelectionType() { return "c"; }
-GetCells::SelectionObjects GetCells::ExtractSelection(RTLIL::Design* design, const CommandArgs& args) {
+GetCells::SelectionObjects GetCells::ExtractSelection(RTLIL::Design *design, const CommandArgs &args)
+{
SelectionObjects selected_objects;
for (auto module : design->selected_modules()) {
- for (auto cell : module->selected_cells()) {
- if (args.filters.size() > 0) {
- Filter filter = args.filters.at(0);
- std::string attr_value = cell->get_string_attribute(
- RTLIL::IdString(RTLIL::escape_id(filter.first)));
- if (attr_value.compare(filter.second)) {
- continue;
- }
- }
- std::string object_name(RTLIL::unescape_id(cell->name));
- selected_objects.push_back(object_name);
- }
+ for (auto cell : module->selected_cells()) {
+ if (args.filters.size() > 0) {
+ Filter filter = args.filters.at(0);
+ std::string attr_value = cell->get_string_attribute(RTLIL::IdString(RTLIL::escape_id(filter.first)));
+ if (attr_value.compare(filter.second)) {
+ continue;
+ }
+ }
+ std::string object_name(RTLIL::unescape_id(cell->name));
+ selected_objects.push_back(object_name);
+ }
}
if (selected_objects.size() == 0 and !args.is_quiet) {
- log_warning("Couldn't find matching cell.\n");
+ log_warning("Couldn't find matching cell.\n");
}
return selected_objects;
}
diff --git a/design_introspection-plugin/get_cells.h b/design_introspection-plugin/get_cells.h
index 205d50b..c9ba621 100644
--- a/design_introspection-plugin/get_cells.h
+++ b/design_introspection-plugin/get_cells.h
@@ -29,8 +29,7 @@
std::string TypeName() override;
std::string SelectionType() override;
- SelectionObjects ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
+ SelectionObjects ExtractSelection(RTLIL::Design *design, const CommandArgs &args) override;
};
-#endif // GET_CELLS_H_
+#endif // GET_CELLS_H_
diff --git a/design_introspection-plugin/get_cmd.cc b/design_introspection-plugin/get_cmd.cc
index 4b54ded..66401a6 100644
--- a/design_introspection-plugin/get_cmd.cc
+++ b/design_introspection-plugin/get_cmd.cc
@@ -2,7 +2,8 @@
USING_YOSYS_NAMESPACE
-void GetCmd::help() {
+void GetCmd::help()
+{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" get_%ss [-quiet] [-filter filter_expression] "
@@ -30,106 +31,94 @@
log("\n");
}
-void GetCmd::ExecuteSelection(RTLIL::Design* design, const CommandArgs& args) {
+void GetCmd::ExecuteSelection(RTLIL::Design *design, const CommandArgs &args)
+{
std::vector<std::string> selection_args;
// Add name of top module to selection string
- std::transform(args.selection_objects.begin(), args.selection_objects.end(),
- std::back_inserter(selection_args),
- [&](const std::string& obj) {
- return RTLIL::unescape_id(design->top_module()->name) +
- "/" + SelectionType() + ":" + obj;
- });
+ std::transform(args.selection_objects.begin(), args.selection_objects.end(), std::back_inserter(selection_args),
+ [&](const std::string &obj) { return RTLIL::unescape_id(design->top_module()->name) + "/" + SelectionType() + ":" + obj; });
extra_args(selection_args, 0, design);
if (design->selected_modules().empty()) {
- if (!args.is_quiet) {
- log_warning("Specified %s not found in design\n",
- TypeName().c_str());
- }
+ if (!args.is_quiet) {
+ log_warning("Specified %s not found in design\n", TypeName().c_str());
+ }
}
}
-void GetCmd::PackToTcl(const SelectionObjects& objects) {
- Tcl_Obj* tcl_result;
+void GetCmd::PackToTcl(const SelectionObjects &objects)
+{
+ Tcl_Obj *tcl_result;
if (objects.size() == 1) {
- tcl_result = Tcl_NewStringObj(objects.at(0).c_str(), -1);
+ tcl_result = Tcl_NewStringObj(objects.at(0).c_str(), -1);
} else {
- tcl_result = Tcl_NewListObj(0, NULL);
- for (const auto& object : objects) {
- Tcl_Obj* value_obj = Tcl_NewStringObj(object.c_str(), -1);
- Tcl_ListObjAppendElement(yosys_get_tcl_interp(), tcl_result,
- value_obj);
- }
+ tcl_result = Tcl_NewListObj(0, NULL);
+ for (const auto &object : objects) {
+ Tcl_Obj *value_obj = Tcl_NewStringObj(object.c_str(), -1);
+ Tcl_ListObjAppendElement(yosys_get_tcl_interp(), tcl_result, value_obj);
+ }
}
Tcl_SetObjResult(yosys_get_tcl_interp(), tcl_result);
}
-GetCmd::CommandArgs GetCmd::ParseCommand(const std::vector<std::string>& args) {
- CommandArgs parsed_args{.filters = Filters(),
- .is_quiet = false,
- .selection_objects = SelectionObjects()};
+GetCmd::CommandArgs GetCmd::ParseCommand(const std::vector<std::string> &args)
+{
+ CommandArgs parsed_args{.filters = Filters(), .is_quiet = false, .selection_objects = SelectionObjects()};
size_t argidx(0);
for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-quiet") {
- parsed_args.is_quiet = true;
- continue;
- }
+ std::string arg = args[argidx];
+ if (arg == "-quiet") {
+ parsed_args.is_quiet = true;
+ continue;
+ }
- if (arg == "-filter" and argidx + 1 < args.size()) {
- std::string filter_arg = args[++argidx];
+ if (arg == "-filter" and argidx + 1 < args.size()) {
+ std::string filter_arg = args[++argidx];
- // Remove spaces
- filter_arg.erase(
- std::remove_if(filter_arg.begin(), filter_arg.end(), isspace),
- filter_arg.end());
+ // Remove spaces
+ filter_arg.erase(std::remove_if(filter_arg.begin(), filter_arg.end(), isspace), filter_arg.end());
- // Parse filters
- // TODO Add support for multiple condition expression
- // Currently only a single == is supported
- std::regex filter_attr_regex("(\\w+\\s?==\\s?\\w+)([(||)(&&)]*)");
- std::regex_token_iterator<std::string::iterator> regex_end;
- std::regex_token_iterator<std::string::iterator> matches(
- filter_arg.begin(), filter_arg.end(), filter_attr_regex, 1);
- if (matches == regex_end) {
- log_warning(
- "Currently -filter switch supports only a single "
- "'equal(==)' condition expression, the rest will be "
- "ignored\n");
- }
+ // Parse filters
+ // TODO Add support for multiple condition expression
+ // Currently only a single == is supported
+ std::regex filter_attr_regex("(\\w+\\s?==\\s?\\w+)([(||)(&&)]*)");
+ std::regex_token_iterator<std::string::iterator> regex_end;
+ std::regex_token_iterator<std::string::iterator> matches(filter_arg.begin(), filter_arg.end(), filter_attr_regex, 1);
+ if (matches == regex_end) {
+ log_warning("Currently -filter switch supports only a single "
+ "'equal(==)' condition expression, the rest will be "
+ "ignored\n");
+ }
- while (matches != regex_end) {
- std::string filter(*matches++);
- auto separator = filter.find("==");
- if (separator == std::string::npos) {
- log_cmd_error("Incorrect filter expression: %s\n",
- args[argidx].c_str());
- }
- parsed_args.filters.emplace_back(filter.substr(0, separator),
- filter.substr(separator + 2));
- }
- if (parsed_args.filters.size() > 1) {
- log_warning(
- "Currently -filter switch supports only a single "
- "'equal(==)' condition expression, the rest will be "
- "ignored\n");
- }
- continue;
- }
+ while (matches != regex_end) {
+ std::string filter(*matches++);
+ auto separator = filter.find("==");
+ if (separator == std::string::npos) {
+ log_cmd_error("Incorrect filter expression: %s\n", args[argidx].c_str());
+ }
+ parsed_args.filters.emplace_back(filter.substr(0, separator), filter.substr(separator + 2));
+ }
+ if (parsed_args.filters.size() > 1) {
+ log_warning("Currently -filter switch supports only a single "
+ "'equal(==)' condition expression, the rest will be "
+ "ignored\n");
+ }
+ continue;
+ }
- if (arg.size() > 0 and arg[0] == '-') {
- log_cmd_error("Unknown option %s.\n", arg.c_str());
- }
+ if (arg.size() > 0 and arg[0] == '-') {
+ log_cmd_error("Unknown option %s.\n", arg.c_str());
+ }
- break;
+ break;
}
- std::copy(args.begin() + argidx, args.end(),
- std::back_inserter(parsed_args.selection_objects));
+ std::copy(args.begin() + argidx, args.end(), std::back_inserter(parsed_args.selection_objects));
return parsed_args;
}
-void GetCmd::execute(std::vector<std::string> args, RTLIL::Design* design) {
+void GetCmd::execute(std::vector<std::string> args, RTLIL::Design *design)
+{
if (design->top_module() == nullptr) {
- log_cmd_error("No top module detected\n");
+ log_cmd_error("No top module detected\n");
}
CommandArgs parsed_args(ParseCommand(args));
diff --git a/design_introspection-plugin/get_cmd.h b/design_introspection-plugin/get_cmd.h
index 983a50d..5d1a120 100644
--- a/design_introspection-plugin/get_cmd.h
+++ b/design_introspection-plugin/get_cmd.h
@@ -29,27 +29,25 @@
using Filters = std::vector<Filter>;
using SelectionObjects = std::vector<std::string>;
struct CommandArgs {
- Filters filters;
- bool is_quiet;
- SelectionObjects selection_objects;
+ Filters filters;
+ bool is_quiet;
+ SelectionObjects selection_objects;
};
- GetCmd(const std::string& name, const std::string& description)
- : Pass(name, description) {}
+ GetCmd(const std::string &name, const std::string &description) : Pass(name, description) {}
void help() override;
- void execute(std::vector<std::string> args, RTLIL::Design* design) override;
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override;
- protected:
- CommandArgs ParseCommand(const std::vector<std::string>& args);
- void PackToTcl(const SelectionObjects& objects);
+ protected:
+ CommandArgs ParseCommand(const std::vector<std::string> &args);
+ void PackToTcl(const SelectionObjects &objects);
- private:
+ private:
virtual std::string TypeName() = 0;
virtual std::string SelectionType() = 0;
- virtual SelectionObjects ExtractSelection(RTLIL::Design* design, const CommandArgs& args) = 0;
- virtual void ExecuteSelection(RTLIL::Design* design,
- const CommandArgs& args);
+ virtual SelectionObjects ExtractSelection(RTLIL::Design *design, const CommandArgs &args) = 0;
+ virtual void ExecuteSelection(RTLIL::Design *design, const CommandArgs &args);
};
-#endif // GET_CMD_H_
+#endif // GET_CMD_H_
diff --git a/design_introspection-plugin/get_nets.cc b/design_introspection-plugin/get_nets.cc
index db5d375..09e5ed4 100644
--- a/design_introspection-plugin/get_nets.cc
+++ b/design_introspection-plugin/get_nets.cc
@@ -25,25 +25,24 @@
std::string GetNets::SelectionType() { return "w"; }
-GetNets::SelectionObjects GetNets::ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) {
+GetNets::SelectionObjects GetNets::ExtractSelection(RTLIL::Design *design, const CommandArgs &args)
+{
SelectionObjects selected_objects;
for (auto module : design->selected_modules()) {
- for (auto wire : module->selected_wires()) {
- if (args.filters.size() > 0) {
- Filter filter = args.filters.at(0);
- std::string attr_value = wire->get_string_attribute(
- RTLIL::IdString(RTLIL::escape_id(filter.first)));
- if (attr_value.compare(filter.second)) {
- continue;
- }
- }
- std::string object_name(RTLIL::unescape_id(wire->name));
- selected_objects.push_back(object_name);
- }
+ for (auto wire : module->selected_wires()) {
+ if (args.filters.size() > 0) {
+ Filter filter = args.filters.at(0);
+ std::string attr_value = wire->get_string_attribute(RTLIL::IdString(RTLIL::escape_id(filter.first)));
+ if (attr_value.compare(filter.second)) {
+ continue;
+ }
+ }
+ std::string object_name(RTLIL::unescape_id(wire->name));
+ selected_objects.push_back(object_name);
+ }
}
if (selected_objects.size() == 0 and !args.is_quiet) {
- log_warning("Couldn't find matching net.\n");
+ log_warning("Couldn't find matching net.\n");
}
return selected_objects;
}
diff --git a/design_introspection-plugin/get_nets.h b/design_introspection-plugin/get_nets.h
index 11f7502..d9f5850 100644
--- a/design_introspection-plugin/get_nets.h
+++ b/design_introspection-plugin/get_nets.h
@@ -29,8 +29,7 @@
std::string TypeName() override;
std::string SelectionType() override;
- SelectionObjects ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
+ SelectionObjects ExtractSelection(RTLIL::Design *design, const CommandArgs &args) override;
};
-#endif // GET_NETS_H_
+#endif // GET_NETS_H_
diff --git a/design_introspection-plugin/get_pins.cc b/design_introspection-plugin/get_pins.cc
index d39f6bc..e94e3ae 100644
--- a/design_introspection-plugin/get_pins.cc
+++ b/design_introspection-plugin/get_pins.cc
@@ -25,57 +25,50 @@
std::string GetPins::SelectionType() { return "c"; }
-void GetPins::ExecuteSelection(RTLIL::Design* design, const CommandArgs& args) {
+void GetPins::ExecuteSelection(RTLIL::Design *design, const CommandArgs &args)
+{
(void)design;
(void)args;
}
-GetPins::SelectionObjects GetPins::ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) {
+GetPins::SelectionObjects GetPins::ExtractSelection(RTLIL::Design *design, const CommandArgs &args)
+{
SelectionObjects selected_objects;
for (auto obj : args.selection_objects) {
- size_t port_separator = obj.find_last_of("/");
- std::string cell = obj.substr(0, port_separator);
- std::string port = obj.substr(port_separator + 1);
- SelectionObjects selection{
- RTLIL::unescape_id(design->top_module()->name) + "/" +
- SelectionType() + ":" + cell};
- extra_args(selection, 0, design);
- ExtractSingleSelection(selected_objects, design, port, args);
+ size_t port_separator = obj.find_last_of("/");
+ std::string cell = obj.substr(0, port_separator);
+ std::string port = obj.substr(port_separator + 1);
+ SelectionObjects selection{RTLIL::unescape_id(design->top_module()->name) + "/" + SelectionType() + ":" + cell};
+ extra_args(selection, 0, design);
+ ExtractSingleSelection(selected_objects, design, port, args);
}
if (selected_objects.size() == 0 and !args.is_quiet) {
- log_warning("Couldn't find matching pin.\n");
+ log_warning("Couldn't find matching pin.\n");
}
return selected_objects;
}
-void GetPins::ExtractSingleSelection(SelectionObjects& objects,
- RTLIL::Design* design,
- const std::string& port_name,
- const CommandArgs& args) {
+void GetPins::ExtractSingleSelection(SelectionObjects &objects, RTLIL::Design *design, const std::string &port_name, const CommandArgs &args)
+{
if (design->selected_modules().empty()) {
- if (!args.is_quiet) {
- log_warning("Specified %s not found in design\n",
- TypeName().c_str());
- }
+ if (!args.is_quiet) {
+ log_warning("Specified %s not found in design\n", TypeName().c_str());
+ }
}
for (auto module : design->selected_modules()) {
- for (auto cell : module->selected_cells()) {
- if (!cell->hasPort(RTLIL::escape_id(port_name))) {
- continue;
- }
- if (args.filters.size() > 0) {
- Filter filter = args.filters.at(0);
- std::string attr_value = cell->get_string_attribute(
- RTLIL::IdString(RTLIL::escape_id(filter.first)));
- if (attr_value.compare(filter.second)) {
- continue;
- }
- }
- std::string pin_name(RTLIL::unescape_id(cell->name) + "/" +
- port_name);
- objects.push_back(pin_name);
- }
+ for (auto cell : module->selected_cells()) {
+ if (!cell->hasPort(RTLIL::escape_id(port_name))) {
+ continue;
+ }
+ if (args.filters.size() > 0) {
+ Filter filter = args.filters.at(0);
+ std::string attr_value = cell->get_string_attribute(RTLIL::IdString(RTLIL::escape_id(filter.first)));
+ if (attr_value.compare(filter.second)) {
+ continue;
+ }
+ }
+ std::string pin_name(RTLIL::unescape_id(cell->name) + "/" + port_name);
+ objects.push_back(pin_name);
+ }
}
}
-
diff --git a/design_introspection-plugin/get_pins.h b/design_introspection-plugin/get_pins.h
index f7ebe14..5d2cde0 100644
--- a/design_introspection-plugin/get_pins.h
+++ b/design_introspection-plugin/get_pins.h
@@ -27,17 +27,12 @@
struct GetPins : public GetCmd {
GetPins() : GetCmd("get_pins", "Print matching pins") {}
- private:
+ private:
std::string TypeName() override;
std::string SelectionType() override;
- SelectionObjects ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
- void ExecuteSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
- void ExtractSingleSelection(SelectionObjects& objects,
- RTLIL::Design* design,
- const std::string& port_name,
- const CommandArgs& args);
+ SelectionObjects ExtractSelection(RTLIL::Design *design, const CommandArgs &args) override;
+ void ExecuteSelection(RTLIL::Design *design, const CommandArgs &args) override;
+ void ExtractSingleSelection(SelectionObjects &objects, RTLIL::Design *design, const std::string &port_name, const CommandArgs &args);
};
-#endif // GET_PINS_H_
+#endif // GET_PINS_H_
diff --git a/design_introspection-plugin/get_ports.cc b/design_introspection-plugin/get_ports.cc
index ef29b95..042ada7 100644
--- a/design_introspection-plugin/get_ports.cc
+++ b/design_introspection-plugin/get_ports.cc
@@ -25,33 +25,29 @@
std::string GetPorts::SelectionType() { return "x"; }
-void GetPorts::ExecuteSelection([[gnu::unused]] RTLIL::Design* design,
- [[gnu::unused]] const CommandArgs& args) {
-}
+void GetPorts::ExecuteSelection([[gnu::unused]] RTLIL::Design *design, [[gnu::unused]] const CommandArgs &args) {}
-GetPorts::SelectionObjects GetPorts::ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) {
+GetPorts::SelectionObjects GetPorts::ExtractSelection(RTLIL::Design *design, const CommandArgs &args)
+{
std::string port_name = args.selection_objects.at(0);
std::string port_str(port_name.size(), '\0');
int bit(0);
if (!sscanf(port_name.c_str(), "%[^[][%d]", &port_str[0], &bit)) {
- log_error("Couldn't find port %s\n", port_name.c_str());
+ log_error("Couldn't find port %s\n", port_name.c_str());
}
port_str.resize(strlen(port_str.c_str()));
RTLIL::IdString port_id(RTLIL::escape_id(port_str));
SelectionObjects objects;
if (auto wire = design->top_module()->wire(port_id)) {
- if (wire->port_input || wire->port_output) {
- if (bit >= wire->start_offset &&
- bit < wire->start_offset + wire->width) {
- objects.push_back(port_name);
- }
- }
+ if (wire->port_input || wire->port_output) {
+ if (bit >= wire->start_offset && bit < wire->start_offset + wire->width) {
+ objects.push_back(port_name);
+ }
+ }
}
if (objects.size() == 0 and !args.is_quiet) {
- log_warning("Couldn't find port matching %s\n", port_name.c_str());
+ log_warning("Couldn't find port matching %s\n", port_name.c_str());
}
return objects;
}
-
diff --git a/design_introspection-plugin/get_ports.h b/design_introspection-plugin/get_ports.h
index 89ba49a..b1ccb0b 100644
--- a/design_introspection-plugin/get_ports.h
+++ b/design_introspection-plugin/get_ports.h
@@ -27,14 +27,12 @@
struct GetPorts : public GetCmd {
GetPorts() : GetCmd("get_ports", "Print matching ports") {}
- private:
+ private:
std::string TypeName() override;
std::string SelectionType() override;
/* void execute(std::vector<std::string> args, RTLIL::Design* design) override; */
- SelectionObjects ExtractSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
- void ExecuteSelection(RTLIL::Design* design,
- const CommandArgs& args) override;
+ SelectionObjects ExtractSelection(RTLIL::Design *design, const CommandArgs &args) override;
+ void ExecuteSelection(RTLIL::Design *design, const CommandArgs &args) override;
};
-#endif // GET_PORTS_H_
+#endif // GET_PORTS_H_
diff --git a/fasm-plugin/fasm.cc b/fasm-plugin/fasm.cc
index 4ddfdb2..5ab4c1a 100644
--- a/fasm-plugin/fasm.cc
+++ b/fasm-plugin/fasm.cc
@@ -24,62 +24,65 @@
* annotations on the design cells.
*/
+#include "../bank_tiles.h"
+#include "kernel/log.h"
#include "kernel/register.h"
#include "kernel/rtlil.h"
-#include "kernel/log.h"
-#include "../bank_tiles.h"
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
struct WriteFasm : public Backend {
- WriteFasm() : Backend("fasm", "Write out FASM features") {}
+ WriteFasm() : Backend("fasm", "Write out FASM features") {}
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" write_fasm -part_json <part_json_filename> <filename>\n");
+ log("\n");
+ log("Write out a file with vref FASM features.\n");
+ log("\n");
+ }
- void help() override {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" write_fasm -part_json <part_json_filename> <filename>\n");
- log("\n");
- log("Write out a file with vref FASM features.\n");
- log("\n");
- }
+ void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ size_t argidx = 1;
+ std::string part_json;
+ if (args[argidx] == "-part_json" && argidx + 1 < args.size()) {
+ part_json = args[++argidx];
+ argidx++;
+ }
+ extra_args(f, filename, args, argidx);
+ extract_fasm_features(f, design, part_json);
+ }
- void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override {
- size_t argidx = 1;
- std::string part_json;
- if (args[argidx] == "-part_json" && argidx + 1 < args.size()) {
- part_json = args[++argidx];
- argidx++;
- }
- extra_args(f, filename, args, argidx);
- extract_fasm_features(f, design, part_json);
- }
-
- void extract_fasm_features(std::ostream *&f, RTLIL::Design* design, const std::string& part_json) {
- RTLIL::Module* top_module(design->top_module());
- if (top_module == nullptr) {
- log_cmd_error("%s: No top module detected.\n", pass_name.c_str());
- }
- auto bank_tiles = get_bank_tiles(part_json);
- // Generate a fasm feature associated with the INTERNAL_VREF value per bank
- // e.g. VREF value of 0.675 for bank 34 is associated with tile HCLK_IOI3_X113Y26
- // hence we need to emit the following fasm feature: HCLK_IOI3_X113Y26.VREF.V_675_MV
- for (auto cell : top_module->cells()) {
- if (!cell->hasParam(ID(FASM_EXTRA))) continue;
- if (cell->getParam(ID(FASM_EXTRA)) == RTLIL::Const("INTERNAL_VREF")) {
- if (bank_tiles.size() == 0) {
- log_cmd_error("%s: No bank tiles available on the target part.\n", pass_name.c_str());
- }
- int bank_number(cell->getParam(ID(NUMBER)).as_int());
- if (bank_tiles.count(bank_number) == 0) {
- log_cmd_error("%s: No IO bank number %d on the target part.\n", pass_name.c_str(), bank_number);
- }
- int bank_vref(cell->getParam(ID(INTERNAL_VREF)).as_int());
- *f << "HCLK_IOI3_" << bank_tiles[bank_number] <<".VREF.V_" << bank_vref << "_MV\n";
- }
- }
- }
+ void extract_fasm_features(std::ostream *&f, RTLIL::Design *design, const std::string &part_json)
+ {
+ RTLIL::Module *top_module(design->top_module());
+ if (top_module == nullptr) {
+ log_cmd_error("%s: No top module detected.\n", pass_name.c_str());
+ }
+ auto bank_tiles = get_bank_tiles(part_json);
+ // Generate a fasm feature associated with the INTERNAL_VREF value per bank
+ // e.g. VREF value of 0.675 for bank 34 is associated with tile HCLK_IOI3_X113Y26
+ // hence we need to emit the following fasm feature: HCLK_IOI3_X113Y26.VREF.V_675_MV
+ for (auto cell : top_module->cells()) {
+ if (!cell->hasParam(ID(FASM_EXTRA)))
+ continue;
+ if (cell->getParam(ID(FASM_EXTRA)) == RTLIL::Const("INTERNAL_VREF")) {
+ if (bank_tiles.size() == 0) {
+ log_cmd_error("%s: No bank tiles available on the target part.\n", pass_name.c_str());
+ }
+ int bank_number(cell->getParam(ID(NUMBER)).as_int());
+ if (bank_tiles.count(bank_number) == 0) {
+ log_cmd_error("%s: No IO bank number %d on the target part.\n", pass_name.c_str(), bank_number);
+ }
+ int bank_vref(cell->getParam(ID(INTERNAL_VREF)).as_int());
+ *f << "HCLK_IOI3_" << bank_tiles[bank_number] << ".VREF.V_" << bank_vref << "_MV\n";
+ }
+ }
+ }
} WriteFasm;
PRIVATE_NAMESPACE_END
diff --git a/get_count-plugin/get_count.cc b/get_count-plugin/get_count.cc
index b78f9b8..5faff16 100644
--- a/get_count-plugin/get_count.cc
+++ b/get_count-plugin/get_count.cc
@@ -30,18 +30,12 @@
struct GetCount : public Pass {
- enum class ObjectType {
- NONE,
- MODULE,
- CELL,
- WIRE
- };
+ enum class ObjectType { NONE, MODULE, CELL, WIRE };
- GetCount () :
- Pass("get_count", "Returns count of various selected object types to the TCL interpreter") {
- }
+ GetCount() : Pass("get_count", "Returns count of various selected object types to the TCL interpreter") {}
- void help() YS_OVERRIDE {
+ void help() YS_OVERRIDE
+ {
log("\n");
log(" get_count <options> [selection]");
log("\n");
@@ -59,8 +53,9 @@
log(" Returns the count of wires in selection\n");
log("\n");
}
-
- void execute(std::vector<std::string> a_Args, RTLIL::Design* a_Design) YS_OVERRIDE {
+
+ void execute(std::vector<std::string> a_Args, RTLIL::Design *a_Design) YS_OVERRIDE
+ {
// Parse args
ObjectType type = ObjectType::NONE;
@@ -70,29 +65,25 @@
if (a_Args[1] == "-modules") {
type = ObjectType::MODULE;
- }
- else if (a_Args[1] == "-cells") {
+ } else if (a_Args[1] == "-cells") {
type = ObjectType::CELL;
- }
- else if (a_Args[1] == "-wires") {
+ } else if (a_Args[1] == "-wires") {
type = ObjectType::WIRE;
- }
- else if (a_Args[1][0] == '-') {
+ } else if (a_Args[1][0] == '-') {
log_error("Invalid argument '%s'!\n", a_Args[1].c_str());
- }
- else {
+ } else {
log_error("Object type not specified!\n");
}
extra_args(a_Args, 2, a_Design);
// Get the TCL interpreter
- Tcl_Interp* tclInterp = yosys_get_tcl_interp();
+ Tcl_Interp *tclInterp = yosys_get_tcl_interp();
// Count objects
size_t moduleCount = 0;
- size_t cellCount = 0;
- size_t wireCount = 0;
+ size_t cellCount = 0;
+ size_t wireCount = 0;
moduleCount += a_Design->selected_modules().size();
for (auto module : a_Design->selected_modules()) {
@@ -101,8 +92,7 @@
}
size_t count = 0;
- switch (type)
- {
+ switch (type) {
case ObjectType::MODULE:
count = moduleCount;
break;
@@ -119,7 +109,7 @@
// Return the value as string to the TCL interpreter
std::string value = std::to_string(count);
- Tcl_Obj* tclStr = Tcl_NewStringObj(value.c_str(), value.size());
+ Tcl_Obj *tclStr = Tcl_NewStringObj(value.c_str(), value.size());
Tcl_SetObjResult(tclInterp, tclStr);
}
diff --git a/integrateinv-plugin/integrateinv.cc b/integrateinv-plugin/integrateinv.cc
index 4a4f693..f3d5690 100644
--- a/integrateinv-plugin/integrateinv.cc
+++ b/integrateinv-plugin/integrateinv.cc
@@ -27,315 +27,315 @@
/// A structure representing a pin
struct Pin {
- RTLIL::Cell *cell; /// Cell pointer
- RTLIL::IdString port; /// Cell port name
- int bit; /// Port bit index
+ RTLIL::Cell *cell; /// Cell pointer
+ RTLIL::IdString port; /// Cell port name
+ int bit; /// Port bit index
- Pin(RTLIL::Cell *_cell, const RTLIL::IdString &_port, int _bit = 0)
- : cell(_cell), port(_port), bit(_bit) {}
+ Pin(RTLIL::Cell *_cell, const RTLIL::IdString &_port, int _bit = 0) : cell(_cell), port(_port), bit(_bit) {}
- Pin(const Pin &ref) = default;
+ Pin(const Pin &ref) = default;
- unsigned int hash() const {
- if (cell == nullptr) {
- return mkhash_add(port.hash(), bit);
- } else {
- return mkhash_add(mkhash(cell->hash(), port.hash()), bit);
- }
- };
+ unsigned int hash() const
+ {
+ if (cell == nullptr) {
+ return mkhash_add(port.hash(), bit);
+ } else {
+ return mkhash_add(mkhash(cell->hash(), port.hash()), bit);
+ }
+ };
};
-bool operator==(const Pin &lhs, const Pin &rhs) {
- return (lhs.cell == rhs.cell) && (lhs.port == rhs.port) &&
- (lhs.bit == rhs.bit);
-}
+bool operator==(const Pin &lhs, const Pin &rhs) { return (lhs.cell == rhs.cell) && (lhs.port == rhs.port) && (lhs.bit == rhs.bit); }
struct IntegrateInv : public Pass {
- /// Temporary SigBit to SigBit helper map.
- SigMap m_SigMap;
- /// Map of SigBit objects to inverter cells.
- dict<RTLIL::SigBit, RTLIL::Cell *> m_InvMap;
- /// Map of inverter cells that can potentially be integrated and invertable
- /// pins that they are connected to
- dict<RTLIL::Cell *, pool<Pin>> m_Inverters;
- /// Map of invertable pins and names of parameters controlling inversions
- dict<Pin, RTLIL::IdString> m_InvParams;
+ /// Temporary SigBit to SigBit helper map.
+ SigMap m_SigMap;
+ /// Map of SigBit objects to inverter cells.
+ dict<RTLIL::SigBit, RTLIL::Cell *> m_InvMap;
+ /// Map of inverter cells that can potentially be integrated and invertable
+ /// pins that they are connected to
+ dict<RTLIL::Cell *, pool<Pin>> m_Inverters;
+ /// Map of invertable pins and names of parameters controlling inversions
+ dict<Pin, RTLIL::IdString> m_InvParams;
- IntegrateInv()
- : Pass("integrateinv", "Integrates inverters ($_NOT_ cells) into ports "
- "with 'invertible_pin' attribute set") {}
-
- void help() override {
- log("\n");
- log(" integrateinv [selection]");
- log("\n");
- log("This pass integrates inverters into cells that have ports with the\n");
- log("'invertible_pin' attribute set. The attribute should contain the name\n");
- log("of a parameter controlling the inversion.\n");
- log("\n");
- log("This pass is essentially the opposite of the 'extractinv' pass.\n");
- log("\n");
- }
-
- void execute(std::vector<std::string> a_Args,
- RTLIL::Design *a_Design) override {
- log_header(a_Design,
- "Executing INTEGRATEINV pass (integrating pin inverters).\n");
-
- extra_args(a_Args, 1, a_Design);
-
- // Process modules
- for (auto module : a_Design->selected_modules()) {
-
- // Setup the SigMap
- m_SigMap.clear();
- m_SigMap.set(module);
-
- m_Inverters.clear();
- m_InvParams.clear();
-
- // Setup inverter map
- buildInverterMap(module);
-
- // Identify inverters that can be integrated and assign them with
- // lists of cells and ports to integrate with
- for (auto cell : module->selected_cells()) {
- collectInverters(cell);
- }
-
- // Integrate inverters
- integrateInverters();
+ IntegrateInv()
+ : Pass("integrateinv", "Integrates inverters ($_NOT_ cells) into ports "
+ "with 'invertible_pin' attribute set")
+ {
}
- // Clear maps
- m_SigMap.clear();
-
- m_InvMap.clear();
- m_Inverters.clear();
- m_InvParams.clear();
- }
-
- void buildInverterMap(RTLIL::Module *a_Module) {
- m_InvMap.clear();
-
- for (auto cell : a_Module->cells()) {
-
- // Skip non-inverters
- if (cell->type != RTLIL::escape_id("$_NOT_")) {
- continue;
- }
-
- // Get output connection
- auto sigspec = cell->getPort(RTLIL::escape_id("Y"));
- auto sigbit = m_SigMap(sigspec.bits().at(0));
-
- // Store
- log_assert(m_InvMap.count(sigbit) == 0);
- m_InvMap[sigbit] = cell;
- }
- }
-
- void collectInverters(RTLIL::Cell *a_Cell) {
- auto module = a_Cell->module;
- auto design = module->design;
-
- for (auto conn : a_Cell->connections()) {
- auto port = conn.first;
- auto sigspec = conn.second;
-
- // Consider only inputs.
- if (!a_Cell->input(port)) {
- continue;
- }
-
- // Get the cell module
- auto cellModule = design->module(a_Cell->type);
- if (!cellModule) {
- continue;
- }
-
- // Get wire.
- auto wire = cellModule->wire(port);
- if (!wire) {
- continue;
- }
-
- // Check if the pin has an embedded inverter.
- auto it = wire->attributes.find(ID::invertible_pin);
- if (it == wire->attributes.end()) {
- continue;
- }
-
- // Decode the parameter name.
- RTLIL::IdString paramName = RTLIL::escape_id(it->second.decode_string());
-
- // Look for connected inverters
- auto sigbits = sigspec.bits();
- for (size_t bit = 0; bit < sigbits.size(); ++bit) {
-
- auto sigbit = sigbits[bit];
- if (!sigbit.wire) {
- continue;
- }
-
- sigbit = m_SigMap(sigbit);
-
- // Get the inverter if any
- if (!m_InvMap.count(sigbit)) {
- continue;
- }
- auto inv = m_InvMap.at(sigbit);
-
- // Save the inverter pin and the parameter name
- auto pin = Pin(a_Cell, port, bit);
-
- auto &list = m_Inverters[inv];
- list.insert(pin);
-
- log_assert(m_InvParams.count(pin) == 0);
- m_InvParams[pin] = paramName;
- }
- }
- }
-
- void integrateInverters() {
-
- for (auto it : m_Inverters) {
- auto inv = it.first;
- auto pins = it.second;
-
- // List all sinks of the inverter
- auto sinks = getSinksForDriver(Pin(inv, RTLIL::escape_id("Y")));
-
- // If the inverter drives only invertable pins then integrate it
- if (sinks == pins) {
- log("Integrating inverter %s into:\n", log_id(inv->name));
-
- // Integrate into each pin
- for (auto pin : pins) {
- log_assert(pin.cell != nullptr);
- log(" %s.%s[%d]\n", log_id(pin.cell->name), log_id(pin.port),
- pin.bit);
-
- // Change the connection
- auto sigspec = pin.cell->getPort(pin.port);
- auto sigbits = sigspec.bits();
-
- log_assert((size_t)pin.bit < sigbits.size());
- sigbits[pin.bit] =
- RTLIL::SigBit(inv->getPort(RTLIL::escape_id("A"))[0]);
- pin.cell->setPort(pin.port, RTLIL::SigSpec(sigbits));
-
- // Get the control parameter
- log_assert(m_InvParams.count(pin) != 0);
- auto paramName = m_InvParams[pin];
-
- RTLIL::Const invMask;
- auto param = pin.cell->parameters.find(paramName);
- if (param == pin.cell->parameters.end()) {
- invMask = RTLIL::Const(0, sigspec.size());
- } else {
- invMask = RTLIL::Const(param->second);
- }
-
- // Check width.
- if (invMask.size() != sigspec.size()) {
- log_error("The inversion parameter needs to be the same width as "
- "the port (%s port %s parameter %s)",
- log_id(pin.cell->name), log_id(pin.port),
- log_id(paramName));
- }
-
- // Toggle bit in the control parameter bitmask
- if (invMask[pin.bit] == RTLIL::State::S0) {
- invMask[pin.bit] = RTLIL::State::S1;
- } else if (invMask[pin.bit] == RTLIL::State::S1) {
- invMask[pin.bit] = RTLIL::State::S0;
- } else {
- log_error("The inversion parameter must contain only 0s and 1s (%s "
- "parameter %s)\n",
- log_id(pin.cell->name), log_id(paramName));
- }
-
- // Set the parameter back
- pin.cell->setParam(paramName, invMask);
- }
-
- // Remove the inverter
- inv->module->remove(inv);
- }
- }
- }
-
- pool<Pin> getSinksForDriver(const Pin &a_Driver) {
- auto module = a_Driver.cell->module;
- pool<Pin> sinks;
-
- // The driver has to be an output pin
- if (!a_Driver.cell->output(a_Driver.port)) {
- return sinks;
+ void help() override
+ {
+ log("\n");
+ log(" integrateinv [selection]");
+ log("\n");
+ log("This pass integrates inverters into cells that have ports with the\n");
+ log("'invertible_pin' attribute set. The attribute should contain the name\n");
+ log("of a parameter controlling the inversion.\n");
+ log("\n");
+ log("This pass is essentially the opposite of the 'extractinv' pass.\n");
+ log("\n");
}
- // Get the driver sigbit
- auto driverSigspec = a_Driver.cell->getPort(a_Driver.port);
- auto driverSigbit = m_SigMap(driverSigspec.bits().at(a_Driver.bit));
+ void execute(std::vector<std::string> a_Args, RTLIL::Design *a_Design) override
+ {
+ log_header(a_Design, "Executing INTEGRATEINV pass (integrating pin inverters).\n");
- // Look for connected sinks
- for (auto cell : module->cells()) {
- for (auto conn : cell->connections()) {
- auto port = conn.first;
- auto sigspec = conn.second;
+ extra_args(a_Args, 1, a_Design);
- // Consider only sinks (inputs)
- if (!cell->input(port)) {
- continue;
+ // Process modules
+ for (auto module : a_Design->selected_modules()) {
+
+ // Setup the SigMap
+ m_SigMap.clear();
+ m_SigMap.set(module);
+
+ m_Inverters.clear();
+ m_InvParams.clear();
+
+ // Setup inverter map
+ buildInverterMap(module);
+
+ // Identify inverters that can be integrated and assign them with
+ // lists of cells and ports to integrate with
+ for (auto cell : module->selected_cells()) {
+ collectInverters(cell);
+ }
+
+ // Integrate inverters
+ integrateInverters();
}
- // Check all sigbits
- auto sigbits = sigspec.bits();
- for (size_t bit = 0; bit < sigbits.size(); ++bit) {
+ // Clear maps
+ m_SigMap.clear();
- auto sigbit = sigbits[bit];
- if (!sigbit.wire) {
- continue;
- }
-
- // Got a sink pin of another cell
- sigbit = m_SigMap(sigbit);
- if (sigbit == driverSigbit) {
- sinks.insert(Pin(cell, port, bit));
- }
- }
- }
+ m_InvMap.clear();
+ m_Inverters.clear();
+ m_InvParams.clear();
}
- // Look for connected top-level output ports
- for (auto conn : module->connections()) {
- auto dst = conn.first;
- auto src = conn.second;
+ void buildInverterMap(RTLIL::Module *a_Module)
+ {
+ m_InvMap.clear();
- auto sigbits = dst.bits();
- for (size_t bit = 0; bit < sigbits.size(); ++bit) {
+ for (auto cell : a_Module->cells()) {
- auto sigbit = sigbits[bit];
- if (!sigbit.wire) {
- continue;
+ // Skip non-inverters
+ if (cell->type != RTLIL::escape_id("$_NOT_")) {
+ continue;
+ }
+
+ // Get output connection
+ auto sigspec = cell->getPort(RTLIL::escape_id("Y"));
+ auto sigbit = m_SigMap(sigspec.bits().at(0));
+
+ // Store
+ log_assert(m_InvMap.count(sigbit) == 0);
+ m_InvMap[sigbit] = cell;
}
-
- if (!sigbit.wire->port_output) {
- continue;
- }
-
- sigbit = m_SigMap(sigbit);
- if (sigbit == driverSigbit) {
- sinks.insert(Pin(nullptr, sigbit.wire->name, bit));
- }
- }
}
- return sinks;
- }
+ void collectInverters(RTLIL::Cell *a_Cell)
+ {
+ auto module = a_Cell->module;
+ auto design = module->design;
+
+ for (auto conn : a_Cell->connections()) {
+ auto port = conn.first;
+ auto sigspec = conn.second;
+
+ // Consider only inputs.
+ if (!a_Cell->input(port)) {
+ continue;
+ }
+
+ // Get the cell module
+ auto cellModule = design->module(a_Cell->type);
+ if (!cellModule) {
+ continue;
+ }
+
+ // Get wire.
+ auto wire = cellModule->wire(port);
+ if (!wire) {
+ continue;
+ }
+
+ // Check if the pin has an embedded inverter.
+ auto it = wire->attributes.find(ID::invertible_pin);
+ if (it == wire->attributes.end()) {
+ continue;
+ }
+
+ // Decode the parameter name.
+ RTLIL::IdString paramName = RTLIL::escape_id(it->second.decode_string());
+
+ // Look for connected inverters
+ auto sigbits = sigspec.bits();
+ for (size_t bit = 0; bit < sigbits.size(); ++bit) {
+
+ auto sigbit = sigbits[bit];
+ if (!sigbit.wire) {
+ continue;
+ }
+
+ sigbit = m_SigMap(sigbit);
+
+ // Get the inverter if any
+ if (!m_InvMap.count(sigbit)) {
+ continue;
+ }
+ auto inv = m_InvMap.at(sigbit);
+
+ // Save the inverter pin and the parameter name
+ auto pin = Pin(a_Cell, port, bit);
+
+ auto &list = m_Inverters[inv];
+ list.insert(pin);
+
+ log_assert(m_InvParams.count(pin) == 0);
+ m_InvParams[pin] = paramName;
+ }
+ }
+ }
+
+ void integrateInverters()
+ {
+
+ for (auto it : m_Inverters) {
+ auto inv = it.first;
+ auto pins = it.second;
+
+ // List all sinks of the inverter
+ auto sinks = getSinksForDriver(Pin(inv, RTLIL::escape_id("Y")));
+
+ // If the inverter drives only invertable pins then integrate it
+ if (sinks == pins) {
+ log("Integrating inverter %s into:\n", log_id(inv->name));
+
+ // Integrate into each pin
+ for (auto pin : pins) {
+ log_assert(pin.cell != nullptr);
+ log(" %s.%s[%d]\n", log_id(pin.cell->name), log_id(pin.port), pin.bit);
+
+ // Change the connection
+ auto sigspec = pin.cell->getPort(pin.port);
+ auto sigbits = sigspec.bits();
+
+ log_assert((size_t)pin.bit < sigbits.size());
+ sigbits[pin.bit] = RTLIL::SigBit(inv->getPort(RTLIL::escape_id("A"))[0]);
+ pin.cell->setPort(pin.port, RTLIL::SigSpec(sigbits));
+
+ // Get the control parameter
+ log_assert(m_InvParams.count(pin) != 0);
+ auto paramName = m_InvParams[pin];
+
+ RTLIL::Const invMask;
+ auto param = pin.cell->parameters.find(paramName);
+ if (param == pin.cell->parameters.end()) {
+ invMask = RTLIL::Const(0, sigspec.size());
+ } else {
+ invMask = RTLIL::Const(param->second);
+ }
+
+ // Check width.
+ if (invMask.size() != sigspec.size()) {
+ log_error("The inversion parameter needs to be the same width as "
+ "the port (%s port %s parameter %s)",
+ log_id(pin.cell->name), log_id(pin.port), log_id(paramName));
+ }
+
+ // Toggle bit in the control parameter bitmask
+ if (invMask[pin.bit] == RTLIL::State::S0) {
+ invMask[pin.bit] = RTLIL::State::S1;
+ } else if (invMask[pin.bit] == RTLIL::State::S1) {
+ invMask[pin.bit] = RTLIL::State::S0;
+ } else {
+ log_error("The inversion parameter must contain only 0s and 1s (%s "
+ "parameter %s)\n",
+ log_id(pin.cell->name), log_id(paramName));
+ }
+
+ // Set the parameter back
+ pin.cell->setParam(paramName, invMask);
+ }
+
+ // Remove the inverter
+ inv->module->remove(inv);
+ }
+ }
+ }
+
+ pool<Pin> getSinksForDriver(const Pin &a_Driver)
+ {
+ auto module = a_Driver.cell->module;
+ pool<Pin> sinks;
+
+ // The driver has to be an output pin
+ if (!a_Driver.cell->output(a_Driver.port)) {
+ return sinks;
+ }
+
+ // Get the driver sigbit
+ auto driverSigspec = a_Driver.cell->getPort(a_Driver.port);
+ auto driverSigbit = m_SigMap(driverSigspec.bits().at(a_Driver.bit));
+
+ // Look for connected sinks
+ for (auto cell : module->cells()) {
+ for (auto conn : cell->connections()) {
+ auto port = conn.first;
+ auto sigspec = conn.second;
+
+ // Consider only sinks (inputs)
+ if (!cell->input(port)) {
+ continue;
+ }
+
+ // Check all sigbits
+ auto sigbits = sigspec.bits();
+ for (size_t bit = 0; bit < sigbits.size(); ++bit) {
+
+ auto sigbit = sigbits[bit];
+ if (!sigbit.wire) {
+ continue;
+ }
+
+ // Got a sink pin of another cell
+ sigbit = m_SigMap(sigbit);
+ if (sigbit == driverSigbit) {
+ sinks.insert(Pin(cell, port, bit));
+ }
+ }
+ }
+ }
+
+ // Look for connected top-level output ports
+ for (auto conn : module->connections()) {
+ auto dst = conn.first;
+ auto src = conn.second;
+
+ auto sigbits = dst.bits();
+ for (size_t bit = 0; bit < sigbits.size(); ++bit) {
+
+ auto sigbit = sigbits[bit];
+ if (!sigbit.wire) {
+ continue;
+ }
+
+ if (!sigbit.wire->port_output) {
+ continue;
+ }
+
+ sigbit = m_SigMap(sigbit);
+ if (sigbit == driverSigbit) {
+ sinks.insert(Pin(nullptr, sigbit.wire->name, bit));
+ }
+ }
+ }
+
+ return sinks;
+ }
} IntegrateInv;
diff --git a/params-plugin/params.cc b/params-plugin/params.cc
index c4f169b..cddc737 100644
--- a/params-plugin/params.cc
+++ b/params-plugin/params.cc
@@ -16,66 +16,64 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include "kernel/log.h"
#include "kernel/register.h"
#include "kernel/rtlil.h"
-#include "kernel/log.h"
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-
-void register_in_tcl_interpreter(const std::string& command) {
- Tcl_Interp* interp = yosys_get_tcl_interp();
- std::string tcl_script = stringf("proc %s args { return [yosys %s {*}$args] }", command.c_str(), command.c_str());
- Tcl_Eval(interp, tcl_script.c_str());
+void register_in_tcl_interpreter(const std::string &command)
+{
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ std::string tcl_script = stringf("proc %s args { return [yosys %s {*}$args] }", command.c_str(), command.c_str());
+ Tcl_Eval(interp, tcl_script.c_str());
}
struct GetParam : public Pass {
- GetParam() : Pass("getparam", "get parameter on object") {
- register_in_tcl_interpreter(pass_name);
- }
+ GetParam() : Pass("getparam", "get parameter on object") { register_in_tcl_interpreter(pass_name); }
- void help() override
- {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" getparam name selection\n");
- log("\n");
- log("Get the given parameter on the selected object. \n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" getparam name selection\n");
+ log("\n");
+ log("Get the given parameter on the selected object. \n");
+ log("\n");
+ }
- void execute(std::vector<std::string> args, RTLIL::Design* design) override
- {
- if (args.size() == 1) {
- log_error("Incorrect number of arguments");
- }
- extra_args(args, 2, design);
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ if (args.size() == 1) {
+ log_error("Incorrect number of arguments");
+ }
+ extra_args(args, 2, design);
- auto param = RTLIL::IdString(RTLIL::escape_id(args.at(1)));
- Tcl_Interp *interp = yosys_get_tcl_interp();
- Tcl_Obj* tcl_list = Tcl_NewListObj(0, NULL);
+ auto param = RTLIL::IdString(RTLIL::escape_id(args.at(1)));
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ Tcl_Obj *tcl_list = Tcl_NewListObj(0, NULL);
- for (auto module : design->selected_modules()) {
- for (auto cell : module->selected_cells()) {
- auto params = cell->parameters;
- auto it = params.find(param);
- if (it != params.end()) {
- std::string value;
- auto param_obj = it->second;
- if (param_obj.flags & RTLIL::CONST_FLAG_STRING) {
- value = param_obj.decode_string();
- } else {
- value = std::to_string(param_obj.as_int());
- }
- Tcl_Obj* value_obj = Tcl_NewStringObj(value.c_str(), value.size());
- Tcl_ListObjAppendElement(interp, tcl_list, value_obj);
- }
- }
- }
- Tcl_SetObjResult(interp, tcl_list);
- }
+ for (auto module : design->selected_modules()) {
+ for (auto cell : module->selected_cells()) {
+ auto params = cell->parameters;
+ auto it = params.find(param);
+ if (it != params.end()) {
+ std::string value;
+ auto param_obj = it->second;
+ if (param_obj.flags & RTLIL::CONST_FLAG_STRING) {
+ value = param_obj.decode_string();
+ } else {
+ value = std::to_string(param_obj.as_int());
+ }
+ Tcl_Obj *value_obj = Tcl_NewStringObj(value.c_str(), value.size());
+ Tcl_ListObjAppendElement(interp, tcl_list, value_obj);
+ }
+ }
+ }
+ Tcl_SetObjResult(interp, tcl_list);
+ }
} GetParam;
diff --git a/ql-iob-plugin/pcf_parser.cc b/ql-iob-plugin/pcf_parser.cc
index c7a9309..f8e1aeb 100644
--- a/ql-iob-plugin/pcf_parser.cc
+++ b/ql-iob-plugin/pcf_parser.cc
@@ -23,7 +23,8 @@
// ============================================================================
-bool PcfParser::parse (const std::string& a_FileName) {
+bool PcfParser::parse(const std::string &a_FileName)
+{
// Open the file
std::ifstream file(a_FileName.c_str());
@@ -32,14 +33,12 @@
return parse(file);
}
-const std::vector<PcfParser::Constraint> PcfParser::getConstraints () const {
- return m_Constraints;
-}
-
+const std::vector<PcfParser::Constraint> PcfParser::getConstraints() const { return m_Constraints; }
// ============================================================================
-bool PcfParser::parse (std::ifstream& a_Stream) {
+bool PcfParser::parse(std::ifstream &a_Stream)
+{
if (!a_Stream.good()) {
return false;
@@ -58,13 +57,7 @@
// Match against regex
std::cmatch cm;
if (std::regex_match(line.c_str(), cm, re)) {
- m_Constraints.push_back(
- Constraint(
- cm[1].str(),
- cm[2].str(),
- cm[3].str()
- )
- );
+ m_Constraints.push_back(Constraint(cm[1].str(), cm[2].str(), cm[3].str()));
}
}
diff --git a/ql-iob-plugin/pinmap_parser.cc b/ql-iob-plugin/pinmap_parser.cc
index 77e3662..ceaf30a 100644
--- a/ql-iob-plugin/pinmap_parser.cc
+++ b/ql-iob-plugin/pinmap_parser.cc
@@ -23,7 +23,8 @@
// ============================================================================
-bool PinmapParser::parse (const std::string& a_FileName) {
+bool PinmapParser::parse(const std::string &a_FileName)
+{
// Open the file
std::ifstream file(a_FileName.c_str());
@@ -32,13 +33,12 @@
return parse(file);
}
-const std::vector<PinmapParser::Entry> PinmapParser::getEntries() const {
- return m_Entries;
-}
+const std::vector<PinmapParser::Entry> PinmapParser::getEntries() const { return m_Entries; }
// ============================================================================
-std::vector<std::string> PinmapParser::getFields (const std::string& a_String) {
+std::vector<std::string> PinmapParser::getFields(const std::string &a_String)
+{
std::vector<std::string> fields;
std::stringstream ss(a_String);
@@ -53,7 +53,8 @@
return fields;
}
-bool PinmapParser::parseHeader (std::ifstream& a_Stream) {
+bool PinmapParser::parseHeader(std::ifstream &a_Stream)
+{
// Get the header line
std::string header;
@@ -68,7 +69,8 @@
return true;
}
-bool PinmapParser::parseData (std::ifstream& a_Stream) {
+bool PinmapParser::parseData(std::ifstream &a_Stream)
+{
// Parse lines as they come
while (a_Stream.good()) {
@@ -84,7 +86,7 @@
// Assign data fields to columns
Entry entry;
- for (size_t i=0; i<data.size(); ++i) {
+ for (size_t i = 0; i < data.size(); ++i) {
if (i >= m_Fields.size()) {
return false;
@@ -99,7 +101,8 @@
return true;
}
-bool PinmapParser::parse (std::ifstream& a_Stream) {
+bool PinmapParser::parse(std::ifstream &a_Stream)
+{
if (!a_Stream.good()) {
return false;
diff --git a/ql-iob-plugin/ql-iob.cc b/ql-iob-plugin/ql-iob.cc
index 6574535..d6aeefc 100644
--- a/ql-iob-plugin/ql-iob.cc
+++ b/ql-iob-plugin/ql-iob.cc
@@ -41,18 +41,16 @@
std::string port; // Name of the port that goes to a pad
std::vector<std::string> preferredTypes; // A list of preferred IO cell types
- IoCellType (const std::string& _type, const std::string& _port, const std::vector<std::string> _preferredTypes = std::vector<std::string>()) :
- type(_type),
- port(_port),
- preferredTypes(_preferredTypes)
- {}
+ IoCellType(const std::string &_type, const std::string &_port, const std::vector<std::string> _preferredTypes = std::vector<std::string>())
+ : type(_type), port(_port), preferredTypes(_preferredTypes)
+ {
+ }
};
- QuicklogicIob () :
- Pass("quicklogic_iob", "Map IO buffers to cells that correspond to their assigned locations") {
- }
+ QuicklogicIob() : Pass("quicklogic_iob", "Map IO buffers to cells that correspond to their assigned locations") {}
- void help() YS_OVERRIDE {
+ void help() YS_OVERRIDE
+ {
log("\n");
log(" quicklogic_iob <PCF file> <pinmap file> [<io cell specs>]");
log("\n");
@@ -82,8 +80,9 @@
log(" types in order of preference.\n");
log("\n");
}
-
- void execute(std::vector<std::string> a_Args, RTLIL::Design* a_Design) YS_OVERRIDE {
+
+ void execute(std::vector<std::string> a_Args, RTLIL::Design *a_Design) YS_OVERRIDE
+ {
if (a_Args.size() < 3) {
log_cmd_error(" Usage: quicklogic_iob <PCF file> <pinmap file> [<io cell specs>]");
}
@@ -91,7 +90,6 @@
// A map of IO cell types and their port names that should go to a pad
std::unordered_map<std::string, IoCellType> ioCellTypes;
-
// Parse io cell specification
if (a_Args.size() > 3) {
@@ -100,7 +98,7 @@
std::regex re1("^([\\w$]+):([\\w$]+)$");
std::regex re2("^([\\w$]+):([\\w$]+):([\\w,$]+)$");
- for (size_t i=3; i<a_Args.size(); ++i) {
+ for (size_t i = 3; i < a_Args.size(); ++i) {
std::cmatch cm;
// No preffered IO cell types
@@ -119,7 +117,7 @@
preferredTypes.push_back(field);
}
-
+
ioCellTypes.emplace(cm[1].str(), IoCellType(cm[1], cm[2], preferredTypes));
}
@@ -132,14 +130,14 @@
// Use the default IO cells for QuickLogic FPGAs
else {
- ioCellTypes.emplace("inpad", IoCellType("inpad", "P", {"BIDIR", "SDIOMUX"}));
+ ioCellTypes.emplace("inpad", IoCellType("inpad", "P", {"BIDIR", "SDIOMUX"}));
ioCellTypes.emplace("outpad", IoCellType("outpad", "P", {"BIDIR", "SDIOMUX"}));
- ioCellTypes.emplace("bipad", IoCellType("bipad", "P", {"BIDIR", "SDIOMUX"}));
- ioCellTypes.emplace("ckpad", IoCellType("ckpad", "P", {"CLOCK", "BIDIR", "SDIOMUX"}));
+ ioCellTypes.emplace("bipad", IoCellType("bipad", "P", {"BIDIR", "SDIOMUX"}));
+ ioCellTypes.emplace("ckpad", IoCellType("ckpad", "P", {"CLOCK", "BIDIR", "SDIOMUX"}));
}
// Get the top module of the design
- RTLIL::Module* topModule = a_Design->top_module();
+ RTLIL::Module *topModule = a_Design->top_module();
if (topModule == nullptr) {
log_cmd_error("No top module detected!\n");
}
@@ -153,7 +151,7 @@
// Build a map of net names to constraints
std::unordered_map<std::string, const PcfParser::Constraint> constraintMap;
- for (auto& constraint : pcfParser.getConstraints()) {
+ for (auto &constraint : pcfParser.getConstraints()) {
if (constraintMap.count(constraint.netName) != 0) {
log_cmd_error("The net '%s' is constrained twice!", constraint.netName.c_str());
}
@@ -169,9 +167,9 @@
// Build a map of pad names to entries
std::unordered_map<std::string, std::vector<PinmapParser::Entry>> pinmapMap;
- for (auto& entry : pinmapParser.getEntries()) {
+ for (auto &entry : pinmapParser.getEntries()) {
if (entry.count("name") != 0) {
- auto& name = entry.at("name");
+ auto &name = entry.at("name");
if (pinmapMap.count(name) == 0) {
pinmapMap[name] = std::vector<PinmapParser::Entry>();
@@ -187,7 +185,7 @@
log(" type | net | pad | loc | type | instance\n");
log(" ------------+------------+------------+----------+----------+-----------\n");
for (auto cell : topModule->cells()) {
- auto ysCellType = RTLIL::unescape_id(cell->type);
+ auto ysCellType = RTLIL::unescape_id(cell->type);
// Not an IO cell
if (ioCellTypes.count(ysCellType) == 0) {
@@ -202,7 +200,7 @@
std::string cellType;
// Get connections to the specified port
- const auto& ioCellType = ioCellTypes.at(ysCellType);
+ const auto &ioCellType = ioCellTypes.at(ysCellType);
const std::string port = RTLIL::escape_id(ioCellType.port);
if (cell->connections().count(port)) {
@@ -220,15 +218,15 @@
// Check if the wire is constrained. Get pad name.
std::string baseName = RTLIL::unescape_id(wire->name);
std::string netNames[] = {
- baseName,
- stringf("%s[%d]", baseName.c_str(), sigbit.offset),
- stringf("%s(%d)", baseName.c_str(), sigbit.offset),
+ baseName,
+ stringf("%s[%d]", baseName.c_str(), sigbit.offset),
+ stringf("%s(%d)", baseName.c_str(), sigbit.offset),
};
padName = "";
netName = "";
- for (auto& name : netNames) {
+ for (auto &name : netNames) {
if (constraintMap.count(name)) {
auto constraint = constraintMap.at(name);
padName = constraint.padName;
@@ -241,17 +239,11 @@
if (pinmapMap.count(padName)) {
// Choose a correct entry for the cell
- auto entry = choosePinmapEntry(
- pinmapMap.at(padName),
- ioCellType
- );
+ auto entry = choosePinmapEntry(pinmapMap.at(padName), ioCellType);
// Location string
if (entry.count("x") && entry.count("y")) {
- locName = stringf("X%sY%s",
- entry.at("x").c_str(),
- entry.at("y").c_str()
- );
+ locName = stringf("X%sY%s", entry.at("x").c_str(), entry.at("y").c_str());
}
// Cell type
@@ -264,24 +256,16 @@
}
}
- log("| %-10s | %-10s | %-8s | %-8s | %s\n",
- netName.c_str(),
- padName.c_str(),
- locName.c_str(),
- cellType.c_str(),
- cell->name.c_str()
- );
+ log("| %-10s | %-10s | %-8s | %-8s | %s\n", netName.c_str(), padName.c_str(), locName.c_str(), cellType.c_str(), cell->name.c_str());
// Annotate the cell by setting its parameters
- cell->setParam(RTLIL::escape_id("IO_PAD"), padName);
- cell->setParam(RTLIL::escape_id("IO_LOC"), locName);
+ cell->setParam(RTLIL::escape_id("IO_PAD"), padName);
+ cell->setParam(RTLIL::escape_id("IO_LOC"), locName);
cell->setParam(RTLIL::escape_id("IO_TYPE"), cellType);
}
}
- PinmapParser::Entry choosePinmapEntry(
- const std::vector<PinmapParser::Entry>& a_Entries,
- const IoCellType& a_IoCellType)
+ PinmapParser::Entry choosePinmapEntry(const std::vector<PinmapParser::Entry> &a_Entries, const IoCellType &a_IoCellType)
{
// No preferred types, pick the first one
if (a_IoCellType.preferredTypes.empty()) {
@@ -289,10 +273,10 @@
}
// Loop over preferred types
- for (auto& type : a_IoCellType.preferredTypes) {
-
+ for (auto &type : a_IoCellType.preferredTypes) {
+
// Find an entry for that type. If found then return it.
- for (auto& entry : a_Entries) {
+ for (auto &entry : a_Entries) {
if (type == entry.at("type")) {
return entry;
}
diff --git a/sdc-plugin/buffers.cc b/sdc-plugin/buffers.cc
index a48a26a..33aceee 100644
--- a/sdc-plugin/buffers.cc
+++ b/sdc-plugin/buffers.cc
@@ -20,14 +20,12 @@
#include <cmath>
const std::vector<std::string> Pll::inputs = {"CLKIN1", "CLKIN2"};
-const std::vector<std::string> Pll::outputs = {"CLKOUT0", "CLKOUT1", "CLKOUT2",
- "CLKOUT3", "CLKOUT4", "CLKOUT5"};
+const std::vector<std::string> Pll::outputs = {"CLKOUT0", "CLKOUT1", "CLKOUT2", "CLKOUT3", "CLKOUT4", "CLKOUT5"};
const float Pll::delay = 0;
const std::string Pll::name = "PLLE2_ADV";
-Pll::Pll(RTLIL::Cell* cell, float input_clock_period,
- float input_clock_rising_edge)
- : ClockDivider({"PLLE2_ADV"}) {
+Pll::Pll(RTLIL::Cell *cell, float input_clock_period, float input_clock_rising_edge) : ClockDivider({"PLLE2_ADV"})
+{
assert(RTLIL::unescape_id(cell->type) == "PLLE2_ADV");
FetchParams(cell);
CheckInputClockPeriod(cell, input_clock_period);
@@ -35,73 +33,67 @@
CalculateOutputClockWaveforms(input_clock_rising_edge);
}
-void Pll::CheckInputClockPeriod(RTLIL::Cell* cell, float input_clock_period) {
+void Pll::CheckInputClockPeriod(RTLIL::Cell *cell, float input_clock_period)
+{
float abs_diff = fabs(ClkinPeriod() - input_clock_period);
- bool approx_equal = abs_diff < std::max(ClkinPeriod(), input_clock_period) *
- 10 *
- std::numeric_limits<float>::epsilon();
+ bool approx_equal = abs_diff < std::max(ClkinPeriod(), input_clock_period) * 10 * std::numeric_limits<float>::epsilon();
if (!approx_equal) {
- log_cmd_error(
- "CLKIN[1/2]_PERIOD doesn't match the virtual clock constraint "
- "propagated to the CLKIN[1/2] input of the clock divider cell: "
- "%s.\nInput clock period: %f, CLKIN[1/2]_PERIOD: %f\n",
- RTLIL::id2cstr(cell->name), input_clock_period, ClkinPeriod());
+ log_cmd_error("CLKIN[1/2]_PERIOD doesn't match the virtual clock constraint "
+ "propagated to the CLKIN[1/2] input of the clock divider cell: "
+ "%s.\nInput clock period: %f, CLKIN[1/2]_PERIOD: %f\n",
+ RTLIL::id2cstr(cell->name), input_clock_period, ClkinPeriod());
}
}
-void Pll::FetchParams(RTLIL::Cell* cell) {
+void Pll::FetchParams(RTLIL::Cell *cell)
+{
clkin1_period = FetchParam(cell, "CLKIN1_PERIOD", 0.0);
clkin2_period = FetchParam(cell, "CLKIN2_PERIOD", 0.0);
clk_mult = FetchParam(cell, "CLKFBOUT_MULT", 5.0);
clk_fbout_phase = FetchParam(cell, "CLKFBOUT_PHASE", 0.0);
divclk_divisor = FetchParam(cell, "DIVCLK_DIVIDE", 1.0);
for (auto output : outputs) {
- // CLKOUT[0-5]_DUTY_CYCLE
- clkout_duty_cycle[output] =
- FetchParam(cell, output + "_DUTY_CYCLE", 0.5);
- // CLKOUT[0-5]_DIVIDE
- clkout_divisor[output] = FetchParam(cell, output + "_DIVIDE", 1.0);
- // CLKOUT[0-5]_PHASE
- clkout_phase[output] = FetchParam(cell, output + "_PHASE", 0.0);
+ // CLKOUT[0-5]_DUTY_CYCLE
+ clkout_duty_cycle[output] = FetchParam(cell, output + "_DUTY_CYCLE", 0.5);
+ // CLKOUT[0-5]_DIVIDE
+ clkout_divisor[output] = FetchParam(cell, output + "_DIVIDE", 1.0);
+ // CLKOUT[0-5]_PHASE
+ clkout_phase[output] = FetchParam(cell, output + "_PHASE", 0.0);
}
}
-void Pll::CalculateOutputClockPeriods() {
+void Pll::CalculateOutputClockPeriods()
+{
for (auto output : outputs) {
- // CLKOUT[0-5]_PERIOD = CLKIN1_PERIOD * CLKOUT[0-5]_DIVIDE *
- // DIVCLK_DIVIDE / CLKFBOUT_MULT
- clkout_period[output] = ClkinPeriod() * clkout_divisor.at(output) /
- clk_mult * divclk_divisor;
+ // CLKOUT[0-5]_PERIOD = CLKIN1_PERIOD * CLKOUT[0-5]_DIVIDE *
+ // DIVCLK_DIVIDE / CLKFBOUT_MULT
+ clkout_period[output] = ClkinPeriod() * clkout_divisor.at(output) / clk_mult * divclk_divisor;
}
}
-void Pll::CalculateOutputClockWaveforms(float input_clock_rising_edge) {
+void Pll::CalculateOutputClockWaveforms(float input_clock_rising_edge)
+{
for (auto output : outputs) {
- float output_clock_period = clkout_period.at(output);
- clkout_rising_edge[output] =
- fmod(input_clock_rising_edge -
- (clk_fbout_phase / 360.0) * ClkinPeriod() +
- output_clock_period * (clkout_phase[output] / 360.0),
- output_clock_period);
- clkout_falling_edge[output] =
- fmod(clkout_rising_edge[output] +
- clkout_duty_cycle[output] * output_clock_period,
- output_clock_period);
+ float output_clock_period = clkout_period.at(output);
+ clkout_rising_edge[output] =
+ fmod(input_clock_rising_edge - (clk_fbout_phase / 360.0) * ClkinPeriod() + output_clock_period * (clkout_phase[output] / 360.0),
+ output_clock_period);
+ clkout_falling_edge[output] = fmod(clkout_rising_edge[output] + clkout_duty_cycle[output] * output_clock_period, output_clock_period);
}
}
-float Pll::FetchParam(RTLIL::Cell* cell, std::string&& param_name,
- float default_value) {
+float Pll::FetchParam(RTLIL::Cell *cell, std::string &¶m_name, float default_value)
+{
RTLIL::IdString param(RTLIL::escape_id(param_name));
if (cell->hasParam(param)) {
- auto param_obj = cell->parameters.at(param);
- std::string value;
- if (param_obj.flags & RTLIL::CONST_FLAG_STRING) {
- value = param_obj.decode_string();
- } else {
- value = std::to_string(param_obj.as_int());
- }
- return std::stof(value);
+ auto param_obj = cell->parameters.at(param);
+ std::string value;
+ if (param_obj.flags & RTLIL::CONST_FLAG_STRING) {
+ value = param_obj.decode_string();
+ } else {
+ value = std::to_string(param_obj.as_int());
+ }
+ return std::stof(value);
}
return default_value;
}
diff --git a/sdc-plugin/buffers.h b/sdc-plugin/buffers.h
index ba3faa4..bfa5a20 100644
--- a/sdc-plugin/buffers.h
+++ b/sdc-plugin/buffers.h
@@ -18,16 +18,15 @@
#ifndef _BUFFERS_H_
#define _BUFFERS_H_
+#include "kernel/rtlil.h"
#include <string>
#include <unordered_map>
#include <vector>
-#include "kernel/rtlil.h"
USING_YOSYS_NAMESPACE
struct Buffer {
- Buffer(float delay, const std::string& type, const std::string& output)
- : delay(delay), type(type), output(output) {}
+ Buffer(float delay, const std::string &type, const std::string &output) : delay(delay), type(type), output(output) {}
float delay;
std::string type;
std::string output;
@@ -47,12 +46,10 @@
struct Pll : public ClockDivider {
Pll() : ClockDivider({"PLLE2_ADV"}) {}
- Pll(RTLIL::Cell* cell, float input_clock_period,
- float input_clock_rising_edge);
+ Pll(RTLIL::Cell *cell, float input_clock_period, float input_clock_rising_edge);
// Helper function to fetch a cell parameter or return a default value
- static float FetchParam(RTLIL::Cell* cell, std::string&& param_name,
- float default_value);
+ static float FetchParam(RTLIL::Cell *cell, std::string &¶m_name, float default_value);
// Get the period of the input clock
// TODO Add support for CLKINSEL
@@ -65,13 +62,13 @@
std::unordered_map<std::string, float> clkout_rising_edge;
std::unordered_map<std::string, float> clkout_falling_edge;
- private:
+ private:
// Approximate equality check of the input clock period and specified in
// CLKIN[1/2]_PERIOD parameter
- void CheckInputClockPeriod(RTLIL::Cell* cell, float input_clock_period);
+ void CheckInputClockPeriod(RTLIL::Cell *cell, float input_clock_period);
// Fetch cell's parameters needed for further calculations
- void FetchParams(RTLIL::Cell* cell);
+ void FetchParams(RTLIL::Cell *cell);
// Calculate the period on the output clocks
void CalculateOutputClockPeriods();
@@ -90,4 +87,4 @@
float clk_fbout_phase;
};
-#endif // _BUFFERS_H_
+#endif // _BUFFERS_H_
diff --git a/sdc-plugin/clocks.cc b/sdc-plugin/clocks.cc
index 865dd37..6dbb962 100644
--- a/sdc-plugin/clocks.cc
+++ b/sdc-plugin/clocks.cc
@@ -16,141 +16,127 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "clocks.h"
+#include "kernel/register.h"
+#include "propagation.h"
#include <cassert>
#include <cmath>
#include <regex>
-#include "kernel/register.h"
-#include "propagation.h"
-void Clock::Add(const std::string& name, RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge, ClockType type) {
+void Clock::Add(const std::string &name, RTLIL::Wire *wire, float period, float rising_edge, float falling_edge, ClockType type)
+{
wire->set_string_attribute(RTLIL::escape_id("CLOCK_SIGNAL"), "yes");
wire->set_bool_attribute(RTLIL::escape_id("IS_GENERATED"), type == GENERATED);
wire->set_bool_attribute(RTLIL::escape_id("IS_EXPLICIT"), type == EXPLICIT);
wire->set_bool_attribute(RTLIL::escape_id("IS_PROPAGATED"), type == PROPAGATED);
wire->set_string_attribute(RTLIL::escape_id("CLASS"), "clock");
wire->set_string_attribute(RTLIL::escape_id("NAME"), name);
- wire->set_string_attribute(RTLIL::escape_id("SOURCE_WIRES"),
- Clock::WireName(wire));
- wire->set_string_attribute(RTLIL::escape_id("PERIOD"),
- std::to_string(period));
- std::string waveform(std::to_string(rising_edge) + " " +
- std::to_string(falling_edge));
+ wire->set_string_attribute(RTLIL::escape_id("SOURCE_WIRES"), Clock::WireName(wire));
+ wire->set_string_attribute(RTLIL::escape_id("PERIOD"), std::to_string(period));
+ std::string waveform(std::to_string(rising_edge) + " " + std::to_string(falling_edge));
wire->set_string_attribute(RTLIL::escape_id("WAVEFORM"), waveform);
}
-void Clock::Add(const std::string& name, std::vector<RTLIL::Wire*> wires,
- float period, float rising_edge, float falling_edge, ClockType type) {
- std::for_each(wires.begin(), wires.end(), [&](RTLIL::Wire* wire) {
- Add(name, wire, period, rising_edge, falling_edge, type);
- });
+void Clock::Add(const std::string &name, std::vector<RTLIL::Wire *> wires, float period, float rising_edge, float falling_edge, ClockType type)
+{
+ std::for_each(wires.begin(), wires.end(), [&](RTLIL::Wire *wire) { Add(name, wire, period, rising_edge, falling_edge, type); });
}
-void Clock::Add(RTLIL::Wire* wire, float period, float rising_edge,
- float falling_edge, ClockType type) {
+void Clock::Add(RTLIL::Wire *wire, float period, float rising_edge, float falling_edge, ClockType type)
+{
Add(Clock::WireName(wire), wire, period, rising_edge, falling_edge, type);
}
-float Clock::Period(RTLIL::Wire* clock_wire) {
+float Clock::Period(RTLIL::Wire *clock_wire)
+{
if (!clock_wire->has_attribute(RTLIL::escape_id("PERIOD"))) {
- log_cmd_error("PERIOD has not been specified on wire '%s'.\n",
- WireName(clock_wire).c_str());
+ log_cmd_error("PERIOD has not been specified on wire '%s'.\n", WireName(clock_wire).c_str());
}
float period(0);
std::string period_str;
try {
- period_str =
- clock_wire->get_string_attribute(RTLIL::escape_id("PERIOD"));
- period = std::stof(period_str);
- } catch (const std::invalid_argument& e) {
- log_cmd_error(
- "Incorrect value '%s' specifed on PERIOD attribute for wire "
- "'%s'.\nPERIOD needs to be a float value.\n",
- period_str.c_str(), WireName(clock_wire).c_str());
+ period_str = clock_wire->get_string_attribute(RTLIL::escape_id("PERIOD"));
+ period = std::stof(period_str);
+ } catch (const std::invalid_argument &e) {
+ log_cmd_error("Incorrect value '%s' specifed on PERIOD attribute for wire "
+ "'%s'.\nPERIOD needs to be a float value.\n",
+ period_str.c_str(), WireName(clock_wire).c_str());
}
return period;
}
-std::pair<float, float> Clock::Waveform(RTLIL::Wire* clock_wire) {
+std::pair<float, float> Clock::Waveform(RTLIL::Wire *clock_wire)
+{
if (!clock_wire->has_attribute(RTLIL::escape_id("WAVEFORM"))) {
- float period(Period(clock_wire));
- if (!period) {
- log_cmd_error(
- "Neither PERIOD nor WAVEFORM has been specified for wire %s\n",
- WireName(clock_wire).c_str());
- return std::make_pair(0, 0);
- }
- float falling_edge = period / 2;
- log_warning(
- "Waveform has not been specified on wire '%s'.\nDefault value {0 %f} "
- "will be used\n",
- WireName(clock_wire).c_str(), falling_edge);
- return std::make_pair(0, falling_edge);
+ float period(Period(clock_wire));
+ if (!period) {
+ log_cmd_error("Neither PERIOD nor WAVEFORM has been specified for wire %s\n", WireName(clock_wire).c_str());
+ return std::make_pair(0, 0);
+ }
+ float falling_edge = period / 2;
+ log_warning("Waveform has not been specified on wire '%s'.\nDefault value {0 %f} "
+ "will be used\n",
+ WireName(clock_wire).c_str(), falling_edge);
+ return std::make_pair(0, falling_edge);
}
float rising_edge(0);
float falling_edge(0);
- std::string waveform(
- clock_wire->get_string_attribute(RTLIL::escape_id("WAVEFORM")));
- if (std::sscanf(waveform.c_str(), "%f %f", &rising_edge, &falling_edge) !=
- 2) {
- log_cmd_error(
- "Incorrect value '%s' specifed on WAVEFORM attribute for wire "
- "'%s'.\nWAVEFORM needs to be specified in form of '<rising_edge> "
- "<falling_edge>' where the edge values are floats.\n",
- waveform.c_str(), WireName(clock_wire).c_str());
+ std::string waveform(clock_wire->get_string_attribute(RTLIL::escape_id("WAVEFORM")));
+ if (std::sscanf(waveform.c_str(), "%f %f", &rising_edge, &falling_edge) != 2) {
+ log_cmd_error("Incorrect value '%s' specifed on WAVEFORM attribute for wire "
+ "'%s'.\nWAVEFORM needs to be specified in form of '<rising_edge> "
+ "<falling_edge>' where the edge values are floats.\n",
+ waveform.c_str(), WireName(clock_wire).c_str());
}
return std::make_pair(rising_edge, falling_edge);
}
-float Clock::RisingEdge(RTLIL::Wire* clock_wire) {
- return Waveform(clock_wire).first;
-}
+float Clock::RisingEdge(RTLIL::Wire *clock_wire) { return Waveform(clock_wire).first; }
-float Clock::FallingEdge(RTLIL::Wire* clock_wire) {
- return Waveform(clock_wire).second;
-}
+float Clock::FallingEdge(RTLIL::Wire *clock_wire) { return Waveform(clock_wire).second; }
-std::string Clock::Name(RTLIL::Wire* clock_wire) {
+std::string Clock::Name(RTLIL::Wire *clock_wire)
+{
if (clock_wire->has_attribute(RTLIL::escape_id("NAME"))) {
- return clock_wire->get_string_attribute(RTLIL::escape_id("NAME"));
+ return clock_wire->get_string_attribute(RTLIL::escape_id("NAME"));
}
return WireName(clock_wire);
}
-std::string Clock::WireName(RTLIL::Wire* clock_wire) {
+std::string Clock::WireName(RTLIL::Wire *clock_wire)
+{
if (!clock_wire) {
- return std::string();
+ return std::string();
}
return AddEscaping(RTLIL::unescape_id(clock_wire->name));
}
-std::string Clock::SourceWireName(RTLIL::Wire* clock_wire) {
+std::string Clock::SourceWireName(RTLIL::Wire *clock_wire)
+{
if (clock_wire->has_attribute(RTLIL::escape_id("SOURCE_WIRES"))) {
- return clock_wire->get_string_attribute(RTLIL::escape_id("SOURCE_WIRES"));
+ return clock_wire->get_string_attribute(RTLIL::escape_id("SOURCE_WIRES"));
}
return Name(clock_wire);
}
-bool Clock::GetClockWireBoolAttribute(RTLIL::Wire* wire, const std::string& attribute_name) {
+bool Clock::GetClockWireBoolAttribute(RTLIL::Wire *wire, const std::string &attribute_name)
+{
if (wire->has_attribute(RTLIL::escape_id(attribute_name))) {
- return wire->get_bool_attribute(RTLIL::escape_id(attribute_name));
+ return wire->get_bool_attribute(RTLIL::escape_id(attribute_name));
}
return false;
}
-const std::map<std::string, RTLIL::Wire*> Clocks::GetClocks(
- RTLIL::Design* design) {
- std::map<std::string, RTLIL::Wire*> clock_wires;
- RTLIL::Module* top_module = design->top_module();
- for (auto& wire_obj : top_module->wires_) {
- auto& wire = wire_obj.second;
- if (wire->has_attribute(RTLIL::escape_id("CLOCK_SIGNAL"))) {
- if (wire->get_string_attribute(RTLIL::escape_id("CLOCK_SIGNAL")) ==
- "yes") {
- clock_wires.insert(std::make_pair(Clock::WireName(wire), wire));
- }
- }
+const std::map<std::string, RTLIL::Wire *> Clocks::GetClocks(RTLIL::Design *design)
+{
+ std::map<std::string, RTLIL::Wire *> clock_wires;
+ RTLIL::Module *top_module = design->top_module();
+ for (auto &wire_obj : top_module->wires_) {
+ auto &wire = wire_obj.second;
+ if (wire->has_attribute(RTLIL::escape_id("CLOCK_SIGNAL"))) {
+ if (wire->get_string_attribute(RTLIL::escape_id("CLOCK_SIGNAL")) == "yes") {
+ clock_wires.insert(std::make_pair(Clock::WireName(wire), wire));
+ }
+ }
}
return clock_wires;
}
-
diff --git a/sdc-plugin/clocks.h b/sdc-plugin/clocks.h
index f15858b..b11d1c0 100644
--- a/sdc-plugin/clocks.h
+++ b/sdc-plugin/clocks.h
@@ -18,10 +18,10 @@
#ifndef _CLOCKS_H_
#define _CLOCKS_H_
-#include <map>
-#include <vector>
#include "buffers.h"
#include "kernel/rtlil.h"
+#include <map>
+#include <vector>
USING_YOSYS_NAMESPACE
@@ -30,49 +30,40 @@
class ClockDividerPropagation;
class Propagation;
-class Clock {
- public:
+class Clock
+{
+ public:
// We distinguish the following types of clock:
// * EXPLICIT - added with create_clocks command
// * GENERATED - propagated from explicit clocks changing the clock's parameters
// * PROPAGATED - propagated from explicit clocks but with the same parameters as the driver
enum ClockType { EXPLICIT, GENERATED, PROPAGATED };
- static void Add(const std::string& name, RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge, ClockType type);
- static void Add(const std::string& name, std::vector<RTLIL::Wire*> wires,
- float period, float rising_edge, float falling_edge, ClockType type);
- static void Add(RTLIL::Wire* wire, float period, float rising_edge,
- float falling_edge, ClockType type);
- static float Period(RTLIL::Wire* clock_wire);
- static float RisingEdge(RTLIL::Wire* clock_wire);
- static float FallingEdge(RTLIL::Wire* clock_wire);
- static std::string Name(RTLIL::Wire* clock_wire);
- static std::string WireName(RTLIL::Wire* wire);
- static std::string AddEscaping(const std::string& name) {
- return std::regex_replace(name, std::regex{"\\$"}, "\\$");
- }
- static std::string SourceWireName(RTLIL::Wire* clock_wire);
- static bool IsPropagated(RTLIL::Wire* wire) {
- return GetClockWireBoolAttribute(wire, "IS_PROPAGATED");
- }
+ static void Add(const std::string &name, RTLIL::Wire *wire, float period, float rising_edge, float falling_edge, ClockType type);
+ static void Add(const std::string &name, std::vector<RTLIL::Wire *> wires, float period, float rising_edge, float falling_edge, ClockType type);
+ static void Add(RTLIL::Wire *wire, float period, float rising_edge, float falling_edge, ClockType type);
+ static float Period(RTLIL::Wire *clock_wire);
+ static float RisingEdge(RTLIL::Wire *clock_wire);
+ static float FallingEdge(RTLIL::Wire *clock_wire);
+ static std::string Name(RTLIL::Wire *clock_wire);
+ static std::string WireName(RTLIL::Wire *wire);
+ static std::string AddEscaping(const std::string &name) { return std::regex_replace(name, std::regex{"\\$"}, "\\$"); }
+ static std::string SourceWireName(RTLIL::Wire *clock_wire);
+ static bool IsPropagated(RTLIL::Wire *wire) { return GetClockWireBoolAttribute(wire, "IS_PROPAGATED"); }
- static bool IsGenerated(RTLIL::Wire* wire) {
- return GetClockWireBoolAttribute(wire, "IS_GENERATED");
- }
+ static bool IsGenerated(RTLIL::Wire *wire) { return GetClockWireBoolAttribute(wire, "IS_GENERATED"); }
- static bool IsExplicit(RTLIL::Wire* wire) {
- return GetClockWireBoolAttribute(wire, "IS_EXPLICIT");
- }
+ static bool IsExplicit(RTLIL::Wire *wire) { return GetClockWireBoolAttribute(wire, "IS_EXPLICIT"); }
- private:
- static std::pair<float, float> Waveform(RTLIL::Wire* clock_wire);
+ private:
+ static std::pair<float, float> Waveform(RTLIL::Wire *clock_wire);
- static bool GetClockWireBoolAttribute(RTLIL::Wire* wire, const std::string& attribute_name);
+ static bool GetClockWireBoolAttribute(RTLIL::Wire *wire, const std::string &attribute_name);
};
-class Clocks {
- public:
- static const std::map<std::string, RTLIL::Wire*> GetClocks(RTLIL::Design* design);
+class Clocks
+{
+ public:
+ static const std::map<std::string, RTLIL::Wire *> GetClocks(RTLIL::Design *design);
};
-#endif // _CLOCKS_H_
+#endif // _CLOCKS_H_
diff --git a/sdc-plugin/propagation.cc b/sdc-plugin/propagation.cc
index 460efbf..cfee89a 100644
--- a/sdc-plugin/propagation.cc
+++ b/sdc-plugin/propagation.cc
@@ -20,180 +20,156 @@
USING_YOSYS_NAMESPACE
-void Propagation::PropagateThroughBuffers(Buffer buffer) {
- for (auto& clock : Clocks::GetClocks(design_)) {
- auto& clock_wire = clock.second;
+void Propagation::PropagateThroughBuffers(Buffer buffer)
+{
+ for (auto &clock : Clocks::GetClocks(design_)) {
+ auto &clock_wire = clock.second;
#ifdef SDC_DEBUG
- log("Clock wire %s\n", Clock::WireName(clock_wire).c_str());
+ log("Clock wire %s\n", Clock::WireName(clock_wire).c_str());
#endif
- auto buf_wires =
- FindSinkWiresForCellType(clock_wire, buffer.type, buffer.output);
- int path_delay(0);
- for (auto wire : buf_wires) {
+ auto buf_wires = FindSinkWiresForCellType(clock_wire, buffer.type, buffer.output);
+ int path_delay(0);
+ for (auto wire : buf_wires) {
#ifdef SDC_DEBUG
- log("%s wire: %s\n", buffer.type.c_str(),
- RTLIL::id2cstr(wire->name));
+ log("%s wire: %s\n", buffer.type.c_str(), RTLIL::id2cstr(wire->name));
#endif
- path_delay += buffer.delay;
- Clock::Add(wire, Clock::Period(clock_wire),
- Clock::RisingEdge(clock_wire) + path_delay,
- Clock::FallingEdge(clock_wire) + path_delay, Clock::PROPAGATED);
- }
+ path_delay += buffer.delay;
+ Clock::Add(wire, Clock::Period(clock_wire), Clock::RisingEdge(clock_wire) + path_delay, Clock::FallingEdge(clock_wire) + path_delay,
+ Clock::PROPAGATED);
+ }
}
}
-std::vector<RTLIL::Wire*> Propagation::FindSinkWiresForCellType(
- RTLIL::Wire* driver_wire, const std::string& cell_type,
- const std::string& cell_port) {
- std::vector<RTLIL::Wire*> wires;
+std::vector<RTLIL::Wire *> Propagation::FindSinkWiresForCellType(RTLIL::Wire *driver_wire, const std::string &cell_type, const std::string &cell_port)
+{
+ std::vector<RTLIL::Wire *> wires;
if (!driver_wire) {
- return wires;
+ return wires;
}
auto cell = FindSinkCellOfType(driver_wire, cell_type);
- RTLIL::Wire* wire = FindSinkWireOnPort(cell, cell_port);
+ RTLIL::Wire *wire = FindSinkWireOnPort(cell, cell_port);
if (wire) {
- wires.push_back(wire);
- auto further_wires =
- FindSinkWiresForCellType(wire, cell_type, cell_port);
- std::copy(further_wires.begin(), further_wires.end(),
- std::back_inserter(wires));
+ wires.push_back(wire);
+ auto further_wires = FindSinkWiresForCellType(wire, cell_type, cell_port);
+ std::copy(further_wires.begin(), further_wires.end(), std::back_inserter(wires));
}
return wires;
}
-RTLIL::Cell* Propagation::FindSinkCellOfType(RTLIL::Wire* wire,
- const std::string& type) {
- RTLIL::Cell* sink_cell = NULL;
+RTLIL::Cell *Propagation::FindSinkCellOfType(RTLIL::Wire *wire, const std::string &type)
+{
+ RTLIL::Cell *sink_cell = NULL;
if (!wire) {
- return sink_cell;
+ return sink_cell;
}
- RTLIL::Module* top_module = design_->top_module();
+ RTLIL::Module *top_module = design_->top_module();
assert(top_module);
- std::string base_selection =
- top_module->name.str() + "/w:" + wire->name.str();
- pass_->extra_args(std::vector<std::string>{base_selection, "%co:+" + type,
- base_selection, "%d"},
- 0, design_);
+ std::string base_selection = top_module->name.str() + "/w:" + wire->name.str();
+ pass_->extra_args(std::vector<std::string>{base_selection, "%co:+" + type, base_selection, "%d"}, 0, design_);
auto selected_cells = top_module->selected_cells();
// FIXME Handle more than one sink
assert(selected_cells.size() <= 1);
if (selected_cells.size() > 0) {
- sink_cell = selected_cells.at(0);
+ sink_cell = selected_cells.at(0);
#ifdef SDC_DEBUG
- log("Found sink cell: %s\n",
- RTLIL::unescape_id(sink_cell->name).c_str());
+ log("Found sink cell: %s\n", RTLIL::unescape_id(sink_cell->name).c_str());
#endif
}
return sink_cell;
}
-RTLIL::Cell* Propagation::FindSinkCellOnPort(RTLIL::Wire* wire,
- const std::string& port) {
- RTLIL::Cell* sink_cell = NULL;
+RTLIL::Cell *Propagation::FindSinkCellOnPort(RTLIL::Wire *wire, const std::string &port)
+{
+ RTLIL::Cell *sink_cell = NULL;
if (!wire) {
- return sink_cell;
+ return sink_cell;
}
- RTLIL::Module* top_module = design_->top_module();
+ RTLIL::Module *top_module = design_->top_module();
assert(top_module);
- std::string base_selection =
- top_module->name.str() + "/w:" + wire->name.str();
- pass_->extra_args(
- std::vector<std::string>{base_selection, "%co:+[" + port + "]",
- base_selection, "%d"},
- 0, design_);
+ std::string base_selection = top_module->name.str() + "/w:" + wire->name.str();
+ pass_->extra_args(std::vector<std::string>{base_selection, "%co:+[" + port + "]", base_selection, "%d"}, 0, design_);
auto selected_cells = top_module->selected_cells();
// FIXME Handle more than one sink
assert(selected_cells.size() <= 1);
if (selected_cells.size() > 0) {
- sink_cell = selected_cells.at(0);
+ sink_cell = selected_cells.at(0);
#ifdef SDC_DEBUG
- log("Found sink cell: %s\n",
- RTLIL::unescape_id(sink_cell->name).c_str());
+ log("Found sink cell: %s\n", RTLIL::unescape_id(sink_cell->name).c_str());
#endif
}
return sink_cell;
}
-bool Propagation::WireHasSinkCell(RTLIL::Wire* wire) {
+bool Propagation::WireHasSinkCell(RTLIL::Wire *wire)
+{
if (!wire) {
- return false;
+ return false;
}
- RTLIL::Module* top_module = design_->top_module();
+ RTLIL::Module *top_module = design_->top_module();
assert(top_module);
- std::string base_selection =
- top_module->name.str() + "/w:" + wire->name.str();
- pass_->extra_args(
- std::vector<std::string>{base_selection, "%co:*",
- base_selection, "%d"},
- 0, design_);
+ std::string base_selection = top_module->name.str() + "/w:" + wire->name.str();
+ pass_->extra_args(std::vector<std::string>{base_selection, "%co:*", base_selection, "%d"}, 0, design_);
auto selected_cells = top_module->selected_cells();
return selected_cells.size() > 0;
}
-RTLIL::Wire* Propagation::FindSinkWireOnPort(RTLIL::Cell* cell,
- const std::string& port_name) {
- RTLIL::Wire* sink_wire = NULL;
+RTLIL::Wire *Propagation::FindSinkWireOnPort(RTLIL::Cell *cell, const std::string &port_name)
+{
+ RTLIL::Wire *sink_wire = NULL;
if (!cell) {
- return sink_wire;
+ return sink_wire;
}
- RTLIL::Module* top_module = design_->top_module();
+ RTLIL::Module *top_module = design_->top_module();
assert(top_module);
- std::string base_selection =
- top_module->name.str() + "/c:" + cell->name.str();
- pass_->extra_args(
- std::vector<std::string>{base_selection, "%co:+[" + port_name + "]",
- base_selection, "%d"},
- 0, design_);
+ std::string base_selection = top_module->name.str() + "/c:" + cell->name.str();
+ pass_->extra_args(std::vector<std::string>{base_selection, "%co:+[" + port_name + "]", base_selection, "%d"}, 0, design_);
auto selected_wires = top_module->selected_wires();
// FIXME Handle more than one sink
assert(selected_wires.size() <= 1);
if (selected_wires.size() > 0) {
- sink_wire = selected_wires.at(0);
+ sink_wire = selected_wires.at(0);
#ifdef SDC_DEBUG
- log("Found sink wire: %s\n",
- RTLIL::unescape_id(sink_wire->name).c_str());
+ log("Found sink wire: %s\n", RTLIL::unescape_id(sink_wire->name).c_str());
#endif
}
return sink_wire;
}
-void NaturalPropagation::Run() {
+void NaturalPropagation::Run()
+{
#ifdef SDC_DEBUG
log("Start natural clock propagation\n");
#endif
- for (auto& clock : Clocks::GetClocks(design_)) {
- auto& clock_wire = clock.second;
+ for (auto &clock : Clocks::GetClocks(design_)) {
+ auto &clock_wire = clock.second;
#ifdef SDC_DEBUG
- log("Processing clock %s\n", RTLIL::id2cstr(clock_wire->name));
+ log("Processing clock %s\n", RTLIL::id2cstr(clock_wire->name));
#endif
- auto aliases = FindAliasWires(clock_wire);
- Clock::Add(Clock::WireName(clock_wire), aliases,
- Clock::Period(clock_wire), Clock::RisingEdge(clock_wire),
- Clock::FallingEdge(clock_wire), Clock::PROPAGATED);
+ auto aliases = FindAliasWires(clock_wire);
+ Clock::Add(Clock::WireName(clock_wire), aliases, Clock::Period(clock_wire), Clock::RisingEdge(clock_wire), Clock::FallingEdge(clock_wire),
+ Clock::PROPAGATED);
}
#ifdef SDC_DEBUG
log("Finish natural clock propagation\n\n");
#endif
}
-std::vector<RTLIL::Wire*> NaturalPropagation::FindAliasWires(
- RTLIL::Wire* wire) {
- RTLIL::Module* top_module = design_->top_module();
+std::vector<RTLIL::Wire *> NaturalPropagation::FindAliasWires(RTLIL::Wire *wire)
+{
+ RTLIL::Module *top_module = design_->top_module();
assert(top_module);
- std::vector<RTLIL::Wire*> alias_wires;
- pass_->extra_args(
- std::vector<std::string>{
- top_module->name.str() + "/w:" + wire->name.str(), "%a"},
- 0, design_);
+ std::vector<RTLIL::Wire *> alias_wires;
+ pass_->extra_args(std::vector<std::string>{top_module->name.str() + "/w:" + wire->name.str(), "%a"}, 0, design_);
for (auto module : design_->selected_modules()) {
- for (auto wire : module->selected_wires()) {
- alias_wires.push_back(wire);
- }
+ for (auto wire : module->selected_wires()) {
+ alias_wires.push_back(wire);
+ }
}
return alias_wires;
}
-void BufferPropagation::Run() {
+void BufferPropagation::Run()
+{
#ifdef SDC_DEBUG
log("Start buffer clock propagation\n");
log("IBUF pass\n");
@@ -208,7 +184,8 @@
#endif
}
-void ClockDividerPropagation::Run() {
+void ClockDividerPropagation::Run()
+{
#ifdef SDC_DEBUG
log("Start clock divider clock propagation\n");
#endif
@@ -219,45 +196,42 @@
#endif
}
-void ClockDividerPropagation::PropagateThroughClockDividers(
- ClockDivider divider) {
- for (auto& clock : Clocks::GetClocks(design_)) {
- auto& clock_wire = clock.second;
+void ClockDividerPropagation::PropagateThroughClockDividers(ClockDivider divider)
+{
+ for (auto &clock : Clocks::GetClocks(design_)) {
+ auto &clock_wire = clock.second;
#ifdef SDC_DEBUG
- log("Processing clock %s\n", Clock::WireName(clock_wire).c_str());
+ log("Processing clock %s\n", Clock::WireName(clock_wire).c_str());
#endif
- PropagateClocksForCellType(clock_wire, divider.type);
+ PropagateClocksForCellType(clock_wire, divider.type);
}
}
-void ClockDividerPropagation::PropagateClocksForCellType(
- RTLIL::Wire* driver_wire, const std::string& cell_type) {
+void ClockDividerPropagation::PropagateClocksForCellType(RTLIL::Wire *driver_wire, const std::string &cell_type)
+{
if (cell_type == "PLLE2_ADV") {
- RTLIL::Cell* cell = NULL;
- for (auto input : Pll::inputs) {
- cell = FindSinkCellOnPort(driver_wire, input);
- if (cell and RTLIL::unescape_id(cell->type) == cell_type) {
- break;
- }
- }
- if (!cell) {
- return;
- }
- Pll pll(cell, Clock::Period(driver_wire),
- Clock::RisingEdge(driver_wire));
- for (auto output : Pll::outputs) {
- RTLIL::Wire* wire = FindSinkWireOnPort(cell, output);
- // Don't add clocks on dangling wires
- // TODO Remove the workaround with the WireHasSinkCell check once the following issue is fixed:
- // https://github.com/SymbiFlow/yosys-symbiflow-plugins/issues/59
- if (wire && WireHasSinkCell(wire)) {
- float clkout_period(pll.clkout_period.at(output));
- float clkout_rising_edge(pll.clkout_rising_edge.at(output));
- float clkout_falling_edge(pll.clkout_falling_edge.at(output));
- Clock::Add(wire, clkout_period, clkout_rising_edge,
- clkout_falling_edge, Clock::GENERATED);
- }
- }
+ RTLIL::Cell *cell = NULL;
+ for (auto input : Pll::inputs) {
+ cell = FindSinkCellOnPort(driver_wire, input);
+ if (cell and RTLIL::unescape_id(cell->type) == cell_type) {
+ break;
+ }
+ }
+ if (!cell) {
+ return;
+ }
+ Pll pll(cell, Clock::Period(driver_wire), Clock::RisingEdge(driver_wire));
+ for (auto output : Pll::outputs) {
+ RTLIL::Wire *wire = FindSinkWireOnPort(cell, output);
+ // Don't add clocks on dangling wires
+ // TODO Remove the workaround with the WireHasSinkCell check once the following issue is fixed:
+ // https://github.com/SymbiFlow/yosys-symbiflow-plugins/issues/59
+ if (wire && WireHasSinkCell(wire)) {
+ float clkout_period(pll.clkout_period.at(output));
+ float clkout_rising_edge(pll.clkout_rising_edge.at(output));
+ float clkout_falling_edge(pll.clkout_falling_edge.at(output));
+ Clock::Add(wire, clkout_period, clkout_rising_edge, clkout_falling_edge, Clock::GENERATED);
+ }
+ }
}
}
-
diff --git a/sdc-plugin/propagation.h b/sdc-plugin/propagation.h
index 3efd984..6b0f755 100644
--- a/sdc-plugin/propagation.h
+++ b/sdc-plugin/propagation.h
@@ -22,56 +22,52 @@
USING_YOSYS_NAMESPACE
-class Propagation {
- public:
- Propagation(RTLIL::Design* design, Pass* pass)
- : design_(design), pass_(pass) {}
+class Propagation
+{
+ public:
+ Propagation(RTLIL::Design *design, Pass *pass) : design_(design), pass_(pass) {}
virtual ~Propagation() {}
virtual void Run() = 0;
- protected:
- RTLIL::Design* design_;
- Pass* pass_;
+ protected:
+ RTLIL::Design *design_;
+ Pass *pass_;
// This propagation doesn't change the clock so the sink wire is only marked
// as propagated clock signal, but has the properties of the driving clock
void PropagateThroughBuffers(Buffer buffer);
- std::vector<RTLIL::Wire*> FindSinkWiresForCellType(
- RTLIL::Wire* driver_wire, const std::string& cell_type,
- const std::string& cell_port);
- RTLIL::Cell* FindSinkCellOfType(RTLIL::Wire* wire, const std::string& type);
- RTLIL::Cell* FindSinkCellOnPort(RTLIL::Wire* wire, const std::string& port);
- RTLIL::Wire* FindSinkWireOnPort(RTLIL::Cell* cell,
- const std::string& port_name);
- bool WireHasSinkCell(RTLIL::Wire* wire);
+ std::vector<RTLIL::Wire *> FindSinkWiresForCellType(RTLIL::Wire *driver_wire, const std::string &cell_type, const std::string &cell_port);
+ RTLIL::Cell *FindSinkCellOfType(RTLIL::Wire *wire, const std::string &type);
+ RTLIL::Cell *FindSinkCellOnPort(RTLIL::Wire *wire, const std::string &port);
+ RTLIL::Wire *FindSinkWireOnPort(RTLIL::Cell *cell, const std::string &port_name);
+ bool WireHasSinkCell(RTLIL::Wire *wire);
};
-class NaturalPropagation : public Propagation {
- public:
- NaturalPropagation(RTLIL::Design* design, Pass* pass)
- : Propagation(design, pass) {}
+class NaturalPropagation : public Propagation
+{
+ public:
+ NaturalPropagation(RTLIL::Design *design, Pass *pass) : Propagation(design, pass) {}
void Run() override;
- std::vector<RTLIL::Wire*> FindAliasWires(RTLIL::Wire* wire);
+ std::vector<RTLIL::Wire *> FindAliasWires(RTLIL::Wire *wire);
};
-class BufferPropagation : public Propagation {
- public:
- BufferPropagation(RTLIL::Design* design, Pass* pass)
- : Propagation(design, pass) {}
+class BufferPropagation : public Propagation
+{
+ public:
+ BufferPropagation(RTLIL::Design *design, Pass *pass) : Propagation(design, pass) {}
void Run() override;
};
-class ClockDividerPropagation : public Propagation {
- public:
- ClockDividerPropagation(RTLIL::Design* design, Pass* pass)
- : Propagation(design, pass) {}
+class ClockDividerPropagation : public Propagation
+{
+ public:
+ ClockDividerPropagation(RTLIL::Design *design, Pass *pass) : Propagation(design, pass) {}
void Run() override;
- void PropagateClocksForCellType(RTLIL::Wire* driver_wire,
- const std::string& cell_type);
+ void PropagateClocksForCellType(RTLIL::Wire *driver_wire, const std::string &cell_type);
void PropagateThroughClockDividers(ClockDivider divider);
};
-#endif // PROPAGATION_H_
+#endif // PROPAGATION_H_
diff --git a/sdc-plugin/sdc.cc b/sdc-plugin/sdc.cc
index 6ddaf01..dd058d9 100644
--- a/sdc-plugin/sdc.cc
+++ b/sdc-plugin/sdc.cc
@@ -35,300 +35,290 @@
struct ReadSdcCmd : public Frontend {
ReadSdcCmd() : Frontend("sdc", "Read SDC file") {}
- void help() override {
- log("\n");
- log(" read_sdc <filename>\n");
- log("\n");
- log("Read SDC file.\n");
- log("\n");
+ void help() override
+ {
+ log("\n");
+ log(" read_sdc <filename>\n");
+ log("\n");
+ log("Read SDC file.\n");
+ log("\n");
}
- void execute(std::istream*& f, std::string filename,
- std::vector<std::string> args, RTLIL::Design*) override {
- if (args.size() < 2) {
- log_cmd_error("Missing script file.\n");
- }
- log("\nReading clock constraints file(SDC)\n\n");
- size_t argidx = 1;
- extra_args(f, filename, args, argidx);
- std::string content{std::istreambuf_iterator<char>(*f),
- std::istreambuf_iterator<char>()};
- log("%s\n", content.c_str());
- Tcl_Interp* interp = yosys_get_tcl_interp();
- if (Tcl_EvalFile(interp, args[argidx].c_str()) != TCL_OK) {
- log_cmd_error("TCL interpreter returned an error: %s\n",
- Tcl_GetStringResult(interp));
- }
+ void execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *) override
+ {
+ if (args.size() < 2) {
+ log_cmd_error("Missing script file.\n");
+ }
+ log("\nReading clock constraints file(SDC)\n\n");
+ size_t argidx = 1;
+ extra_args(f, filename, args, argidx);
+ std::string content{std::istreambuf_iterator<char>(*f), std::istreambuf_iterator<char>()};
+ log("%s\n", content.c_str());
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ if (Tcl_EvalFile(interp, args[argidx].c_str()) != TCL_OK) {
+ log_cmd_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(interp));
+ }
}
};
struct WriteSdcCmd : public Backend {
- WriteSdcCmd(SdcWriter& sdc_writer)
- : Backend("sdc", "Write SDC file"), sdc_writer_(sdc_writer) {}
+ WriteSdcCmd(SdcWriter &sdc_writer) : Backend("sdc", "Write SDC file"), sdc_writer_(sdc_writer) {}
- void help() override {
- log("\n");
- log(" write_sdc <filename>\n");
- log("\n");
- log("Write SDC file.\n");
- log("\n");
+ void help() override
+ {
+ log("\n");
+ log(" write_sdc <filename>\n");
+ log("\n");
+ log("Write SDC file.\n");
+ log("\n");
}
- void execute(std::ostream*& f, std::string filename,
- std::vector<std::string> args,
- RTLIL::Design* design) override {
- if (args.size() < 2) {
- log_cmd_error("Missing output file.\n");
- }
- log("\nWriting out clock constraints file(SDC)\n");
- extra_args(f, filename, args, 1);
- sdc_writer_.WriteSdc(design, *f);
+ void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ if (args.size() < 2) {
+ log_cmd_error("Missing output file.\n");
+ }
+ log("\nWriting out clock constraints file(SDC)\n");
+ extra_args(f, filename, args, 1);
+ sdc_writer_.WriteSdc(design, *f);
}
- SdcWriter& sdc_writer_;
+ SdcWriter &sdc_writer_;
};
struct CreateClockCmd : public Pass {
CreateClockCmd() : Pass("create_clock", "Create clock object") {}
- void help() override {
- log("\n");
- log(" create_clock [ -name clock_name ] -period period_value "
- "[-waveform <edge_list>] <target>\n");
- log("Define a clock.\n");
- log("If name is not specified then the name of the first target is "
- "selected as the clock's name.\n");
- log("Period is expressed in nanoseconds.\n");
- log("The waveform option specifies the duty cycle (the rising a "
- "falling edges) of the clock.\n");
- log("It is specified as a list of two elements/time values: the first "
- "rising edge and the next falling edge.\n");
- log("\n");
+ void help() override
+ {
+ log("\n");
+ log(" create_clock [ -name clock_name ] -period period_value "
+ "[-waveform <edge_list>] <target>\n");
+ log("Define a clock.\n");
+ log("If name is not specified then the name of the first target is "
+ "selected as the clock's name.\n");
+ log("Period is expressed in nanoseconds.\n");
+ log("The waveform option specifies the duty cycle (the rising a "
+ "falling edges) of the clock.\n");
+ log("It is specified as a list of two elements/time values: the first "
+ "rising edge and the next falling edge.\n");
+ log("\n");
}
- void execute(std::vector<std::string> args,
- RTLIL::Design* design) override {
- size_t argidx;
- std::string name;
- bool is_waveform_specified(false);
- float rising_edge(0);
- float falling_edge(0);
- float period(0);
- if (args.size() < 4) {
- log_cmd_error("Incorrect number of arguments\n");
- }
- for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-name" && argidx + 1 < args.size()) {
- name = args[++argidx];
- continue;
- }
- if (arg == "-period" && argidx + 1 < args.size()) {
- period = std::stof(args[++argidx]);
- continue;
- }
- if (arg == "-waveform" && argidx + 1 < args.size()) {
- std::string edges(args[++argidx]);
- std::copy_if(edges.begin(), edges.end(), edges.begin(),
- [](char c) { return c != '{' or c != '}'; });
- std::stringstream ss(edges);
- ss >> rising_edge >> falling_edge;
- is_waveform_specified = true;
- continue;
- }
- break;
- }
- if (period <= 0) {
- log_cmd_error("Incorrect period value\n");
- }
- // Add "w:" prefix to selection arguments to enforce wire object
- // selection
- AddWirePrefix(args, argidx);
- extra_args(args, argidx, design);
- // If clock name is not specified then take the name of the first target
- std::vector<RTLIL::Wire*> selected_wires;
- for (auto module : design->modules()) {
- if (!design->selected(module)) {
- continue;
- }
- for (auto wire : module->wires()) {
- if (design->selected(module, wire)) {
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ size_t argidx;
+ std::string name;
+ bool is_waveform_specified(false);
+ float rising_edge(0);
+ float falling_edge(0);
+ float period(0);
+ if (args.size() < 4) {
+ log_cmd_error("Incorrect number of arguments\n");
+ }
+ for (argidx = 1; argidx < args.size(); argidx++) {
+ std::string arg = args[argidx];
+ if (arg == "-name" && argidx + 1 < args.size()) {
+ name = args[++argidx];
+ continue;
+ }
+ if (arg == "-period" && argidx + 1 < args.size()) {
+ period = std::stof(args[++argidx]);
+ continue;
+ }
+ if (arg == "-waveform" && argidx + 1 < args.size()) {
+ std::string edges(args[++argidx]);
+ std::copy_if(edges.begin(), edges.end(), edges.begin(), [](char c) { return c != '{' or c != '}'; });
+ std::stringstream ss(edges);
+ ss >> rising_edge >> falling_edge;
+ is_waveform_specified = true;
+ continue;
+ }
+ break;
+ }
+ if (period <= 0) {
+ log_cmd_error("Incorrect period value\n");
+ }
+ // Add "w:" prefix to selection arguments to enforce wire object
+ // selection
+ AddWirePrefix(args, argidx);
+ extra_args(args, argidx, design);
+ // If clock name is not specified then take the name of the first target
+ std::vector<RTLIL::Wire *> selected_wires;
+ for (auto module : design->modules()) {
+ if (!design->selected(module)) {
+ continue;
+ }
+ for (auto wire : module->wires()) {
+ if (design->selected(module, wire)) {
#ifdef SDC_DEBUG
- log("Selected wire %s\n",
- RTLIL::unescape_id(wire->name).c_str());
+ log("Selected wire %s\n", RTLIL::unescape_id(wire->name).c_str());
#endif
- selected_wires.push_back(wire);
- }
- }
- }
- if (selected_wires.size() == 0) {
- log_cmd_error("Target selection is empty\n");
- }
- if (name.empty()) {
- name = RTLIL::unescape_id(selected_wires.at(0)->name);
- }
- if (!is_waveform_specified) {
- rising_edge = 0;
- falling_edge = period / 2;
- }
- Clock::Add(name, selected_wires, period, rising_edge, falling_edge, Clock::EXPLICIT);
+ selected_wires.push_back(wire);
+ }
+ }
+ }
+ if (selected_wires.size() == 0) {
+ log_cmd_error("Target selection is empty\n");
+ }
+ if (name.empty()) {
+ name = RTLIL::unescape_id(selected_wires.at(0)->name);
+ }
+ if (!is_waveform_specified) {
+ rising_edge = 0;
+ falling_edge = period / 2;
+ }
+ Clock::Add(name, selected_wires, period, rising_edge, falling_edge, Clock::EXPLICIT);
}
- void AddWirePrefix(std::vector<std::string>& args, size_t argidx) {
- auto selection_begin = args.begin() + argidx;
- std::transform(selection_begin, args.end(), selection_begin,
- [](std::string& w) { return "w:" + w; });
+ void AddWirePrefix(std::vector<std::string> &args, size_t argidx)
+ {
+ auto selection_begin = args.begin() + argidx;
+ std::transform(selection_begin, args.end(), selection_begin, [](std::string &w) { return "w:" + w; });
}
};
struct GetClocksCmd : public Pass {
GetClocksCmd() : Pass("get_clocks", "Create clock object") {}
- void help() override {
- log("\n");
- log(" get_clocks [-include_generated_clocks] [-of <nets>] "
- "[<patterns>]\n");
- log("\n");
- log("Returns all clocks in the design.\n");
- log("\n");
- log(" -include_generated_clocks\n");
- log(" Include auto-generated clocks.\n");
- log("\n");
- log(" -of\n");
- log(" Get clocks of these nets.\n");
- log("\n");
- log(" <pattern>\n");
- log(" Pattern of clock names. Default are all clocks in the "
- "design.\n");
- log("\n");
+ void help() override
+ {
+ log("\n");
+ log(" get_clocks [-include_generated_clocks] [-of <nets>] "
+ "[<patterns>]\n");
+ log("\n");
+ log("Returns all clocks in the design.\n");
+ log("\n");
+ log(" -include_generated_clocks\n");
+ log(" Include auto-generated clocks.\n");
+ log("\n");
+ log(" -of\n");
+ log(" Get clocks of these nets.\n");
+ log("\n");
+ log(" <pattern>\n");
+ log(" Pattern of clock names. Default are all clocks in the "
+ "design.\n");
+ log("\n");
}
- std::vector<std::string> extract_list(const std::string& args) {
- std::vector<std::string> port_list;
- std::stringstream ss(args);
- std::istream_iterator<std::string> begin(ss);
- std::istream_iterator<std::string> end;
- std::copy(begin, end, std::back_inserter(port_list));
- return port_list;
+ std::vector<std::string> extract_list(const std::string &args)
+ {
+ std::vector<std::string> port_list;
+ std::stringstream ss(args);
+ std::istream_iterator<std::string> begin(ss);
+ std::istream_iterator<std::string> end;
+ std::copy(begin, end, std::back_inserter(port_list));
+ return port_list;
}
- void execute(std::vector<std::string> args,
- RTLIL::Design* design) override {
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
- // Parse command arguments
- bool include_generated_clocks(false);
- std::vector<std::string> clocks_nets;
- size_t argidx(0);
+ // Parse command arguments
+ bool include_generated_clocks(false);
+ std::vector<std::string> clocks_nets;
+ size_t argidx(0);
- // Parse command switches
- for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-include_generated_clocks") {
- include_generated_clocks = true;
- continue;
- }
- if (arg == "-of" and argidx + 1 < args.size()) {
- clocks_nets = extract_list(args[++argidx]);
+ // Parse command switches
+ for (argidx = 1; argidx < args.size(); argidx++) {
+ std::string arg = args[argidx];
+ if (arg == "-include_generated_clocks") {
+ include_generated_clocks = true;
+ continue;
+ }
+ if (arg == "-of" and argidx + 1 < args.size()) {
+ clocks_nets = extract_list(args[++argidx]);
#ifdef SDC_DEBUG
- for (auto clock_net : clocks_nets) {
- log("Clock filter %s\n", clock_net.c_str());
- }
+ for (auto clock_net : clocks_nets) {
+ log("Clock filter %s\n", clock_net.c_str());
+ }
#endif
- continue;
- }
- if (arg.size() > 0 and arg[0] == '-') {
- log_cmd_error("Unknown option %s.\n", arg.c_str());
- }
+ continue;
+ }
+ if (arg.size() > 0 and arg[0] == '-') {
+ log_cmd_error("Unknown option %s.\n", arg.c_str());
+ }
- break;
- }
+ break;
+ }
- // Parse object patterns
- std::vector<std::string> clocks_list(args.begin() + argidx, args.end());
+ // Parse object patterns
+ std::vector<std::string> clocks_list(args.begin() + argidx, args.end());
- // Fetch clocks in the design
- std::map<std::string, RTLIL::Wire*> clocks(Clocks::GetClocks(design));
- if (clocks.size() == 0) {
- log_warning("No clocks found in design\n");
- }
+ // Fetch clocks in the design
+ std::map<std::string, RTLIL::Wire *> clocks(Clocks::GetClocks(design));
+ if (clocks.size() == 0) {
+ log_warning("No clocks found in design\n");
+ }
- // Extract clocks into tcl list
- Tcl_Interp* interp = yosys_get_tcl_interp();
- Tcl_Obj* tcl_list = Tcl_NewListObj(0, NULL);
- for (auto& clock : clocks) {
- // Skip propagated clocks (i.e. clock wires with the same parameters
- // as the master clocks they originate from
- if (Clock::IsPropagated(clock.second)) {
- continue;
- }
- // Skip generated clocks if -include_generated_clocks is not specified
- if (Clock::IsGenerated(clock.second) and !include_generated_clocks) {
- continue;
- }
- // Check if clock name is in the list of design clocks
- if (clocks_list.size() > 0 and
- std::find(clocks_list.begin(), clocks_list.end(),
- clock.first) == clocks_list.end()) {
- continue;
- }
- // Check if clock wire is in the -of list
- if (clocks_nets.size() > 0 and
- std::find(clocks_nets.begin(), clocks_nets.end(),
- Clock::WireName(clock.second)) == clocks_nets.end()) {
- continue;
- }
- auto& wire = clock.second;
- const char* name = RTLIL::id2cstr(wire->name);
- Tcl_Obj* name_obj = Tcl_NewStringObj(name, -1);
- Tcl_ListObjAppendElement(interp, tcl_list, name_obj);
- }
- Tcl_SetObjResult(interp, tcl_list);
+ // Extract clocks into tcl list
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ Tcl_Obj *tcl_list = Tcl_NewListObj(0, NULL);
+ for (auto &clock : clocks) {
+ // Skip propagated clocks (i.e. clock wires with the same parameters
+ // as the master clocks they originate from
+ if (Clock::IsPropagated(clock.second)) {
+ continue;
+ }
+ // Skip generated clocks if -include_generated_clocks is not specified
+ if (Clock::IsGenerated(clock.second) and !include_generated_clocks) {
+ continue;
+ }
+ // Check if clock name is in the list of design clocks
+ if (clocks_list.size() > 0 and std::find(clocks_list.begin(), clocks_list.end(), clock.first) == clocks_list.end()) {
+ continue;
+ }
+ // Check if clock wire is in the -of list
+ if (clocks_nets.size() > 0 and std::find(clocks_nets.begin(), clocks_nets.end(), Clock::WireName(clock.second)) == clocks_nets.end()) {
+ continue;
+ }
+ auto &wire = clock.second;
+ const char *name = RTLIL::id2cstr(wire->name);
+ Tcl_Obj *name_obj = Tcl_NewStringObj(name, -1);
+ Tcl_ListObjAppendElement(interp, tcl_list, name_obj);
+ }
+ Tcl_SetObjResult(interp, tcl_list);
}
};
struct PropagateClocksCmd : public Pass {
- PropagateClocksCmd()
- : Pass("propagate_clocks", "Propagate clock information") {}
+ PropagateClocksCmd() : Pass("propagate_clocks", "Propagate clock information") {}
- void help() override {
- log("\n");
- log(" propagate_clocks\n");
- log("\n");
- log("Propagate clock information throughout the design.\n");
- log("\n");
+ void help() override
+ {
+ log("\n");
+ log(" propagate_clocks\n");
+ log("\n");
+ log("Propagate clock information throughout the design.\n");
+ log("\n");
}
- void execute(std::vector<std::string> args,
- RTLIL::Design* design) override {
- if (args.size() > 1) {
- log_warning(
- "Command accepts no arguments.\nAll will be ignored.\n");
- }
- if (!design->top_module()) {
- log_cmd_error("No top module selected\n");
- }
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ if (args.size() > 1) {
+ log_warning("Command accepts no arguments.\nAll will be ignored.\n");
+ }
+ if (!design->top_module()) {
+ log_cmd_error("No top module selected\n");
+ }
- std::array<std::unique_ptr<Propagation>, 2> passes{
- std::unique_ptr<Propagation>(new BufferPropagation(design, this)),
- std::unique_ptr<Propagation>(
- new ClockDividerPropagation(design, this))};
+ std::array<std::unique_ptr<Propagation>, 2> passes{std::unique_ptr<Propagation>(new BufferPropagation(design, this)),
+ std::unique_ptr<Propagation>(new ClockDividerPropagation(design, this))};
- log("Perform clock propagation\n");
+ log("Perform clock propagation\n");
- for (auto& pass : passes) {
- pass->Run();
- }
+ for (auto &pass : passes) {
+ pass->Run();
+ }
}
};
-class SdcPlugin {
- public:
- SdcPlugin()
- : write_sdc_cmd_(sdc_writer_),
- set_false_path_cmd_(sdc_writer_),
- set_max_delay_cmd_(sdc_writer_),
- set_clock_groups_cmd_(sdc_writer_) {
- log("Loaded SDC plugin\n");
+class SdcPlugin
+{
+ public:
+ SdcPlugin() : write_sdc_cmd_(sdc_writer_), set_false_path_cmd_(sdc_writer_), set_max_delay_cmd_(sdc_writer_), set_clock_groups_cmd_(sdc_writer_)
+ {
+ log("Loaded SDC plugin\n");
}
ReadSdcCmd read_sdc_cmd_;
@@ -340,7 +330,7 @@
SetMaxDelay set_max_delay_cmd_;
SetClockGroups set_clock_groups_cmd_;
- private:
+ private:
SdcWriter sdc_writer_;
} SdcPlugin;
diff --git a/sdc-plugin/sdc_writer.cc b/sdc-plugin/sdc_writer.cc
index b73e242..ed283a6 100644
--- a/sdc-plugin/sdc_writer.cc
+++ b/sdc-plugin/sdc_writer.cc
@@ -20,94 +20,92 @@
USING_YOSYS_NAMESPACE
const std::map<ClockGroups::ClockGroupRelation, std::string> ClockGroups::relation_name_map = {
- {NONE, ""},
- {ASYNCHRONOUS, "asynchronous"},
- {PHYSICALLY_EXCLUSIVE, "physically_exclusive"},
- {LOGICALLY_EXCLUSIVE, "logically_exclusive"}};
+ {NONE, ""}, {ASYNCHRONOUS, "asynchronous"}, {PHYSICALLY_EXCLUSIVE, "physically_exclusive"}, {LOGICALLY_EXCLUSIVE, "logically_exclusive"}};
-void SdcWriter::AddFalsePath(FalsePath false_path) {
- false_paths_.push_back(false_path);
-}
+void SdcWriter::AddFalsePath(FalsePath false_path) { false_paths_.push_back(false_path); }
-void SdcWriter::SetMaxDelay(TimingPath timing_path) {
- timing_paths_.push_back(timing_path);
-}
+void SdcWriter::SetMaxDelay(TimingPath timing_path) { timing_paths_.push_back(timing_path); }
-void SdcWriter::AddClockGroup(ClockGroups::ClockGroup clock_group, ClockGroups::ClockGroupRelation relation) {
+void SdcWriter::AddClockGroup(ClockGroups::ClockGroup clock_group, ClockGroups::ClockGroupRelation relation)
+{
clock_groups_.Add(clock_group, relation);
}
-void SdcWriter::WriteSdc(RTLIL::Design* design, std::ostream& file) {
+void SdcWriter::WriteSdc(RTLIL::Design *design, std::ostream &file)
+{
WriteClocks(design, file);
WriteFalsePaths(file);
WriteMaxDelay(file);
WriteClockGroups(file);
}
-void SdcWriter::WriteClocks(RTLIL::Design* design, std::ostream& file) {
- for (auto& clock : Clocks::GetClocks(design)) {
- auto& clock_wire = clock.second;
- // FIXME: Input port nets are not found in VPR
- if (clock_wire->port_input) {
- continue;
- }
- // Write out only GENERATED and EXPLICIT clocks
- if (Clock::IsPropagated(clock_wire)) {
- continue;
- }
- file << "create_clock -period " << Clock::Period(clock_wire);
- file << " -waveform {" << Clock::RisingEdge(clock_wire) << " "
- << Clock::FallingEdge(clock_wire) << "}";
- file << " " << Clock::SourceWireName(clock_wire);
- file << std::endl;
+void SdcWriter::WriteClocks(RTLIL::Design *design, std::ostream &file)
+{
+ for (auto &clock : Clocks::GetClocks(design)) {
+ auto &clock_wire = clock.second;
+ // FIXME: Input port nets are not found in VPR
+ if (clock_wire->port_input) {
+ continue;
+ }
+ // Write out only GENERATED and EXPLICIT clocks
+ if (Clock::IsPropagated(clock_wire)) {
+ continue;
+ }
+ file << "create_clock -period " << Clock::Period(clock_wire);
+ file << " -waveform {" << Clock::RisingEdge(clock_wire) << " " << Clock::FallingEdge(clock_wire) << "}";
+ file << " " << Clock::SourceWireName(clock_wire);
+ file << std::endl;
}
}
-void SdcWriter::WriteFalsePaths(std::ostream& file) {
+void SdcWriter::WriteFalsePaths(std::ostream &file)
+{
for (auto path : false_paths_) {
- file << "set_false_path";
- if (!path.from_pin.empty()) {
- file << " -from " << path.from_pin;
- }
- if (!path.through_pin.empty()) {
- file << " -through " << path.through_pin;
- }
- if (!path.to_pin.empty()) {
- file << " -to " << path.to_pin;
- }
- file << std::endl;
+ file << "set_false_path";
+ if (!path.from_pin.empty()) {
+ file << " -from " << path.from_pin;
+ }
+ if (!path.through_pin.empty()) {
+ file << " -through " << path.through_pin;
+ }
+ if (!path.to_pin.empty()) {
+ file << " -to " << path.to_pin;
+ }
+ file << std::endl;
}
}
-void SdcWriter::WriteMaxDelay(std::ostream& file) {
+void SdcWriter::WriteMaxDelay(std::ostream &file)
+{
for (auto path : timing_paths_) {
- file << "set_max_delay " << path.max_delay;
- if (!path.from_pin.empty()) {
- file << " -from " << path.from_pin;
- }
- if (!path.to_pin.empty()) {
- file << " -to " << path.to_pin;
- }
- file << std::endl;
+ file << "set_max_delay " << path.max_delay;
+ if (!path.from_pin.empty()) {
+ file << " -from " << path.from_pin;
+ }
+ if (!path.to_pin.empty()) {
+ file << " -to " << path.to_pin;
+ }
+ file << std::endl;
}
}
-void SdcWriter::WriteClockGroups(std::ostream& file) {
+void SdcWriter::WriteClockGroups(std::ostream &file)
+{
for (size_t relation = 0; relation <= ClockGroups::CLOCK_GROUP_RELATION_SIZE; relation++) {
- auto clock_groups = clock_groups_.GetGroups(static_cast<ClockGroups::ClockGroupRelation>(relation));
- if (clock_groups.size() == 0) {
- continue;
- }
- file << "create_clock_groups ";
- for (auto group : clock_groups) {
- file << "-group ";
- for (auto signal : group) {
- file << signal << " ";
- }
- }
- if (relation != ClockGroups::ClockGroupRelation::NONE) {
- file << "-" + ClockGroups::relation_name_map.at(static_cast<ClockGroups::ClockGroupRelation>(relation));
- }
- file << std::endl;
+ auto clock_groups = clock_groups_.GetGroups(static_cast<ClockGroups::ClockGroupRelation>(relation));
+ if (clock_groups.size() == 0) {
+ continue;
+ }
+ file << "create_clock_groups ";
+ for (auto group : clock_groups) {
+ file << "-group ";
+ for (auto signal : group) {
+ file << signal << " ";
+ }
+ }
+ if (relation != ClockGroups::ClockGroupRelation::NONE) {
+ file << "-" + ClockGroups::relation_name_map.at(static_cast<ClockGroups::ClockGroupRelation>(relation));
+ }
+ file << std::endl;
}
}
diff --git a/sdc-plugin/sdc_writer.h b/sdc-plugin/sdc_writer.h
index 5cdf8a2..ec503a7 100644
--- a/sdc-plugin/sdc_writer.h
+++ b/sdc-plugin/sdc_writer.h
@@ -39,39 +39,37 @@
using ClockGroup = std::vector<std::string>;
static const std::map<ClockGroupRelation, std::string> relation_name_map;
- void Add(ClockGroup& group, ClockGroupRelation relation) {
- groups_[relation].push_back(group);
+ void Add(ClockGroup &group, ClockGroupRelation relation) { groups_[relation].push_back(group); }
+ std::vector<ClockGroup> GetGroups(ClockGroupRelation relation)
+ {
+ if (groups_.count(relation)) {
+ return groups_.at(relation);
+ }
+ return std::vector<ClockGroup>();
}
- std::vector<ClockGroup> GetGroups(ClockGroupRelation relation) {
- if (groups_.count(relation)) {
- return groups_.at(relation);
- }
- return std::vector<ClockGroup>();
- }
- size_t size() {
- return groups_.size();
- }
+ size_t size() { return groups_.size(); }
- private:
- std::map<ClockGroupRelation,std::vector<ClockGroup>> groups_;
+ private:
+ std::map<ClockGroupRelation, std::vector<ClockGroup>> groups_;
};
-class SdcWriter {
- public:
+class SdcWriter
+{
+ public:
void AddFalsePath(FalsePath false_path);
void SetMaxDelay(TimingPath timing_path);
void AddClockGroup(ClockGroups::ClockGroup clock_group, ClockGroups::ClockGroupRelation relation);
- void WriteSdc(RTLIL::Design* design, std::ostream& file);
+ void WriteSdc(RTLIL::Design *design, std::ostream &file);
- private:
- void WriteClocks(RTLIL::Design* design, std::ostream& file);
- void WriteFalsePaths(std::ostream& file);
- void WriteMaxDelay(std::ostream& file);
- void WriteClockGroups(std::ostream& file);
+ private:
+ void WriteClocks(RTLIL::Design *design, std::ostream &file);
+ void WriteFalsePaths(std::ostream &file);
+ void WriteMaxDelay(std::ostream &file);
+ void WriteClockGroups(std::ostream &file);
std::vector<FalsePath> false_paths_;
std::vector<TimingPath> timing_paths_;
ClockGroups clock_groups_;
};
-#endif // _SDC_WRITER_H_
+#endif // _SDC_WRITER_H_
diff --git a/sdc-plugin/set_clock_groups.cc b/sdc-plugin/set_clock_groups.cc
index 301ca96..e02047b 100644
--- a/sdc-plugin/set_clock_groups.cc
+++ b/sdc-plugin/set_clock_groups.cc
@@ -16,12 +16,13 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "set_clock_groups.h"
-#include <regex>
#include "kernel/log.h"
+#include <regex>
USING_YOSYS_NAMESPACE
-void SetClockGroups::help() {
+void SetClockGroups::help()
+{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" set_clock_groups [-quiet] [-group <args>] [-asynchronous] \n");
@@ -42,11 +43,11 @@
log("\n");
}
-void SetClockGroups::execute(std::vector<std::string> args,
- RTLIL::Design* design) {
- RTLIL::Module* top_module = design->top_module();
+void SetClockGroups::execute(std::vector<std::string> args, RTLIL::Design *design)
+{
+ RTLIL::Module *top_module = design->top_module();
if (top_module == nullptr) {
- log_cmd_error("No top module detected\n");
+ log_cmd_error("No top module detected\n");
}
size_t argidx;
@@ -56,61 +57,57 @@
// Parse command arguments
for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-quiet") {
- is_quiet = true;
- continue;
- }
+ std::string arg = args[argidx];
+ if (arg == "-quiet") {
+ is_quiet = true;
+ continue;
+ }
- // Parse clock groups relation: asynchronous, logically_exclusive, physically_exclusive
- auto is_relation_arg =
- [arg](std::pair<ClockGroups::ClockGroupRelation, std::string>
- relation) {
- if (arg.substr(1) == relation.second) {
- return true;
- }
- return false;
- };
- auto relation_map_it =
- std::find_if(ClockGroups::relation_name_map.begin(),
- ClockGroups::relation_name_map.end(), is_relation_arg);
- if (relation_map_it != ClockGroups::relation_name_map.end()) {
- clock_groups_relation = relation_map_it->first;
- continue;
- }
+ // Parse clock groups relation: asynchronous, logically_exclusive, physically_exclusive
+ auto is_relation_arg = [arg](std::pair<ClockGroups::ClockGroupRelation, std::string> relation) {
+ if (arg.substr(1) == relation.second) {
+ return true;
+ }
+ return false;
+ };
+ auto relation_map_it = std::find_if(ClockGroups::relation_name_map.begin(), ClockGroups::relation_name_map.end(), is_relation_arg);
+ if (relation_map_it != ClockGroups::relation_name_map.end()) {
+ clock_groups_relation = relation_map_it->first;
+ continue;
+ }
- if (arg == "-group" and argidx + 1 < args.size()) {
- ClockGroups::ClockGroup clock_group;
- while (argidx + 1 < args.size() and args[argidx+1][0] != '-') {
- clock_group.push_back(args[++argidx]);
- }
- clock_groups.push_back(clock_group);
- continue;
- }
+ if (arg == "-group" and argidx + 1 < args.size()) {
+ ClockGroups::ClockGroup clock_group;
+ while (argidx + 1 < args.size() and args[argidx + 1][0] != '-') {
+ clock_group.push_back(args[++argidx]);
+ }
+ clock_groups.push_back(clock_group);
+ continue;
+ }
- if (arg.size() > 0 and arg[0] == '-') {
- log_cmd_error("Unknown option %s.\n", arg.c_str());
- }
+ if (arg.size() > 0 and arg[0] == '-') {
+ log_cmd_error("Unknown option %s.\n", arg.c_str());
+ }
- break;
+ break;
}
if (clock_groups.size()) {
- if (!is_quiet) {
- std::string msg = ClockGroups::relation_name_map.at(clock_groups_relation);
- msg += (!msg.empty()) ? " " : "";
- log("Adding %sclock group with following clocks:\n", msg.c_str());
- }
- size_t count(0);
- for (auto& group : clock_groups) {
- sdc_writer_.AddClockGroup(group, clock_groups_relation);
- if (!is_quiet) {
- log("%zu: ", count++);
- for (auto clk : group) {
- log("%s ", clk.c_str());
- }
- log("\n");
- }
- }
+ if (!is_quiet) {
+ std::string msg = ClockGroups::relation_name_map.at(clock_groups_relation);
+ msg += (!msg.empty()) ? " " : "";
+ log("Adding %sclock group with following clocks:\n", msg.c_str());
+ }
+ size_t count(0);
+ for (auto &group : clock_groups) {
+ sdc_writer_.AddClockGroup(group, clock_groups_relation);
+ if (!is_quiet) {
+ log("%zu: ", count++);
+ for (auto clk : group) {
+ log("%s ", clk.c_str());
+ }
+ log("\n");
+ }
+ }
}
}
diff --git a/sdc-plugin/set_clock_groups.h b/sdc-plugin/set_clock_groups.h
index 3114578..29062fa 100644
--- a/sdc-plugin/set_clock_groups.h
+++ b/sdc-plugin/set_clock_groups.h
@@ -25,15 +25,13 @@
USING_YOSYS_NAMESPACE
struct SetClockGroups : public Pass {
- SetClockGroups(SdcWriter& sdc_writer)
- : Pass("set_clock_groups", "Set exclusive or asynchronous clock groups"),
- sdc_writer_(sdc_writer) {}
+ SetClockGroups(SdcWriter &sdc_writer) : Pass("set_clock_groups", "Set exclusive or asynchronous clock groups"), sdc_writer_(sdc_writer) {}
void help() override;
- void execute(std::vector<std::string> args, RTLIL::Design* design) override;
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override;
- SdcWriter& sdc_writer_;
+ SdcWriter &sdc_writer_;
};
-#endif //_SET_CLOCK_GROUPS_H_
+#endif //_SET_CLOCK_GROUPS_H_
diff --git a/sdc-plugin/set_false_path.cc b/sdc-plugin/set_false_path.cc
index 18262d0..e5083b4 100644
--- a/sdc-plugin/set_false_path.cc
+++ b/sdc-plugin/set_false_path.cc
@@ -16,13 +16,14 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "set_false_path.h"
-#include <regex>
#include "kernel/log.h"
#include "sdc_writer.h"
+#include <regex>
USING_YOSYS_NAMESPACE
-void SetFalsePath::help() {
+void SetFalsePath::help()
+{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" set_false_path [-quiet] [-from <net_name>] [-to <net_name>] \n");
@@ -46,11 +47,11 @@
log("\n");
}
-void SetFalsePath::execute(std::vector<std::string> args,
- RTLIL::Design* design) {
- RTLIL::Module* top_module = design->top_module();
+void SetFalsePath::execute(std::vector<std::string> args, RTLIL::Design *design)
+{
+ RTLIL::Module *top_module = design->top_module();
if (top_module == nullptr) {
- log_cmd_error("No top module detected\n");
+ log_cmd_error("No top module detected\n");
}
size_t argidx;
@@ -61,39 +62,38 @@
// Parse command arguments
for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-quiet") {
- is_quiet = true;
- continue;
- }
+ std::string arg = args[argidx];
+ if (arg == "-quiet") {
+ is_quiet = true;
+ continue;
+ }
- if (arg == "-from" and argidx + 1 < args.size()) {
- from_pin = args[++argidx];
- continue;
- }
+ if (arg == "-from" and argidx + 1 < args.size()) {
+ from_pin = args[++argidx];
+ continue;
+ }
- if (arg == "-to" and argidx + 1 < args.size()) {
- to_pin = args[++argidx];
- continue;
- }
+ if (arg == "-to" and argidx + 1 < args.size()) {
+ to_pin = args[++argidx];
+ continue;
+ }
- if (arg == "-through" and argidx + 1 < args.size()) {
- through_pin = args[++argidx];
- continue;
- }
+ if (arg == "-through" and argidx + 1 < args.size()) {
+ through_pin = args[++argidx];
+ continue;
+ }
- if (arg.size() > 0 and arg[0] == '-') {
- log_cmd_error("Unknown option %s.\n", arg.c_str());
- }
+ if (arg.size() > 0 and arg[0] == '-') {
+ log_cmd_error("Unknown option %s.\n", arg.c_str());
+ }
- break;
+ break;
}
if (!is_quiet) {
- std::string msg = (from_pin.empty()) ? "" : "-from " + from_pin;
- msg += (through_pin.empty()) ? "" : " -through " + through_pin;
- msg += (to_pin.empty()) ? "" : " -to " + to_pin;
- log("Adding false path %s\n", msg.c_str());
+ std::string msg = (from_pin.empty()) ? "" : "-from " + from_pin;
+ msg += (through_pin.empty()) ? "" : " -through " + through_pin;
+ msg += (to_pin.empty()) ? "" : " -to " + to_pin;
+ log("Adding false path %s\n", msg.c_str());
}
- sdc_writer_.AddFalsePath(FalsePath{
- .from_pin = from_pin, .to_pin = to_pin, .through_pin = through_pin});
+ sdc_writer_.AddFalsePath(FalsePath{.from_pin = from_pin, .to_pin = to_pin, .through_pin = through_pin});
}
diff --git a/sdc-plugin/set_false_path.h b/sdc-plugin/set_false_path.h
index 47bf08a..de36aa4 100644
--- a/sdc-plugin/set_false_path.h
+++ b/sdc-plugin/set_false_path.h
@@ -25,15 +25,13 @@
USING_YOSYS_NAMESPACE
struct SetFalsePath : public Pass {
- SetFalsePath(SdcWriter& sdc_writer)
- : Pass("set_false_path", "Set false path on net"),
- sdc_writer_(sdc_writer) {}
+ SetFalsePath(SdcWriter &sdc_writer) : Pass("set_false_path", "Set false path on net"), sdc_writer_(sdc_writer) {}
void help() override;
- void execute(std::vector<std::string> args, RTLIL::Design* design) override;
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override;
- SdcWriter& sdc_writer_;
+ SdcWriter &sdc_writer_;
};
-#endif //_SET_FALSE_PATH_H_
+#endif //_SET_FALSE_PATH_H_
diff --git a/sdc-plugin/set_max_delay.cc b/sdc-plugin/set_max_delay.cc
index 055e342..c517dec 100644
--- a/sdc-plugin/set_max_delay.cc
+++ b/sdc-plugin/set_max_delay.cc
@@ -21,7 +21,8 @@
USING_YOSYS_NAMESPACE
-void SetMaxDelay::help() {
+void SetMaxDelay::help()
+{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" set_max_delay [-quiet] [-from <arg>] [-to <arg>] \n");
@@ -42,11 +43,11 @@
log("\n");
}
-void SetMaxDelay::execute(std::vector<std::string> args,
- RTLIL::Design* design) {
- RTLIL::Module* top_module = design->top_module();
+void SetMaxDelay::execute(std::vector<std::string> args, RTLIL::Design *design)
+{
+ RTLIL::Module *top_module = design->top_module();
if (top_module == nullptr) {
- log_cmd_error("No top module detected\n");
+ log_cmd_error("No top module detected\n");
}
size_t argidx;
@@ -57,36 +58,35 @@
// Parse command arguments
for (argidx = 1; argidx < args.size(); argidx++) {
- std::string arg = args[argidx];
- if (arg == "-quiet") {
- is_quiet = true;
- continue;
- }
+ std::string arg = args[argidx];
+ if (arg == "-quiet") {
+ is_quiet = true;
+ continue;
+ }
- if (arg == "-from" and argidx + 1 < args.size()) {
- from_pin = args[++argidx];
- log("From: %s\n", from_pin.c_str());
- continue;
- }
+ if (arg == "-from" and argidx + 1 < args.size()) {
+ from_pin = args[++argidx];
+ log("From: %s\n", from_pin.c_str());
+ continue;
+ }
- if (arg == "-to" and argidx + 1 < args.size()) {
- to_pin = args[++argidx];
- log("To: %s\n", to_pin.c_str());
- continue;
- }
+ if (arg == "-to" and argidx + 1 < args.size()) {
+ to_pin = args[++argidx];
+ log("To: %s\n", to_pin.c_str());
+ continue;
+ }
- if (arg.size() > 0 and arg[0] == '-') {
- log_cmd_error("Unknown option %s.\n", arg.c_str());
- }
+ if (arg.size() > 0 and arg[0] == '-') {
+ log_cmd_error("Unknown option %s.\n", arg.c_str());
+ }
- max_delay = std::stof(args[argidx]);
+ max_delay = std::stof(args[argidx]);
}
if (!is_quiet) {
- std::string msg = (from_pin.empty()) ? "" : "-from " + from_pin;
- msg += (to_pin.empty()) ? "" : " -to " + to_pin;
- log("Adding max path delay of %f on path %s\n", max_delay, msg.c_str());
+ std::string msg = (from_pin.empty()) ? "" : "-from " + from_pin;
+ msg += (to_pin.empty()) ? "" : " -to " + to_pin;
+ log("Adding max path delay of %f on path %s\n", max_delay, msg.c_str());
}
- sdc_writer_.SetMaxDelay(TimingPath{
- .from_pin = from_pin, .to_pin = to_pin, .max_delay = max_delay});
+ sdc_writer_.SetMaxDelay(TimingPath{.from_pin = from_pin, .to_pin = to_pin, .max_delay = max_delay});
}
diff --git a/sdc-plugin/set_max_delay.h b/sdc-plugin/set_max_delay.h
index 7272839..2602643 100644
--- a/sdc-plugin/set_max_delay.h
+++ b/sdc-plugin/set_max_delay.h
@@ -25,15 +25,13 @@
USING_YOSYS_NAMESPACE
struct SetMaxDelay : public Pass {
- SetMaxDelay(SdcWriter& sdc_writer)
- : Pass("set_max_delay", "Specify maximum delay for timing paths"),
- sdc_writer_(sdc_writer) {}
+ SetMaxDelay(SdcWriter &sdc_writer) : Pass("set_max_delay", "Specify maximum delay for timing paths"), sdc_writer_(sdc_writer) {}
void help() override;
- void execute(std::vector<std::string> args, RTLIL::Design* design) override;
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override;
- SdcWriter& sdc_writer_;
+ SdcWriter &sdc_writer_;
};
-#endif //_SET_MAX_DELAY_H_
+#endif //_SET_MAX_DELAY_H_
diff --git a/sdc-plugin/tests/escaping/escaping.test.cc b/sdc-plugin/tests/escaping/escaping.test.cc
index e17eef6..a26a849 100644
--- a/sdc-plugin/tests/escaping/escaping.test.cc
+++ b/sdc-plugin/tests/escaping/escaping.test.cc
@@ -2,10 +2,10 @@
#include <gtest/gtest.h>
-TEST(ClockTest, EscapeDollarSign) {
- // convert wire_name to wire_name, i.e. unchanged
- EXPECT_EQ(Clock::AddEscaping("wire_name"), "wire_name");
- // convert $wire_name to \$wire_name
- EXPECT_EQ(Clock::AddEscaping("$wire_name"), "\\$wire_name");
+TEST(ClockTest, EscapeDollarSign)
+{
+ // convert wire_name to wire_name, i.e. unchanged
+ EXPECT_EQ(Clock::AddEscaping("wire_name"), "wire_name");
+ // convert $wire_name to \$wire_name
+ EXPECT_EQ(Clock::AddEscaping("$wire_name"), "\\$wire_name");
}
-
diff --git a/selection-plugin/selection.cc b/selection-plugin/selection.cc
index 6f224ff..30a0222 100644
--- a/selection-plugin/selection.cc
+++ b/selection-plugin/selection.cc
@@ -16,75 +16,75 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include "kernel/log.h"
#include "kernel/register.h"
#include "kernel/rtlil.h"
-#include "kernel/log.h"
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-
struct SelectionToTclList : public Pass {
- SelectionToTclList() : Pass("selection_to_tcl_list", "Extract selection to TCL list") {}
+ SelectionToTclList() : Pass("selection_to_tcl_list", "Extract selection to TCL list") {}
- void help() override
- {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" selection_to_tcl_list selection\n");
- log("\n");
- log("Extract the current selection to a Tcl List with selection object names. \n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" selection_to_tcl_list selection\n");
+ log("\n");
+ log("Extract the current selection to a Tcl List with selection object names. \n");
+ log("\n");
+ }
- void AddObjectNameToTclList(RTLIL::IdString& module, RTLIL::IdString& object, Tcl_Obj* tcl_list) {
- std::string name = RTLIL::unescape_id(module) + "/" + RTLIL::unescape_id(object);
- Tcl_Obj* value_obj = Tcl_NewStringObj(name.c_str(), name.size());
- Tcl_ListObjAppendElement(yosys_get_tcl_interp(), tcl_list, value_obj);
- }
+ void AddObjectNameToTclList(RTLIL::IdString &module, RTLIL::IdString &object, Tcl_Obj *tcl_list)
+ {
+ std::string name = RTLIL::unescape_id(module) + "/" + RTLIL::unescape_id(object);
+ Tcl_Obj *value_obj = Tcl_NewStringObj(name.c_str(), name.size());
+ Tcl_ListObjAppendElement(yosys_get_tcl_interp(), tcl_list, value_obj);
+ }
- void execute(std::vector<std::string> args, RTLIL::Design* design) override
- {
- if (args.size() == 1) {
- log_error("Incorrect number of arguments");
- }
- extra_args(args, 1, design);
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ if (args.size() == 1) {
+ log_error("Incorrect number of arguments");
+ }
+ extra_args(args, 1, design);
- Tcl_Interp *interp = yosys_get_tcl_interp();
- Tcl_Obj* tcl_list = Tcl_NewListObj(0, NULL);
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ Tcl_Obj *tcl_list = Tcl_NewListObj(0, NULL);
- auto& selection = design->selection();
- if (selection.empty()) {
- log_warning("Selection is empty\n");
- }
+ auto &selection = design->selection();
+ if (selection.empty()) {
+ log_warning("Selection is empty\n");
+ }
- for (auto mod : design->modules()) {
- if (selection.selected_module(mod->name)) {
- for (auto wire : mod->wires()) {
- if (selection.selected_member(mod->name, wire->name)) {
- AddObjectNameToTclList(mod->name, wire->name, tcl_list);
- }
- }
- for (auto &it : mod->memories) {
- if (selection.selected_member(mod->name, it.first)) {
- AddObjectNameToTclList(mod->name, it.first, tcl_list);
- }
- }
- for (auto cell : mod->cells()) {
- if (selection.selected_member(mod->name, cell->name)) {
- AddObjectNameToTclList(mod->name, cell->name, tcl_list);
- }
- }
- for (auto &it : mod->processes) {
- if (selection.selected_member(mod->name, it.first)) {
- AddObjectNameToTclList(mod->name, it.first, tcl_list);
- }
- }
- }
+ for (auto mod : design->modules()) {
+ if (selection.selected_module(mod->name)) {
+ for (auto wire : mod->wires()) {
+ if (selection.selected_member(mod->name, wire->name)) {
+ AddObjectNameToTclList(mod->name, wire->name, tcl_list);
+ }
}
- Tcl_SetObjResult(interp, tcl_list);
- }
+ for (auto &it : mod->memories) {
+ if (selection.selected_member(mod->name, it.first)) {
+ AddObjectNameToTclList(mod->name, it.first, tcl_list);
+ }
+ }
+ for (auto cell : mod->cells()) {
+ if (selection.selected_member(mod->name, cell->name)) {
+ AddObjectNameToTclList(mod->name, cell->name, tcl_list);
+ }
+ }
+ for (auto &it : mod->processes) {
+ if (selection.selected_member(mod->name, it.first)) {
+ AddObjectNameToTclList(mod->name, it.first, tcl_list);
+ }
+ }
+ }
+ }
+ Tcl_SetObjResult(interp, tcl_list);
+ }
} SelectionToTclList;
diff --git a/xdc-plugin/xdc.cc b/xdc-plugin/xdc.cc
index a27bdf7..3d792dd 100644
--- a/xdc-plugin/xdc.cc
+++ b/xdc-plugin/xdc.cc
@@ -26,400 +26,392 @@
* Tcl interpreter and processed by the new XDC commands imported to the
* Tcl interpreter.
*/
-#include <cassert>
+#include "../bank_tiles.h"
+#include "kernel/log.h"
#include "kernel/register.h"
#include "kernel/rtlil.h"
-#include "kernel/log.h"
#include "libs/json11/json11.hpp"
-#include "../bank_tiles.h"
+#include <cassert>
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-static bool isInputPort(RTLIL::Wire* wire) {
- return wire->port_input;
-}
-static bool isOutputPort(RTLIL::Wire* wire) {
- return wire->port_output;
-}
+static bool isInputPort(RTLIL::Wire *wire) { return wire->port_input; }
+static bool isOutputPort(RTLIL::Wire *wire) { return wire->port_output; }
enum class SetPropertyOptions { INTERNAL_VREF, IOSTANDARD, SLEW, DRIVE, IN_TERM, IO_LOC_PAIRS };
-const std::unordered_map<std::string, SetPropertyOptions> set_property_options_map = {
- {"INTERNAL_VREF", SetPropertyOptions::INTERNAL_VREF},
- {"IOSTANDARD", SetPropertyOptions::IOSTANDARD},
- {"SLEW", SetPropertyOptions::SLEW},
- {"DRIVE", SetPropertyOptions::DRIVE},
- {"IN_TERM", SetPropertyOptions::IN_TERM},
- {"LOC", SetPropertyOptions::IO_LOC_PAIRS},
- {"PACKAGE_PIN", SetPropertyOptions::IO_LOC_PAIRS}
-};
+const std::unordered_map<std::string, SetPropertyOptions> set_property_options_map = {{"INTERNAL_VREF", SetPropertyOptions::INTERNAL_VREF},
+ {"IOSTANDARD", SetPropertyOptions::IOSTANDARD},
+ {"SLEW", SetPropertyOptions::SLEW},
+ {"DRIVE", SetPropertyOptions::DRIVE},
+ {"IN_TERM", SetPropertyOptions::IN_TERM},
+ {"LOC", SetPropertyOptions::IO_LOC_PAIRS},
+ {"PACKAGE_PIN", SetPropertyOptions::IO_LOC_PAIRS}};
-const std::unordered_map<std::string, std::vector<std::string>> supported_primitive_parameters = {
- {"OBUF", {"IO_LOC_PAIRS", "IOSTANDARD", "DRIVE", "SLEW", "IN_TERM"}},
- {"OBUFDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}},
- {"OBUFTDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}},
- {"IBUF", {"IO_LOC_PAIRS", "IOSTANDARD"}},
- {"IOBUF", {"IO_LOC_PAIRS", "IOSTANDARD", "DRIVE", "SLEW", "IN_TERM"}},
- {"IOBUFDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}}
-};
+const std::unordered_map<std::string, std::vector<std::string>> supported_primitive_parameters = {
+ {"OBUF", {"IO_LOC_PAIRS", "IOSTANDARD", "DRIVE", "SLEW", "IN_TERM"}}, {"OBUFDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}},
+ {"OBUFTDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}}, {"IBUF", {"IO_LOC_PAIRS", "IOSTANDARD"}},
+ {"IOBUF", {"IO_LOC_PAIRS", "IOSTANDARD", "DRIVE", "SLEW", "IN_TERM"}}, {"IOBUFDS", {"IO_LOC_PAIRS", "IOSTANDARD", "SLEW", "IN_TERM"}}};
-void register_in_tcl_interpreter(const std::string& command) {
- Tcl_Interp* interp = yosys_get_tcl_interp();
- std::string tcl_script = stringf("proc %s args { return [yosys %s {*}$args] }", command.c_str(), command.c_str());
- Tcl_Eval(interp, tcl_script.c_str());
+void register_in_tcl_interpreter(const std::string &command)
+{
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ std::string tcl_script = stringf("proc %s args { return [yosys %s {*}$args] }", command.c_str(), command.c_str());
+ Tcl_Eval(interp, tcl_script.c_str());
}
struct GetIOBanks : public Pass {
- GetIOBanks(std::function<const BankTilesMap&()> get_bank_tiles)
- : Pass("get_iobanks", "Set IO Bank number")
- , get_bank_tiles(get_bank_tiles) {
- register_in_tcl_interpreter(pass_name);
- }
+ GetIOBanks(std::function<const BankTilesMap &()> get_bank_tiles) : Pass("get_iobanks", "Set IO Bank number"), get_bank_tiles(get_bank_tiles)
+ {
+ register_in_tcl_interpreter(pass_name);
+ }
- void help() override {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" get_iobanks <bank_number>\n");
- log("\n");
- log("Get IO Bank number\n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" get_iobanks <bank_number>\n");
+ log("\n");
+ log("Get IO Bank number\n");
+ log("\n");
+ }
- void execute(std::vector<std::string> args, RTLIL::Design* ) override {
- if (args.size() < 2) {
- log_cmd_error("%s: Missing bank number.\n", pass_name.c_str());
- }
- auto bank_tiles = get_bank_tiles();
- if (bank_tiles.count(std::atoi(args[1].c_str())) == 0) {
- log_cmd_error("%s:Bank number %s is not present in the target device.\n", args[1].c_str(), pass_name.c_str());
- }
+ void execute(std::vector<std::string> args, RTLIL::Design *) override
+ {
+ if (args.size() < 2) {
+ log_cmd_error("%s: Missing bank number.\n", pass_name.c_str());
+ }
+ auto bank_tiles = get_bank_tiles();
+ if (bank_tiles.count(std::atoi(args[1].c_str())) == 0) {
+ log_cmd_error("%s:Bank number %s is not present in the target device.\n", args[1].c_str(), pass_name.c_str());
+ }
- Tcl_Interp *interp = yosys_get_tcl_interp();
- Tcl_SetResult(interp, const_cast<char*>(args[1].c_str()), NULL);
- log("%s\n", args[1].c_str());
- }
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ Tcl_SetResult(interp, const_cast<char *>(args[1].c_str()), NULL);
+ log("%s\n", args[1].c_str());
+ }
- std::function<const BankTilesMap&()> get_bank_tiles;
+ std::function<const BankTilesMap &()> get_bank_tiles;
};
struct SetProperty : public Pass {
- SetProperty(std::function<const BankTilesMap&()> get_bank_tiles)
- : Pass("set_property", "Set a given property")
- , get_bank_tiles(get_bank_tiles) {
- register_in_tcl_interpreter(pass_name);
- }
+ SetProperty(std::function<const BankTilesMap &()> get_bank_tiles) : Pass("set_property", "Set a given property"), get_bank_tiles(get_bank_tiles)
+ {
+ register_in_tcl_interpreter(pass_name);
+ }
- void help() override {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" set_property PROPERTY VALUE OBJECT\n");
- log("\n");
- log("Set the given property to the specified value on an object\n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" set_property PROPERTY VALUE OBJECT\n");
+ log("\n");
+ log("Set the given property to the specified value on an object\n");
+ log("\n");
+ }
- void execute(std::vector<std::string> args, RTLIL::Design* design) override {
- if (design->top_module() == nullptr) {
- log_cmd_error("No top module detected\n");
- }
+ void execute(std::vector<std::string> args, RTLIL::Design *design) override
+ {
+ if (design->top_module() == nullptr) {
+ log_cmd_error("No top module detected\n");
+ }
- std::string option(args[1]);
- if (set_property_options_map.count(option) == 0) {
- log_warning("set_property: %s option is currently not supported\n", option.c_str());
- return;
- }
+ std::string option(args[1]);
+ if (set_property_options_map.count(option) == 0) {
+ log_warning("set_property: %s option is currently not supported\n", option.c_str());
+ return;
+ }
- switch (set_property_options_map.at(option)) {
- case SetPropertyOptions::INTERNAL_VREF:
- process_vref(std::vector<std::string>(args.begin() + 2, args.end()), design);
- break;
- case SetPropertyOptions::IOSTANDARD:
- case SetPropertyOptions::SLEW:
- case SetPropertyOptions::DRIVE:
- case SetPropertyOptions::IN_TERM:
- process_port_parameter(std::vector<std::string>(args.begin() + 1, args.end()), design);
- break;
- case SetPropertyOptions::IO_LOC_PAIRS: {
- // args "set_property LOC PAD PORT" become "IO_LOC_PAIRS PORT:PAD PORT"
- std::vector<std::string> new_args(args.begin() + 1, args.end());
- new_args.at(0) = "IO_LOC_PAIRS";
- new_args.at(1) = new_args.at(2) + ":" + new_args.at(1);
- process_port_parameter(new_args, design);
- break;
- }
- default:
- assert(false);
- }
- }
+ switch (set_property_options_map.at(option)) {
+ case SetPropertyOptions::INTERNAL_VREF:
+ process_vref(std::vector<std::string>(args.begin() + 2, args.end()), design);
+ break;
+ case SetPropertyOptions::IOSTANDARD:
+ case SetPropertyOptions::SLEW:
+ case SetPropertyOptions::DRIVE:
+ case SetPropertyOptions::IN_TERM:
+ process_port_parameter(std::vector<std::string>(args.begin() + 1, args.end()), design);
+ break;
+ case SetPropertyOptions::IO_LOC_PAIRS: {
+ // args "set_property LOC PAD PORT" become "IO_LOC_PAIRS PORT:PAD PORT"
+ std::vector<std::string> new_args(args.begin() + 1, args.end());
+ new_args.at(0) = "IO_LOC_PAIRS";
+ new_args.at(1) = new_args.at(2) + ":" + new_args.at(1);
+ process_port_parameter(new_args, design);
+ break;
+ }
+ default:
+ assert(false);
+ }
+ }
- void process_vref(std::vector<std::string> args, RTLIL::Design* design) {
- if (args.size() < 2) {
- log_error("set_property INTERNAL_VREF: Incorrect number of arguments.\n");
- }
- int iobank = std::atoi(args[1].c_str());
- auto bank_tiles = get_bank_tiles();
- if (bank_tiles.count(iobank) == 0) {
- log_cmd_error("set_property INTERNAL_VREF: Invalid IO bank.\n");
- }
+ void process_vref(std::vector<std::string> args, RTLIL::Design *design)
+ {
+ if (args.size() < 2) {
+ log_error("set_property INTERNAL_VREF: Incorrect number of arguments.\n");
+ }
+ int iobank = std::atoi(args[1].c_str());
+ auto bank_tiles = get_bank_tiles();
+ if (bank_tiles.count(iobank) == 0) {
+ log_cmd_error("set_property INTERNAL_VREF: Invalid IO bank.\n");
+ }
- int internal_vref = 1000 * std::atof(args[0].c_str());
- if (internal_vref != 600 &&
- internal_vref != 675 &&
- internal_vref != 750 &&
- internal_vref != 900) {
- log("set_property INTERNAL_VREF: Incorrect INTERNAL_VREF value\n");
- return;
- }
+ int internal_vref = 1000 * std::atof(args[0].c_str());
+ if (internal_vref != 600 && internal_vref != 675 && internal_vref != 750 && internal_vref != 900) {
+ log("set_property INTERNAL_VREF: Incorrect INTERNAL_VREF value\n");
+ return;
+ }
- // Create a new BANK module if it hasn't been created so far
- RTLIL::Module* top_module = design->top_module();
- if (!design->has(ID(BANK))) {
- std::string fasm_extra_modules_dir(proc_share_dirname() + "/plugins/fasm_extra_modules");
- Pass::call(design, "read_verilog " + fasm_extra_modules_dir + "/BANK.v");
- }
+ // Create a new BANK module if it hasn't been created so far
+ RTLIL::Module *top_module = design->top_module();
+ if (!design->has(ID(BANK))) {
+ std::string fasm_extra_modules_dir(proc_share_dirname() + "/plugins/fasm_extra_modules");
+ Pass::call(design, "read_verilog " + fasm_extra_modules_dir + "/BANK.v");
+ }
- // Set parameters on a new bank instance or update an existing one
- char bank_cell_name[16];
- snprintf(bank_cell_name, 16, "\\bank_cell_%d", iobank);
- RTLIL::Cell* bank_cell = top_module->cell(RTLIL::IdString(bank_cell_name));
- if (!bank_cell) {
- bank_cell = top_module->addCell(RTLIL::IdString(bank_cell_name), ID(BANK));
- }
- bank_cell->setParam(ID(FASM_EXTRA), RTLIL::Const("INTERNAL_VREF"));
- bank_cell->setParam(ID(NUMBER), RTLIL::Const(iobank));
- bank_cell->setParam(ID(INTERNAL_VREF), RTLIL::Const(internal_vref));
- }
+ // Set parameters on a new bank instance or update an existing one
+ char bank_cell_name[16];
+ snprintf(bank_cell_name, 16, "\\bank_cell_%d", iobank);
+ RTLIL::Cell *bank_cell = top_module->cell(RTLIL::IdString(bank_cell_name));
+ if (!bank_cell) {
+ bank_cell = top_module->addCell(RTLIL::IdString(bank_cell_name), ID(BANK));
+ }
+ bank_cell->setParam(ID(FASM_EXTRA), RTLIL::Const("INTERNAL_VREF"));
+ bank_cell->setParam(ID(NUMBER), RTLIL::Const(iobank));
+ bank_cell->setParam(ID(INTERNAL_VREF), RTLIL::Const(internal_vref));
+ }
- void process_port_parameter(std::vector<std::string> args, RTLIL::Design* design) {
- if (args.size() < 1) {
- log_error("set_property: Incorrect number of arguments.\n");
- }
+ void process_port_parameter(std::vector<std::string> args, RTLIL::Design *design)
+ {
+ if (args.size() < 1) {
+ log_error("set_property: Incorrect number of arguments.\n");
+ }
- std::string parameter(args.at(0));
- if (args.size() < 3 || args.at(2).size() == 0) {
- log_error("set_property %s: Incorrect number of arguments.\n", parameter.c_str());
- }
+ std::string parameter(args.at(0));
+ if (args.size() < 3 || args.at(2).size() == 0) {
+ log_error("set_property %s: Incorrect number of arguments.\n", parameter.c_str());
+ }
- std::string port_name(args.at(2));
- std::string value(args.at(1));
+ std::string port_name(args.at(2));
+ std::string value(args.at(1));
- auto port_signal = extract_signal(port_name);
- std::string port(port_signal.first);
- int port_bit = port_signal.second;
+ auto port_signal = extract_signal(port_name);
+ std::string port(port_signal.first);
+ int port_bit = port_signal.second;
- RTLIL::Wire* wire = design->top_module()->wire(RTLIL::escape_id(port));
- if (wire == nullptr) {
- log_error("Couldn't find port %s\n", port_name.c_str());
- }
+ RTLIL::Wire *wire = design->top_module()->wire(RTLIL::escape_id(port));
+ if (wire == nullptr) {
+ log_error("Couldn't find port %s\n", port_name.c_str());
+ }
- if (!isInputPort(wire) && !isOutputPort(wire)) {
- log_error("Port %s is not a top port\n", port_name.c_str());
- }
+ if (!isInputPort(wire) && !isOutputPort(wire)) {
+ log_error("Port %s is not a top port\n", port_name.c_str());
+ }
- if (port_bit < wire->start_offset || port_bit >= wire->start_offset + wire->width) {
- log_error("Incorrect top port index %d in port %s\n", port_bit, port_name.c_str());
- }
+ if (port_bit < wire->start_offset || port_bit >= wire->start_offset + wire->width) {
+ log_error("Incorrect top port index %d in port %s\n", port_bit, port_name.c_str());
+ }
- // Traverse the port wire
- traverse_wire(port_name, design->top_module());
+ // Traverse the port wire
+ traverse_wire(port_name, design->top_module());
- RTLIL::IdString parameter_id(RTLIL::escape_id(parameter));
- for (auto cell_obj : design->top_module()->cells_) {
- RTLIL::IdString cell_id = cell_obj.first;
- RTLIL::Cell* cell = cell_obj.second;
+ RTLIL::IdString parameter_id(RTLIL::escape_id(parameter));
+ for (auto cell_obj : design->top_module()->cells_) {
+ RTLIL::IdString cell_id = cell_obj.first;
+ RTLIL::Cell *cell = cell_obj.second;
- // Check if the cell is of the type we are looking for
- auto cell_type_str = RTLIL::unescape_id(cell->type.str());
- auto primitive_parameters_iter = supported_primitive_parameters.find(cell_type_str);
- if (primitive_parameters_iter == supported_primitive_parameters.end()) {
- continue;
- }
+ // Check if the cell is of the type we are looking for
+ auto cell_type_str = RTLIL::unescape_id(cell->type.str());
+ auto primitive_parameters_iter = supported_primitive_parameters.find(cell_type_str);
+ if (primitive_parameters_iter == supported_primitive_parameters.end()) {
+ continue;
+ }
- // Set the parameter on the cell connected to the selected port
- for (auto connection : cell->connections_) {
- RTLIL::SigSpec cell_signal = connection.second;
- if (is_signal_port(cell_signal, port_name)) {
- // Check if the attribute is allowed for this module
- auto primitive_parameters = primitive_parameters_iter->second;
- if (std::find(primitive_parameters.begin(), primitive_parameters.end(), parameter) == primitive_parameters.end()) {
- log_error("Cell %s of type %s doesn't support the %s attribute\n",
- cell->name.c_str(), cell->type.c_str(),
- parameter_id.c_str());
- }
- if (parameter_id == ID(IO_LOC_PAIRS) and cell->hasParam(parameter_id)) {
- std::string cur_value(cell->getParam(parameter_id).decode_string());
- value = cur_value + "," + value;
- }
- cell->setParam(parameter_id, RTLIL::Const(value));
- log("Setting parameter %s to value %s on cell %s \n", parameter_id.c_str(), value.c_str(), cell_obj.first.c_str());
- }
- }
- }
- log("\n");
- }
+ // Set the parameter on the cell connected to the selected port
+ for (auto connection : cell->connections_) {
+ RTLIL::SigSpec cell_signal = connection.second;
+ if (is_signal_port(cell_signal, port_name)) {
+ // Check if the attribute is allowed for this module
+ auto primitive_parameters = primitive_parameters_iter->second;
+ if (std::find(primitive_parameters.begin(), primitive_parameters.end(), parameter) == primitive_parameters.end()) {
+ log_error("Cell %s of type %s doesn't support the %s attribute\n", cell->name.c_str(), cell->type.c_str(),
+ parameter_id.c_str());
+ }
+ if (parameter_id == ID(IO_LOC_PAIRS) and cell->hasParam(parameter_id)) {
+ std::string cur_value(cell->getParam(parameter_id).decode_string());
+ value = cur_value + "," + value;
+ }
+ cell->setParam(parameter_id, RTLIL::Const(value));
+ log("Setting parameter %s to value %s on cell %s \n", parameter_id.c_str(), value.c_str(), cell_obj.first.c_str());
+ }
+ }
+ }
+ log("\n");
+ }
- // Search module's connections for the specified destination port
- // and traverse from the specified destination wire to the source wire
- void traverse_wire(std::string& port_name, RTLIL::Module* module) {
- auto port_signal = extract_signal(port_name);
- std::string signal_name(port_signal.first);
- auto signal_name_idstr = RTLIL::IdString(RTLIL::escape_id(signal_name));
- int port_bit = port_signal.second;
- for (auto connection : module->connections_) {
- auto dst_sig = connection.first;
- auto src_sig = connection.second;
- if (dst_sig.is_chunk()) {
- auto chunk = dst_sig.as_chunk();
- if (chunk.wire) {
- if (chunk.wire->name != signal_name_idstr) {
- continue;
- }
- if (port_bit < chunk.offset || port_bit >= (chunk.offset + chunk.width)) {
- continue;
- }
- auto src_wires = src_sig.to_sigbit_vector();
- auto src_wire_sigbit = src_wires.at(port_bit - chunk.offset);
- if (src_wire_sigbit.wire) {
- port_name = src_wires.at(port_bit - chunk.offset).wire->name.str();
- if (src_wire_sigbit.offset > 0) {
- port_name += "[" + std::to_string(src_wire_sigbit.offset) + "]";
- }
- return;
- }
- }
- }
- }
- }
+ // Search module's connections for the specified destination port
+ // and traverse from the specified destination wire to the source wire
+ void traverse_wire(std::string &port_name, RTLIL::Module *module)
+ {
+ auto port_signal = extract_signal(port_name);
+ std::string signal_name(port_signal.first);
+ auto signal_name_idstr = RTLIL::IdString(RTLIL::escape_id(signal_name));
+ int port_bit = port_signal.second;
+ for (auto connection : module->connections_) {
+ auto dst_sig = connection.first;
+ auto src_sig = connection.second;
+ if (dst_sig.is_chunk()) {
+ auto chunk = dst_sig.as_chunk();
+ if (chunk.wire) {
+ if (chunk.wire->name != signal_name_idstr) {
+ continue;
+ }
+ if (port_bit < chunk.offset || port_bit >= (chunk.offset + chunk.width)) {
+ continue;
+ }
+ auto src_wires = src_sig.to_sigbit_vector();
+ auto src_wire_sigbit = src_wires.at(port_bit - chunk.offset);
+ if (src_wire_sigbit.wire) {
+ port_name = src_wires.at(port_bit - chunk.offset).wire->name.str();
+ if (src_wire_sigbit.offset > 0) {
+ port_name += "[" + std::to_string(src_wire_sigbit.offset) + "]";
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
- // Extract signal name and port bit information from port name
- std::pair<std::string, int> extract_signal(const std::string& port_name) {
- int port_bit(0);
- std::string port_str(port_name.size(), '\0');
- sscanf(port_name.c_str(), "%[^[][%d]", &port_str[0], &port_bit);
- port_str.resize(strlen(port_str.c_str()));
- return std::make_pair(port_str, port_bit);
- }
+ // Extract signal name and port bit information from port name
+ std::pair<std::string, int> extract_signal(const std::string &port_name)
+ {
+ int port_bit(0);
+ std::string port_str(port_name.size(), '\0');
+ sscanf(port_name.c_str(), "%[^[][%d]", &port_str[0], &port_bit);
+ port_str.resize(strlen(port_str.c_str()));
+ return std::make_pair(port_str, port_bit);
+ }
- // Check if the specified port name is part of the provided connection signal
- bool is_signal_port(RTLIL::SigSpec signal, const std::string& port_name) {
- auto port_signal = extract_signal(port_name);
- std::string port(port_signal.first);
- int port_bit = port_signal.second;
- if (signal.is_chunk()) {
- auto chunk = signal.as_chunk();
- if (chunk.wire) {
- return (chunk.wire->name == RTLIL::IdString(RTLIL::escape_id(port))) &&
- (port_bit == chunk.offset);
- }
- }
- return false;
- }
+ // Check if the specified port name is part of the provided connection signal
+ bool is_signal_port(RTLIL::SigSpec signal, const std::string &port_name)
+ {
+ auto port_signal = extract_signal(port_name);
+ std::string port(port_signal.first);
+ int port_bit = port_signal.second;
+ if (signal.is_chunk()) {
+ auto chunk = signal.as_chunk();
+ if (chunk.wire) {
+ return (chunk.wire->name == RTLIL::IdString(RTLIL::escape_id(port))) && (port_bit == chunk.offset);
+ }
+ }
+ return false;
+ }
- std::function<const BankTilesMap&()> get_bank_tiles;
+ std::function<const BankTilesMap &()> get_bank_tiles;
};
struct ReadXdc : public Frontend {
- ReadXdc()
- : Frontend("xdc", "Read XDC file")
- , GetIOBanks(std::bind(&ReadXdc::get_bank_tiles, this))
- , SetProperty(std::bind(&ReadXdc::get_bank_tiles, this)) {}
+ ReadXdc()
+ : Frontend("xdc", "Read XDC file"), GetIOBanks(std::bind(&ReadXdc::get_bank_tiles, this)),
+ SetProperty(std::bind(&ReadXdc::get_bank_tiles, this))
+ {
+ }
- void help() override {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" read_xdc -part_json <part_json_filename> <filename>\n");
- log("\n");
- log("Read XDC file.\n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" read_xdc -part_json <part_json_filename> <filename>\n");
+ log("\n");
+ log("Read XDC file.\n");
+ log("\n");
+ }
- void execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design*) override {
- if (args.size() < 2) {
- log_cmd_error("Missing script file.\n");
- }
- size_t argidx = 1;
- bank_tiles.clear();
- if (args[argidx] == "-part_json" && argidx + 1 < args.size()) {
- bank_tiles = ::get_bank_tiles(args[++argidx]);
- argidx++;
- }
- extra_args(f, filename, args, argidx);
- std::string content{std::istreambuf_iterator<char>(*f), std::istreambuf_iterator<char>()};
- log("%s\n", content.c_str());
+ void execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *) override
+ {
+ if (args.size() < 2) {
+ log_cmd_error("Missing script file.\n");
+ }
+ size_t argidx = 1;
+ bank_tiles.clear();
+ if (args[argidx] == "-part_json" && argidx + 1 < args.size()) {
+ bank_tiles = ::get_bank_tiles(args[++argidx]);
+ argidx++;
+ }
+ extra_args(f, filename, args, argidx);
+ std::string content{std::istreambuf_iterator<char>(*f), std::istreambuf_iterator<char>()};
+ log("%s\n", content.c_str());
- // According to page 6 of UG903 XDC is tcl, hence quoting of bracketed numbers,
- // such as bus indexes, is required. For example "signal[5]" would be typically
- // expanded to the concatenation of the string "signal" and result of the function call "5"
- // with no arguments. Therefore in TCL the signal indices have to be wrapped in curly braces
- // e.g "{signal[5]}" in order for the interpreter to not perform any variable substitution
- // or function calls on the wrapped content.
- //
- // Nevertheless, it's quite common for EDA tools to allow for specifying signal indices
- // (e.g. "signal[5]") without using non-expanding quotes.
- // Possible TCL implementations of such a feature include registering a TCL command
- // for each integer which returns itself but surrounded with brackets or using the 'unknown'
- // command which is invoked by the Tcl interpreter whenever a script tries to invoke a command
- // that does not exist. In the XDC plugin the latter approach is used, however it's limited to
- // the 'read_xdc' command, hence the 'unknown' command works solely on the content of the XDC file.
- //
- // In this implementation the signal "signal[5]" is expanded in TCL to the concatenation of a string
- // and function call, however this time the handling of the non-existent command '5' is passed by
- // the interpreter to the 'unknown' command which returns a string that consists of the indice
- // integer surrounded by square brackets, i.e. "[5]", effectively expanding the signal to "signal[5]"
- // string.
- //
- Tcl_Interp* interp = yosys_get_tcl_interp();
- Tcl_Eval(interp, "rename unknown _original_unknown");
- Tcl_Eval(interp, "proc unknown args { return \\[[lindex $args 0]\\] }");
- if (Tcl_EvalFile(interp, args[argidx].c_str()) != TCL_OK) {
- log_cmd_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(interp));
- }
- Tcl_Eval(interp, "rename unknown \"\"");
- Tcl_Eval(interp, "rename _original_unknown unknown");
- }
- const BankTilesMap& get_bank_tiles() {
- return bank_tiles;
- }
+ // According to page 6 of UG903 XDC is tcl, hence quoting of bracketed numbers,
+ // such as bus indexes, is required. For example "signal[5]" would be typically
+ // expanded to the concatenation of the string "signal" and result of the function call "5"
+ // with no arguments. Therefore in TCL the signal indices have to be wrapped in curly braces
+ // e.g "{signal[5]}" in order for the interpreter to not perform any variable substitution
+ // or function calls on the wrapped content.
+ //
+ // Nevertheless, it's quite common for EDA tools to allow for specifying signal indices
+ // (e.g. "signal[5]") without using non-expanding quotes.
+ // Possible TCL implementations of such a feature include registering a TCL command
+ // for each integer which returns itself but surrounded with brackets or using the 'unknown'
+ // command which is invoked by the Tcl interpreter whenever a script tries to invoke a command
+ // that does not exist. In the XDC plugin the latter approach is used, however it's limited to
+ // the 'read_xdc' command, hence the 'unknown' command works solely on the content of the XDC file.
+ //
+ // In this implementation the signal "signal[5]" is expanded in TCL to the concatenation of a string
+ // and function call, however this time the handling of the non-existent command '5' is passed by
+ // the interpreter to the 'unknown' command which returns a string that consists of the indice
+ // integer surrounded by square brackets, i.e. "[5]", effectively expanding the signal to "signal[5]"
+ // string.
+ //
+ Tcl_Interp *interp = yosys_get_tcl_interp();
+ Tcl_Eval(interp, "rename unknown _original_unknown");
+ Tcl_Eval(interp, "proc unknown args { return \\[[lindex $args 0]\\] }");
+ if (Tcl_EvalFile(interp, args[argidx].c_str()) != TCL_OK) {
+ log_cmd_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(interp));
+ }
+ Tcl_Eval(interp, "rename unknown \"\"");
+ Tcl_Eval(interp, "rename _original_unknown unknown");
+ }
+ const BankTilesMap &get_bank_tiles() { return bank_tiles; }
- BankTilesMap bank_tiles;
- struct GetIOBanks GetIOBanks;
- struct SetProperty SetProperty;
+ BankTilesMap bank_tiles;
+ struct GetIOBanks GetIOBanks;
+ struct SetProperty SetProperty;
} ReadXdc;
struct GetBankTiles : public Pass {
- GetBankTiles()
- : Pass("get_bank_tiles", "Inspect IO Bank tiles") {
- register_in_tcl_interpreter(pass_name);
- }
+ GetBankTiles() : Pass("get_bank_tiles", "Inspect IO Bank tiles") { register_in_tcl_interpreter(pass_name); }
- void help() override
- {
- // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
- log("\n");
- log(" get_bank_tiles <part_json_file>\n");
- log("\n");
- log("Inspect IO Bank tiles for the specified part based on the provided JSON file.\n");
- log("\n");
- }
+ void help() override
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" get_bank_tiles <part_json_file>\n");
+ log("\n");
+ log("Inspect IO Bank tiles for the specified part based on the provided JSON file.\n");
+ log("\n");
+ }
- void execute(std::vector<std::string> args, RTLIL::Design* ) override {
- if (args.size() < 2) {
- log_cmd_error("Missing JSON file.\n");
- }
- // Check if the part has the specified bank
- auto bank_tiles = get_bank_tiles(args[1]);
- if (bank_tiles.size()) {
- log("Available bank tiles:\n");
- for (auto bank : bank_tiles) {
- log("Bank: %d, Tile: %s\n", bank.first, bank.second.c_str());
- }
- log("\n");
- } else {
- log("No bank tiles available.\n");
- }
- }
+ void execute(std::vector<std::string> args, RTLIL::Design *) override
+ {
+ if (args.size() < 2) {
+ log_cmd_error("Missing JSON file.\n");
+ }
+ // Check if the part has the specified bank
+ auto bank_tiles = get_bank_tiles(args[1]);
+ if (bank_tiles.size()) {
+ log("Available bank tiles:\n");
+ for (auto bank : bank_tiles) {
+ log("Bank: %d, Tile: %s\n", bank.first, bank.second.c_str());
+ }
+ log("\n");
+ } else {
+ log("No bank tiles available.\n");
+ }
+ }
} GetBankTiles;
PRIVATE_NAMESPACE_END