From 3691fe61cc43beb0e7d0f813723d4150daa79372 Mon Sep 17 00:00:00 2001 From: Jiuyang Liu Date: Thu, 6 May 2021 16:20:50 +0000 Subject: add a simple decoder API. --- .../chisel3/util/experimental/decode/decoder.scala | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/scala/chisel3/util/experimental/decode/decoder.scala (limited to 'src/main/scala/chisel3/util/experimental/decode/decoder.scala') diff --git a/src/main/scala/chisel3/util/experimental/decode/decoder.scala b/src/main/scala/chisel3/util/experimental/decode/decoder.scala new file mode 100644 index 00000000..2ef474e1 --- /dev/null +++ b/src/main/scala/chisel3/util/experimental/decode/decoder.scala @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: Apache-2.0 + +package chisel3.util.experimental.decode + +import chisel3._ +import chisel3.experimental.{ChiselAnnotation, annotate} +import chisel3.util.{BitPat, pla} +import chisel3.util.experimental.getAnnotations +import firrtl.annotations.Annotation +import logger.LazyLogging + +object decoder extends LazyLogging { + def apply(minimizer: Minimizer, input: UInt, truthTable: TruthTable): UInt = { + val minimizedTable = getAnnotations().collect { + case DecodeTableAnnotation(_, in, out) => TruthTable(in) -> TruthTable(out) + }.toMap.getOrElse( + { + logger.trace(s"""Decoder Cache Hit! + |${truthTable.table} + |""".stripMargin) + truthTable + }, { + val startTime = System.nanoTime() + val minimizedTable = minimizer.minimize(truthTable) + val totalTime = System.nanoTime() - startTime + val totalTimeInSeconds = totalTime / 1e9 + val info = f"Logic Minimize with $minimizer finished in ${totalTimeInSeconds} second" + if (totalTimeInSeconds > 5) + logger.error( + s"$info spends too long, consider using chisel3.util.experimental.DecodeTableAnnotation to cache decode result or switch to EspressoMinimizer." + ) + else logger.trace(info) + minimizedTable + } + ) + if (minimizedTable.table.isEmpty) { + val outputs = Wire(UInt(minimizedTable.default.getWidth.W)) + outputs := minimizedTable.default.value.U(minimizedTable.default.getWidth.W) + outputs + } else { + val (plaInput, plaOutput) = + pla(minimizedTable.table.toSeq, BitPat(minimizedTable.default.value.U(minimizedTable.default.getWidth.W))) + + annotate(new ChiselAnnotation { + override def toFirrtl: Annotation = + DecodeTableAnnotation(plaOutput.toTarget, truthTable.toString, minimizedTable.toString) + }) + + plaInput := input + plaOutput + } + } +} -- cgit v1.2.3