summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoyang Han2021-05-23 04:04:42 -0700
committerJiuyang Liu2021-06-16 10:32:04 +0800
commit93e9e2ba8058ef89afacc00c16e138b0243587ba (patch)
tree8875ee21fdac063940e8acd869887045b45cb72b
parentf48b4abd9b2e10a5243cadf3803f7f42d4ce25fc (diff)
Merge minimized table before return as a TruthTable
-rw-r--r--src/main/scala/chisel3/util/experimental/decode/QMCMinimizer.scala17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/main/scala/chisel3/util/experimental/decode/QMCMinimizer.scala b/src/main/scala/chisel3/util/experimental/decode/QMCMinimizer.scala
index bc5ea351..3fa5a70c 100644
--- a/src/main/scala/chisel3/util/experimental/decode/QMCMinimizer.scala
+++ b/src/main/scala/chisel3/util/experimental/decode/QMCMinimizer.scala
@@ -220,7 +220,7 @@ object QMCMinimizer extends Minimizer {
val m = outputs.head.getWidth
// for all outputs
- table.copy(table = (0 until m).flatMap(i => {
+ val minimized = (0 until m).flatMap(i => {
val outputBp = BitPat("b" + "?" * (m - i - 1) + "1" + "?" * i)
// Minterms, implicants that makes the output to be 1
@@ -277,6 +277,19 @@ object QMCMinimizer extends Minimizer {
getEssentialPrimeImplicants(primeImplicants, implicants)
(essentialPrimeImplicants ++ getCover(nonessentialPrimeImplicants, uncoveredImplicants)).map(a => (a.bp, outputBp))
- }).toMap)
+ })
+
+ minimized.tail.foldLeft(table.copy(table = Map(minimized.head))) { case (tb, t) =>
+ if (tb.table.exists(x => x._1 == t._1)) {
+ tb.copy(table = tb.table.map { case (k, v) =>
+ if (k == t._1) {
+ def ones(bitPat: BitPat) = bitPat.toString.drop(7).dropRight(1).zipWithIndex.collect{case ('1', x) => x}
+ (k, BitPat("b" + (0 until v.getWidth).map(i => if ((ones(v) ++ ones(t._2)).contains(i)) "1" else "?").mkString))
+ } else (k, v)
+ })
+ } else {
+ tb.copy(table = tb.table + t)
+ }
+ }
}
} \ No newline at end of file