From bb2783994ad3aaf0dd396fd236eb8c58c94a5418 Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Fri, 21 Jul 2017 10:33:29 -0700 Subject: [PATCH] Only use powers of two masks, for now --- tapeout/src/main/scala/transforms/macros/MacroCompiler.scala | 3 +++ tapeout/src/main/scala/transforms/macros/Utils.scala | 3 +++ 2 files changed, 6 insertions(+) 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 }