summaryrefslogtreecommitdiff
path: root/backends/blif/blif.cc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-02-22 14:25:32 +0100
committerClifford Wolf <clifford@clifford.at>2014-02-22 14:25:32 +0100
commit337b461d26f3cdc34f4a2b6c49d61427ef10ef96 (patch)
treeb182b4a4f11846dbc267a960e84561b7b2eb0bab /backends/blif/blif.cc
parent357f3f6e93df1ebf2aa28a6c433a84f320fad043 (diff)
Added $lut support to blif backend (by user eddiehung from reddit)
Diffstat (limited to 'backends/blif/blif.cc')
-rw-r--r--backends/blif/blif.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/backends/blif/blif.cc b/backends/blif/blif.cc
index 1c06fe51..498f1351 100644
--- a/backends/blif/blif.cc
+++ b/backends/blif/blif.cc
@@ -190,6 +190,29 @@ struct BlifDumper
continue;
}
+ if (!config->icells_mode && cell->type == "$lut") {
+ fprintf(f, ".names");
+ auto &inputs = cell->connections.at("\\I");
+ auto width = cell->parameters.at("\\WIDTH").as_int();
+ log_assert(inputs.width == width);
+ for (int i = 0; i < inputs.width; i++) {
+ fprintf(f, " %s", cstr(inputs.extract(i, 1)));
+ }
+ auto &output = cell->connections.at("\\O");
+ log_assert(output.width == 1);
+ fprintf(f, " %s", cstr(output));
+ fprintf(f, "\n");
+ auto mask = cell->parameters.at("\\LUT").as_string();
+ for (int i = 0; i < (1 << width); i++) {
+ if (mask[i] == '0') continue;
+ for (int j = width-1; j >= 0; j--) {
+ fputc((i>>j)&1 ? '1' : '0', f);
+ }
+ fprintf(f, " %c\n", mask[i]);
+ }
+ continue;
+ }
+
fprintf(f, ".%s %s", subckt_or_gate(cell->type), cstr(cell->type));
for (auto &conn : cell->connections)
for (int i = 0; i < conn.second.width; i++) {