Merge pull request #2031 from epfl-vlsc/master

Add extmodule support to firrtl backend
This commit is contained in:
whitequark 2020-05-28 09:59:17 +00:00 committed by GitHub
commit 736ccb2ad5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 40 additions and 1 deletions

View File

@ -392,7 +392,34 @@ struct FirrtlWorker
return result;
}
void run()
void emit_extmodule()
{
std::string moduleFileinfo = getFileinfo(module);
f << stringf(" extmodule %s: %s\n", make_id(module->name), moduleFileinfo.c_str());
vector<std::string> port_decls;
for (auto wire : module->wires())
{
const auto wireName = make_id(wire->name);
std::string wireFileinfo = getFileinfo(wire);
if (wire->port_input && wire->port_output)
{
log_error("Module port %s.%s is inout!\n", log_id(module), log_id(wire));
}
port_decls.push_back(stringf(" %s %s: UInt<%d> %s\n", wire->port_input ? "input" : "output",
wireName, wire->width, wireFileinfo.c_str()));
}
for (auto &str : port_decls)
{
f << str;
}
f << stringf("\n");
}
void emit_module()
{
std::string moduleFileinfo = getFileinfo(module);
f << stringf(" module %s: %s\n", make_id(module->name), moduleFileinfo.c_str());
@ -1078,6 +1105,18 @@ struct FirrtlWorker
for (auto str : wire_exprs)
f << str;
f << stringf("\n");
}
void run()
{
// Blackboxes should be emitted as `extmodule`s in firrtl. Only ports are
// emitted in such a case.
if (module->get_blackbox_attribute())
emit_extmodule();
else
emit_module();
}
};