From 753e34007d64e1bf9d9d5fa19d6a39b328672d88 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 5 Apr 2020 09:27:55 +0000 Subject: write_cxxrtl: add support for $dlatch and $dlatchsr cells. Also, fix codegen for $dffe and $adff. --- backends/cxxrtl/cxxrtl.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/backends/cxxrtl/cxxrtl.cc b/backends/cxxrtl/cxxrtl.cc index 49b9e2ddf..d204364ca 100644 --- a/backends/cxxrtl/cxxrtl.cc +++ b/backends/cxxrtl/cxxrtl.cc @@ -202,7 +202,7 @@ static bool is_sync_ff_cell(RTLIL::IdString type) static bool is_ff_cell(RTLIL::IdString type) { return is_sync_ff_cell(type) || type.in( - ID($adff), ID($dffsr), ID($sr)); + ID($adff), ID($dffsr), ID($dlatch), ID($dlatchsr), ID($sr)); } static bool is_internal_cell(RTLIL::IdString type) @@ -786,7 +786,7 @@ struct CxxrtlWorker { if (cell->type == ID($dffe)) { f << indent << "if ("; dump_sigspec_rhs(cell->getPort(ID(EN))); - f << " == value<1> {" << cell->getParam(ID(EN_POLARITY)).as_bool() << "}) {\n"; + f << " == value<1> {" << cell->getParam(ID(EN_POLARITY)).as_bool() << "u}) {\n"; inc_indent(); } f << indent; @@ -800,12 +800,25 @@ struct CxxrtlWorker { } dec_indent(); f << indent << "}\n"; + } else if (cell->hasPort(ID(EN))) { + // Level-sensitive logic + f << indent << "if ("; + dump_sigspec_rhs(cell->getPort(ID(EN))); + f << " == value<1> {" << cell->getParam(ID(EN_POLARITY)).as_bool() << "u}) {\n"; + inc_indent(); + f << indent; + dump_sigspec_lhs(cell->getPort(ID(Q))); + f << " = "; + dump_sigspec_rhs(cell->getPort(ID(D))); + f << ";\n"; + dec_indent(); + f << indent << "}\n"; } if (cell->hasPort(ID(ARST))) { // Asynchronous reset (entire coarse cell at once) f << indent << "if ("; dump_sigspec_rhs(cell->getPort(ID(ARST))); - f << " == value<1> {" << cell->getParam(ID(ARST_POLARITY)).as_bool() << "}) {\n"; + f << " == value<1> {" << cell->getParam(ID(ARST_POLARITY)).as_bool() << "u}) {\n"; inc_indent(); f << indent; dump_sigspec_lhs(cell->getPort(ID(Q))); -- cgit v1.2.3