add inc_offs function to be used for vl/subvl loops
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 07:42:44 +0000 (08:42 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 07:42:44 +0000 (08:42 +0100)
riscv/sv.cc
riscv/sv.h

index cf70568171f9acdfc0e70774c390aaf65a571f56..ac98c696f3c8085670bce5e32d31754b73c8d8a3 100644 (file)
@@ -20,6 +20,29 @@ uint8_t maxelwidth(uint8_t wid1, uint8_t wid2)
     return std::max(wid1, wid2);
 }
 
+/* increments the offset and sub-offset appropriately in a FSM-based
+   version of a twin-nested for-loop:
+   for (offs = 0; offs < vlen; offs++) {
+     for (suboffs = 0; suboffs < subvl; suboffs++) {
+     ... doooo stuuuuff (python would use "yield" here)
+     }
+     suboffs = 0; // reset to zero after "loop"
+   }
+*/
+bool inc_offs(int vlen, int subvl, int &offs, int &suboffs)
+{
+    suboffs++;
+    if (suboffs < subvl) {
+        return true; // double-nested loop can continue
+    }
+    suboffs = 0; // reset the sub-offs
+    offs += 1; // increment the outer (VL) loop instead
+    if (offs < vlen) {
+        return true; // also can continue
+    }
+    return false; // should not continue, however let FN deal with it
+}
+
 sv_insn_t::sv_insn_t(processor_t *pr, bool _sv_enabled,
             insn_bits_t bits, unsigned int f,
             int _xlen, int _src_flen, int _dest_flen,
index fed8b6f0fa83d0122a0e5aea5efd1465ab920c95..be96c8cb5676e41023a19dc6532b4358ac18d528 100644 (file)
@@ -119,4 +119,6 @@ typedef struct {
 #define SV_CFG_BANK (0x7)
 #define SV_CFG_SIZE (0x3<<3)
 
+bool inc_offs(int vlen, int subvl, int &offs, int &suboffs);
+
 #endif