Skip to content

Arithmetic between types #250

@jurevreca12

Description

@jurevreca12

Is it possible to do arithmetic between types?
i.e. something akin to the following:

import chisel3._
import chisel3.stage.ChiselStage
import dsptools.numbers.Real
import dsptools.numbers.implicits._

class Test[I <: Bits: Real, W <: Bits: Real, O <: Bits](genI: I, genW: W, genO: O) extends Module {
    val inI = IO(Input(genI))
    val inW = IO(Input(genW))
    val out = IO(Output(genO))
    out := inI * inW
}

object Main extends App {
    println((new ChiselStage).emitVerilog(new Test(UInt(2.W), UInt(3.W), UInt(5.W))))
}

I realize that the Real/Ring type class defines the arithmetic only on the same type:

trait Ring[A] extends Any with spire.algebra.Ring[A] {
  def plusContext(f:   A, g: A): A
  def minusContext(f:  A, g: A): A
  def timesContext(f:  A, g: A): A
  def negateContext(f: A): A
}

however, Chisel does support multiplication with both UInt and SInt, and obviously at the hardware level this should work as well.

So is it possible to use dpstools (or extend it) to support dsp operations between different types?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions