diff --git a/macros/src/main/scala/MacroCompiler.scala b/macros/src/main/scala/MacroCompiler.scala index 4f1607da..6c0306a8 100644 --- a/macros/src/main/scala/MacroCompiler.scala +++ b/macros/src/main/scala/MacroCompiler.scala @@ -223,7 +223,6 @@ 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) diff --git a/macros/src/test/scala/Masks.scala b/macros/src/test/scala/Masks.scala new file mode 100644 index 00000000..c00a162d --- /dev/null +++ b/macros/src/test/scala/Masks.scala @@ -0,0 +1,152 @@ +package barstools.macros + +import mdf.macrolib._ + +// Test the ability of the compiler to deal with various mask combinations. + +// Simple powers of two with bit-masked lib. + +trait MasksTestSettings { + this: MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator => + override lazy val memDepth = 2048 + override lazy val libDepth = 1024 +} + +class Masks_PowersOfTwo_8_1 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 64 + override lazy val memMaskGran = Some(8) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_PowersOfTwo_16_1 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 64 + override lazy val memMaskGran = Some(16) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_PowersOfTwo_32_1 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 64 + override lazy val memMaskGran = Some(32) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_PowersOfTwo_64_1 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 64 + override lazy val memMaskGran = Some(64) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +// Simple powers of two with non bit-masked lib. + +class Masks_PowersOfTwo_32_4 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 128 + override lazy val memMaskGran = Some(32) + override lazy val libMaskGran = Some(4) + + it should "be enabled when non-power of two masks are supported" is (pending) + //compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_PowersOfTwo_32_8 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 128 + override lazy val memMaskGran = Some(32) + override lazy val libMaskGran = Some(8) + + it should "be enabled when non-power of two masks are supported" is (pending) + //compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_PowersOfTwo_8_8 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 128 + override lazy val memMaskGran = Some(8) + override lazy val libMaskGran = Some(8) + + it should "be enabled when non-power of two masks are supported" is (pending) + //compileExecuteAndTest(mem, lib, v, output) +} + +// Width as a multiple of the mask, bit-masked lib + +class Masks_IntegerMaskMultiple_20_10 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 20 + override lazy val memMaskGran = Some(10) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_21_7 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 21 + override lazy val memMaskGran = Some(21) + override lazy val libMaskGran = Some(7) + + it should "be enabled when non-power of two masks are supported" is (pending) + //~ compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_21_21 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 21 + override lazy val memMaskGran = Some(21) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_84_21 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 84 + override lazy val memMaskGran = Some(21) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_92_23 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 92 + override lazy val memMaskGran = Some(23) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_117_13 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 117 + override lazy val memMaskGran = Some(13) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_160_20 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 160 + override lazy val memMaskGran = Some(20) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +class Masks_IntegerMaskMultiple_184_23 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 184 + override lazy val memMaskGran = Some(23) + override lazy val libMaskGran = Some(1) + + compileExecuteAndTest(mem, lib, v, output) +} + +// Width as an non-integer multiple of the mask, bit-masked lib + +class Masks_NonIntegerMaskMultiple_32_3 extends MacroCompilerSpec with HasSRAMGenerator with HasSimpleDepthTestGenerator with MasksTestSettings { + override lazy val width = 32 + override lazy val memMaskGran = Some(3) + override lazy val libMaskGran = Some(1) + + it should "be enabled when non-power of two masks are supported" is (pending) + //~ compileExecuteAndTest(mem, lib, v, output) +}