Merge pull request #130 from antmicro/add-new-write-edif-backend
ql: edif: add padding to LUT INITs
diff --git a/ql-qlf-plugin/ql-edif.cc b/ql-qlf-plugin/ql-edif.cc
index 902e065..9d136af 100644
--- a/ql-qlf-plugin/ql-edif.cc
+++ b/ql-qlf-plugin/ql-edif.cc
@@ -332,14 +332,16 @@
*f << stringf("\n (property %s (string \"%d'h%s\"))", EDIF_DEF(name), GetSize(val.bits), hex_string.c_str());
}
};
- auto add_lut_prop = [&](IdString name, Const val) {
+ auto add_lut_prop = [&](IdString name, Const val, int lut_in) {
if ((val.flags & RTLIL::CONST_FLAG_STRING) != 0)
*f << stringf("\n (property %s (string \"%s\"))", EDIF_DEF(name), val.decode_string().c_str());
else if (val.bits.size() <= 32 && RTLIL::SigSpec(val).is_fully_def()) {
- if (strstr(name.c_str(), "INIT"))
- *f << stringf("\n (property %s (string \"%X\"))", EDIF_DEF(name), val.as_int());
- else
+ if (strstr(name.c_str(), "INIT")) {
+ int hex_code_width = ((1 << lut_in) / 4);
+ *f << stringf("\n (property %s (string \"%0*X\"))", EDIF_DEF(name), hex_code_width, val.as_int());
+ } else {
*f << stringf("\n (property %s (integer %u))", EDIF_DEF(name), val.as_int());
+ }
} else {
std::string hex_string = "";
for (size_t i = 0; i < val.bits.size(); i += 4) {
@@ -488,12 +490,15 @@
*f << stringf(" (instance %s\n", EDIF_DEF(cell->name));
*f << stringf(" (viewRef VIEW_NETLIST (cellRef %s%s))", EDIF_REF(cell->type),
lib_cell_ports.count(cell->type) > 0 ? " (libraryRef LIB)" : "");
- if (strstr(cell->type.c_str(), "LUT")) {
+ const char *lut_pos;
+ lut_pos = strstr(cell->type.c_str(), "LUT");
+ if (lut_pos) {
+ int lut_in = atoi(lut_pos + 3); // get the number of LUT inputs
for (auto &p : cell->parameters)
- add_lut_prop(p.first, p.second);
+ add_lut_prop(p.first, p.second, lut_in);
if (attr_properties)
for (auto &p : cell->attributes)
- add_lut_prop(p.first, p.second);
+ add_lut_prop(p.first, p.second, lut_in);
} else {
for (auto &p : cell->parameters)
add_prop(p.first, p.second);