Added simplemap $lut support
authorClifford Wolf <clifford@clifford.at>
Mon, 27 Apr 2015 08:16:07 +0000 (10:16 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 27 Apr 2015 08:16:07 +0000 (10:16 +0200)
passes/techmap/simplemap.cc
passes/techmap/simplemap.h
techlibs/common/techmap.v

index 170b7b04f8c759ace534cb79bee15a0e78f1930c..6cd1c5864b7bb00614af0af68374805bf534e0fb 100644 (file)
@@ -283,6 +283,29 @@ void simplemap_mux(RTLIL::Module *module, RTLIL::Cell *cell)
        }
 }
 
+void simplemap_lut(RTLIL::Module *module, RTLIL::Cell *cell)
+{
+       SigSpec lut_ctrl = cell->getPort("\\A");
+       SigSpec lut_data = cell->getParam("\\LUT");
+       lut_data.extend_u0(1 << cell->getParam("\\WIDTH").as_int());
+
+       for (int idx = 0; GetSize(lut_data) > 1; idx++) {
+               SigSpec sig_s = lut_ctrl[idx];
+               SigSpec new_lut_data = module->addWire(NEW_ID, GetSize(lut_data)/2);
+               for (int i = 0; i < GetSize(lut_data); i += 2) {
+                       RTLIL::Cell *gate = module->addCell(NEW_ID, "$_MUX_");
+                       gate->add_strpool_attribute("\\src", cell->get_strpool_attribute("\\src"));
+                       gate->setPort("\\A", lut_data[i]);
+                       gate->setPort("\\B", lut_data[i+1]);
+                       gate->setPort("\\S", lut_ctrl[idx]);
+                       gate->setPort("\\Y", new_lut_data[i/2]);
+               }
+               lut_data = new_lut_data;
+       }
+
+       module->connect(cell->getPort("\\Y"), lut_data);
+}
+
 void simplemap_slice(RTLIL::Module *module, RTLIL::Cell *cell)
 {
        int offset = cell->parameters.at("\\OFFSET").as_int();
@@ -458,6 +481,7 @@ void simplemap_get_mappers(std::map<RTLIL::IdString, void(*)(RTLIL::Module*, RTL
        mappers["$ne"]          = simplemap_eqne;
        mappers["$nex"]         = simplemap_eqne;
        mappers["$mux"]         = simplemap_mux;
+       mappers["$lut"]         = simplemap_lut;
        mappers["$slice"]       = simplemap_slice;
        mappers["$concat"]      = simplemap_concat;
        mappers["$sr"]          = simplemap_sr;
index dc2a395d3460039896a0023d77ba0eed08caef66..67be4efef78be023256cd1722d37a8370c6d4efa 100644 (file)
@@ -31,6 +31,7 @@ extern void simplemap_reduce(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_lognot(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_logbin(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_mux(RTLIL::Module *module, RTLIL::Cell *cell);
+extern void simplemap_lut(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_slice(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_concat(RTLIL::Module *module, RTLIL::Cell *cell);
 extern void simplemap_sr(RTLIL::Module *module, RTLIL::Cell *cell);
index e0ecf0c480e6cfc0c7fd4fb5db0a82e2c938f2e1..f67e365846e5892f28543f22ff5d9617a31e542c 100644 (file)
@@ -451,15 +451,9 @@ endmodule
 // --------------------------------------------------------
 
 `ifndef NOLUT
+(* techmap_simplemap *)
 (* techmap_celltype = "$lut" *)
-module _90_lut (A, Y);
-       parameter WIDTH = 1;
-       parameter LUT = 0;
-
-       input [WIDTH-1:0] A;
-       output Y;
-
-       assign Y = LUT[A];
+module _90_lut;
 endmodule
 `endif