aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/PrimOps.scala
blob: 0da0e01e6b5be0f7563fb1e932492f270c274ad1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package firrtl

import com.typesafe.scalalogging.LazyLogging

import Utils._
import DebugUtils._

object PrimOps extends LazyLogging {

  private val mapPrimOp2String = Map[PrimOp, String](
    AddOp -> "add",
    SubOp -> "sub",
    MulOp -> "mul",
    DivOp -> "div",
    RemOp -> "rem",
    LessOp -> "lt",
    LessEqOp -> "leq",
    GreaterOp -> "gt",
    GreaterEqOp -> "geq",
    EqualOp -> "eq",
    NEqualOp -> "neq",
    PadOp -> "pad",
    AsUIntOp -> "asUInt",
    AsSIntOp -> "asSInt",
    AsClockOp -> "asClock",
    ShiftLeftOp -> "shl",
    ShiftRightOp -> "shr",
    DynShiftLeftOp -> "dshl",
    DynShiftRightOp -> "dshr",
    ConvertOp -> "cvt",
    NegOp -> "neg",
    BitNotOp -> "not",
    BitAndOp -> "and",
    BitOrOp -> "or",
    BitXorOp -> "xor",
    BitAndReduceOp -> "andr",
    BitOrReduceOp -> "orr",
    BitXorReduceOp -> "xorr",
    ConcatOp -> "cat",
    BitsSelectOp -> "bits",
    HeadOp -> "head",
    TailOp -> "tail"
  )
  private val mapString2PrimOp = mapPrimOp2String.map(_.swap)
  def fromString(op: String): PrimOp = mapString2PrimOp(op)

  implicit class PrimOpImplicits(op: PrimOp){
    def getString(): String = mapPrimOp2String(op)
  }

  // Borrowed from Stanza implementation
  def lowerAndTypePrimOp(e: DoPrim): DoPrim = {
    def uAnd(op1: Expression, op2: Expression): Type = {
      (op1.getType, op2.getType) match {
        case (t1: UIntType, t2: UIntType) => UIntType(UnknownWidth)
        case (t1: SIntType, t2) => SIntType(UnknownWidth)
        case (t1, t2: SIntType) => SIntType(UnknownWidth)
        case _ => UnknownType
      }
    }
    def ofType(op: Expression): Type = {
      op.getType match {
        case t: UIntType => UIntType(UnknownWidth)
        case t: SIntType => SIntType(UnknownWidth)
        case _ => UnknownType
      }
    }

    logger.debug(s"lowerAndTypePrimOp on ${e.op.getClass.getSimpleName}")
    // TODO fix this
    val tpe = UIntType(UnknownWidth)
    //val tpe = e.op match {
    //  case Add => uAnd(e.args(0), e.args(1))
    //  case Sub => SIntType(UnknownWidth)
    //  case Addw => uAnd(e.args(0), e.args(1))
    //  case Subw => uAnd(e.args(0), e.args(1))
    //  case Mul => uAnd(e.args(0), e.args(1))
    //  case Div => uAnd(e.args(0), e.args(1))
    //  case Mod => ofType(e.args(0))
    //  case Quo => uAnd(e.args(0), e.args(1))
    //  case Rem => ofType(e.args(1))
    //  case Lt => UIntType(UnknownWidth)
    //  case Leq => UIntType(UnknownWidth)
    //  case Gt => UIntType(UnknownWidth)
    //  case Geq => UIntType(UnknownWidth)
    //  case Eq => UIntType(UnknownWidth)
    //  case Neq => UIntType(UnknownWidth)
    //  case Eqv => UIntType(UnknownWidth)
    //  case Neqv => UIntType(UnknownWidth)
    //  case Mux => ofType(e.args(1))
    //  case Pad => ofType(e.args(0))
    //  case AsUInt => UIntType(UnknownWidth)
    //  case AsSInt => SIntType(UnknownWidth)
    //  case Shl => ofType(e.args(0))
    //  case Shr => ofType(e.args(0))
    //  case Dshl => ofType(e.args(0))
    //  case Dshr => ofType(e.args(0))
    //  case Cvt => SIntType(UnknownWidth)
    //  case Neg => SIntType(UnknownWidth)
    //  case Not => ofType(e.args(0))
    //  case And => ofType(e.args(0))
    //  case Or => ofType(e.args(0))
    //  case Xor => ofType(e.args(0))
    //  case Andr => UIntType(UnknownWidth)
    //  case Orr => UIntType(UnknownWidth)
    //  case Xorr => UIntType(UnknownWidth)
    //  case Cat => UIntType(UnknownWidth)
    //  case Bit => UIntType(UnknownWidth)
    //  case Bits => UIntType(UnknownWidth)
    //  case _ => ???
    //}
    DoPrim(e.op, e.args, e.consts, tpe)
  }

}