aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/IR.scala
blob: e7356abcfdc7ddc27d8beef67a5493e8cb116bbf (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
117
118
119
120
121
122
123
124
125
/* TODO
 *  - Should Info be a FIRRTL node?
 *
 */

package firrtl

import scala.collection.Seq

// Should this be defined elsewhere?
/*
Structure containing source locator information.
Member of most Stmt case classes.
*/
trait Info
case object NoInfo extends Info
case class FileInfo(file: String, line: Int, column: Int) extends Info {
  override def toString(): String = s"$file@$line.$column"
}

trait AST 

trait Primop extends AST
case object Add extends Primop 
case object Sub extends Primop
case object Addw extends Primop
case object Subw extends Primop
case object Mul extends Primop
case object Div extends Primop
case object Mod extends Primop
case object Quo extends Primop
case object Rem extends Primop
case object Lt extends Primop
case object Leq extends Primop
case object Gt extends Primop
case object Geq extends Primop
case object Eq extends Primop
case object Neq extends Primop
case object Eqv extends Primop
case object Neqv extends Primop
case object Mux extends Primop
case object Pad extends Primop
case object AsUInt extends Primop
case object AsSInt extends Primop
case object Shl extends Primop
case object Shr extends Primop
case object Dshl extends Primop
case object Dshr extends Primop
case object Cvt extends Primop
case object Neg extends Primop
case object Not extends Primop
case object And extends Primop
case object Or extends Primop
case object Xor extends Primop
case object Andr extends Primop
case object Orr extends Primop
case object Xorr extends Primop
case object Cat extends Primop
case object Bit extends Primop
case object Bits extends Primop

// TODO stanza ir has types on many of these, why? Is it the type of what we're referencing?
// Add types, default to UNKNOWN
// TODO add type
trait Exp extends AST
case class UIntValue(value: BigInt, width: Width) extends Exp
case class SIntValue(value: BigInt, width: Width) extends Exp
case class Ref(name: String, tpe: Type) extends Exp
case class Subfield(exp: Exp, name: String, tpe: Type) extends Exp
case class Index(exp: Exp, value: BigInt, tpe: Type) extends Exp  //SubIndex, add SubAccess
case class DoPrimop(op: Primop, args: Seq[Exp], consts: Seq[BigInt], tpe: Type) extends Exp 

// THIS GOES BYE BYE
trait AccessorDir extends AST
case object Infer extends AccessorDir
case object Read extends AccessorDir
case object Write extends AccessorDir
case object RdWr extends AccessorDir

trait Stmt extends AST
case class DefWire(info: Info, name: String, tpe: Type) extends Stmt
case class DefReg(info: Info, name: String, tpe: Type, clock: Exp, reset: Exp) extends Stmt //Added init value
case class DefMemory(info: Info, name: String, seq: Boolean, tpe: Type, clock: Exp) extends Stmt //very different
case class DefInst(info: Info, name: String, module: Exp) extends Stmt 
case class DefNode(info: Info, name: String, value: Exp) extends Stmt
case class DefPoison(info: Info, name: String, tpe: Type) extends Stmt
case class DefAccessor(info: Info, name: String, dir: AccessorDir, source: Exp, index: Exp) extends Stmt //BYE BYE
case class OnReset(info: Info, lhs: Exp, rhs: Exp) extends Stmt //BYE BYE
case class Connect(info: Info, lhs: Exp, rhs: Exp) extends Stmt
case class BulkConnect(info: Info, lhs: Exp, rhs: Exp) extends Stmt
case class When(info: Info, pred: Exp, conseq: Stmt, alt: Stmt) extends Stmt
case class Assert(info: Info, pred: Exp) extends Stmt //Now Stop, with clk and enable and int, add Print
case class Block(stmts: Seq[Stmt]) extends Stmt
case object EmptyStmt extends Stmt //Now Empty

trait Width extends AST 
case class IntWidth(width: BigInt) extends Width 
case object UnknownWidth extends Width

trait FieldDir extends AST
case object Default extends FieldDir
case object Reverse extends FieldDir

case class Field(name: String, dir: FieldDir, tpe: Type) extends AST

trait Type extends AST
case class UIntType(width: Width) extends Type
case class SIntType(width: Width) extends Type
case object ClockType extends Type
case class BundleType(fields: Seq[Field]) extends Type
case class VectorType(tpe: Type, size: BigInt) extends Type
case object UnknownType extends Type

trait PortDir extends AST
case object Input extends PortDir
case object Output extends PortDir

case class Port(info: Info, name: String, dir: PortDir, tpe: Type) extends AST

case class Module(info: Info, name: String, ports: Seq[Port], stmt: Stmt) extends AST

case class Circuit(info: Info, name: String, modules: Seq[Module]) extends AST