diff --git a/tapeout/src/main/scala/transforms/macros/MacroCompiler.scala b/tapeout/src/main/scala/transforms/macros/MacroCompiler.scala index 46ac353c..54c35cc9 100644 --- a/tapeout/src/main/scala/transforms/macros/MacroCompiler.scala +++ b/tapeout/src/main/scala/transforms/macros/MacroCompiler.scala @@ -178,6 +178,9 @@ class MacroCompilerPass(mems: Option[Seq[Macro]], } else { require(libPort.src.effectiveMaskGran == 1, "only single-bit mask supported for now") + require(isPowerOfTwo(memPort.src.effectiveMaskGran), "only powers of two masks supported for now") + require(isPowerOfTwo(libPort.src.effectiveMaskGran), "only powers of two masks supported for now") + cat(((low to high) map (i => bits(WRef(mem), i / memPort.src.effectiveMaskGran))).reverse) } case None => diff --git a/tapeout/src/main/scala/transforms/macros/Utils.scala b/tapeout/src/main/scala/transforms/macros/Utils.scala index 275943e8..72b9c631 100644 --- a/tapeout/src/main/scala/transforms/macros/Utils.scala +++ b/tapeout/src/main/scala/transforms/macros/Utils.scala @@ -93,4 +93,7 @@ object Utils { case Some(ActiveLow) | Some(NegativeEdge) => not(exp) case _ => exp } + + // Check if a number is a power of two + def isPowerOfTwo(x: Int): Boolean = (x & (x - 1)) == 0 }