// SPDX-License-Identifier: Apache-2.0

package chisel3.util.experimental.decode

abstract class Minimizer {
  /** Minimize a multi-input multi-output logic function given by the truth table `table`, with function output values
    * on unspecified inputs treated as `default`, and return a minimized PLA-like representation of the function.
    *
    * Each bit of `table[]._1` encodes one 1-bit input variable of the logic function, and each bit of `default` and
    * `table[]._2` represents one 1-bit output value of the function.
    *
    * @param table    Truth table, can have don't cares in both inputs and outputs, specified as [(inputs, outputs), ...]
    * @return         Minimized truth table, [(inputs, outputs), ...]
    *
    * @example {{{
    *          minimize(BitPat("b?"), Seq(
    *              (BitPat("b000"), BitPat("b0")),
    *              // (BitPat("b001"), BitPat("b?")),  // same as default, can be omitted
    *              // (BitPat("b010"), BitPat("b?")),  // same as default, can be omitted
    *              (BitPat("b011"), BitPat("b0")),
    *              (BitPat("b100"), BitPat("b1")),
    *              (BitPat("b101"), BitPat("b1")),
    *              (BitPat("b110"), BitPat("b0")),
    *              (BitPat("b111"), BitPat("b1")),
    *          ))
    * }}}
    */
  def minimize(table: TruthTable): TruthTable
}