Add "wbflip" command
authorClifford Wolf <clifford@clifford.at>
Sat, 20 Apr 2019 09:04:46 +0000 (11:04 +0200)
committerClifford Wolf <clifford@clifford.at>
Sat, 20 Apr 2019 09:04:46 +0000 (11:04 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
kernel/rtlil.cc
kernel/rtlil.h
passes/cmds/setattr.cc

index 2f8715755442b91ac59707c7056756bf832c2679..f6f08bb9e98a5e4fe691499bd16415a2b8118d45 100644 (file)
@@ -207,9 +207,12 @@ bool RTLIL::Const::is_fully_undef() const
        return true;
 }
 
-void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id)
+void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id, bool value)
 {
-       attributes[id] = RTLIL::Const(1);
+       if (value)
+               attributes[id] = RTLIL::Const(1);
+       else if (attributes.count(id))
+               attributes.erase(id);
 }
 
 bool RTLIL::AttrObject::get_bool_attribute(RTLIL::IdString id) const
index 9e396d6f660e5b29117d1c88eed89ffef710ff3b..330a81c3bc3aa71ca4d45eac35ebc1aa2e4a383f 100644 (file)
@@ -566,7 +566,7 @@ struct RTLIL::AttrObject
 {
        dict<RTLIL::IdString, RTLIL::Const> attributes;
 
-       void set_bool_attribute(RTLIL::IdString id);
+       void set_bool_attribute(RTLIL::IdString id, bool value=true);
        bool get_bool_attribute(RTLIL::IdString id) const;
 
        bool get_blackbox_attribute(bool ignore_wb=false) const {
index d38a6b3da786e2094c88ab869749aed96a90a32a..b9fcc3e7a3420bd4f081bc45e26afc8f0f5162b3 100644 (file)
@@ -128,6 +128,45 @@ struct SetattrPass : public Pass {
        }
 } SetattrPass;
 
+struct WbflipPass : public Pass {
+       WbflipPass() : Pass("wbflip", "flip the whitebox attribute") { }
+       void help() YS_OVERRIDE
+       {
+               //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+               log("\n");
+               log("    wbflip [selection]\n");
+               log("\n");
+               log("Flip the whitebox attribute on selected cells. I.e. if it's set, unset it, and\n");
+               log("vice-versa. Blackbox cells are not effected by this command.\n");
+               log("\n");
+       }
+       void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
+       {
+               size_t argidx;
+               for (argidx = 1; argidx < args.size(); argidx++)
+               {
+                       std::string arg = args[argidx];
+                       // if (arg == "-mod") {
+                       //      flag_mod = true;
+                       //      continue;
+                       // }
+                       break;
+               }
+               extra_args(args, argidx, design);
+
+               for (Module *module : design->modules())
+               {
+                       if (!design->selected(module))
+                               continue;
+
+                       if (module->get_bool_attribute("\\blackbox"))
+                               continue;
+
+                       module->set_bool_attribute("\\whitebox", !module->get_bool_attribute("\\whitebox"));
+               }
+       }
+} WbflipPass;
+
 struct SetparamPass : public Pass {
        SetparamPass() : Pass("setparam", "set/unset parameters on objects") { }
        void help() YS_OVERRIDE