kernel/mem: Add a check() function.
authorMarcelina Kościelnicka <mwk@0x04.net>
Sat, 22 May 2021 14:36:50 +0000 (16:36 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Sat, 22 May 2021 19:42:53 +0000 (21:42 +0200)
kernel/mem.cc
kernel/mem.h

index 9d68dbbb742d8387ffed5c0fd8bbc6f9b23a0d0b..7d20833e5436a2892cac742dee0c8922e88d7ee3 100644 (file)
@@ -52,6 +52,7 @@ void Mem::remove() {
 }
 
 void Mem::emit() {
+       check();
        std::vector<int> rd_left;
        for (int i = 0; i < GetSize(rd_ports); i++) {
                auto &port = rd_ports[i];
@@ -257,6 +258,27 @@ Const Mem::get_init_data() const {
        return init_data;
 }
 
+void Mem::check() {
+       for (auto &port : rd_ports) {
+               if (port.removed)
+                       continue;
+               log_assert(GetSize(port.clk) == 1);
+               log_assert(GetSize(port.en) == 1);
+               log_assert(GetSize(port.data) == width);
+               if (!port.clk_enable) {
+                       log_assert(!port.transparent);
+               }
+       }
+       for (int i = 0; i < GetSize(wr_ports); i++) {
+               auto &port = wr_ports[i];
+               if (port.removed)
+                       continue;
+               log_assert(GetSize(port.clk) == 1);
+               log_assert(GetSize(port.en) == width);
+               log_assert(GetSize(port.data) == width);
+       }
+}
+
 namespace {
 
        struct MemIndex {
@@ -333,6 +355,7 @@ namespace {
                        for (auto &it : inits)
                                res.inits.push_back(it.second);
                }
+               res.check();
                return res;
        }
 
@@ -389,6 +412,7 @@ namespace {
                        mwr.data = cell->getPort(ID::WR_DATA).extract(i * res.width, res.width);
                        res.wr_ports.push_back(mwr);
                }
+               res.check();
                return res;
        }
 
@@ -451,6 +475,7 @@ Cell *Mem::extract_rdff(int idx) {
        port.clk = State::S0;
        port.clk_enable = false;
        port.clk_polarity = true;
+       port.transparent = false;
 
        return c;
 }
index 547386f3cb89de02f416b03088d93cf91a9984ea..f5c7b641ffada3bde419d641275d977d2f6e4ca8 100644 (file)
@@ -66,6 +66,7 @@ struct Mem {
        void remove();
        void emit();
        void clear_inits();
+       void check();
        Const get_init_data() const;
        static std::vector<Mem> get_all_memories(Module *module);
        static std::vector<Mem> get_selected_memories(Module *module);