mirror of
https://github.com/YosysHQ/yosys
synced 2025-05-06 07:15:48 +00:00
Add bundle support
This commit is contained in:
parent
36e57017fe
commit
f76cb43ac7
1 changed files with 49 additions and 2 deletions
|
@ -529,7 +529,7 @@ struct LibertyFrontend : public Frontend {
|
||||||
std::map<std::string, std::tuple<int, int, bool>> global_type_map;
|
std::map<std::string, std::tuple<int, int, bool>> global_type_map;
|
||||||
parse_type_map(global_type_map, parser.ast);
|
parse_type_map(global_type_map, parser.ast);
|
||||||
|
|
||||||
string leakage_power_unit;
|
string leakage_power_unit = "";
|
||||||
for (auto cell : parser.ast->children)
|
for (auto cell : parser.ast->children)
|
||||||
{
|
{
|
||||||
if (cell->id == "leakage_power_unit")
|
if (cell->id == "leakage_power_unit")
|
||||||
|
@ -560,7 +560,8 @@ struct LibertyFrontend : public Frontend {
|
||||||
|
|
||||||
RTLIL::Module *module = new RTLIL::Module;
|
RTLIL::Module *module = new RTLIL::Module;
|
||||||
module->name = cell_name;
|
module->name = cell_name;
|
||||||
module->attributes["\\leakage_power_unit"] = leakage_power_unit;
|
if (leakage_power_unit != "")
|
||||||
|
module->attributes["\\leakage_power_unit"] = leakage_power_unit;
|
||||||
|
|
||||||
if (flag_lib)
|
if (flag_lib)
|
||||||
module->set_bool_attribute(ID::blackbox);
|
module->set_bool_attribute(ID::blackbox);
|
||||||
|
@ -635,6 +636,52 @@ struct LibertyFrontend : public Frontend {
|
||||||
if (dir->value == "output" || dir->value == "inout")
|
if (dir->value == "output" || dir->value == "inout")
|
||||||
wire->port_output = true;
|
wire->port_output = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node->id == "bundle" && node->args.size() == 1)
|
||||||
|
{
|
||||||
|
if (!flag_lib)
|
||||||
|
log_error("Error in cell %s: bundle interfaces are only supported in -lib mode.\n", log_id(cell_name));
|
||||||
|
|
||||||
|
const LibertyAst *dir = node->find("direction");
|
||||||
|
|
||||||
|
if (dir == nullptr) {
|
||||||
|
const LibertyAst *pin = node->find("pin");
|
||||||
|
if (pin != nullptr)
|
||||||
|
dir = pin->find("direction");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dir || (dir->value != "input" && dir->value != "output" && dir->value != "inout" && dir->value != "internal"))
|
||||||
|
log_error("Missing or invalid direction for bundle %s on cell %s.\n", node->args.at(0).c_str(), log_id(module->name));
|
||||||
|
|
||||||
|
if (dir->value == "internal")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const LibertyAst *members = node->find("members");
|
||||||
|
|
||||||
|
if (!members)
|
||||||
|
log_error("Missing members for bundle %s on cell %s.\n", node->args.at(0).c_str(), log_id(module->name));
|
||||||
|
|
||||||
|
for (auto member : members->args)
|
||||||
|
{
|
||||||
|
Wire *wire = module->addWire(RTLIL::escape_id(member));
|
||||||
|
|
||||||
|
if (dir && dir->value == "inout") {
|
||||||
|
wire->port_input = true;
|
||||||
|
wire->port_output = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir && dir->value == "input") {
|
||||||
|
wire->port_input = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir && dir->value == "output")
|
||||||
|
wire->port_output = true;
|
||||||
|
|
||||||
|
if (flag_lib)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!flag_lib)
|
if (!flag_lib)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue