aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/IR.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/IR.scala')
-rw-r--r--src/main/scala/firrtl/IR.scala149
1 files changed, 66 insertions, 83 deletions
diff --git a/src/main/scala/firrtl/IR.scala b/src/main/scala/firrtl/IR.scala
index e7356abc..858f48cf 100644
--- a/src/main/scala/firrtl/IR.scala
+++ b/src/main/scala/firrtl/IR.scala
@@ -1,9 +1,4 @@
-/* TODO
- * - Should Info be a FIRRTL node?
- *
- */
-
package firrtl
import scala.collection.Seq
@@ -21,102 +16,90 @@ case class FileInfo(file: String, line: Int, column: Int) extends Info {
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 PrimOp extends AST
+case object AddOp extends PrimOp
+case object SubOp extends PrimOp
+case object MulOp extends PrimOp
+case object DivOp extends PrimOp
+case object RemOp extends PrimOp
+case object LessOp extends PrimOp
+case object LessEqOp extends PrimOp
+case object GreaterOp extends PrimOp
+case object GreaterEqOp extends PrimOp
+case object EqualOp extends PrimOp
+case object NEqualOp extends PrimOp
+case object PadOp extends PrimOp
+case object AsUIntOp extends PrimOp
+case object AsSIntOp extends PrimOp
+case object AsClockOp extends PrimOp
+case object ShiftLeftOp extends PrimOp
+case object ShiftRightOp extends PrimOp
+case object DynShiftLeftOp extends PrimOp
+case object DynShiftRightOp extends PrimOp
+case object ConvertOp extends PrimOp
+case object NegOp extends PrimOp
+case object BitNotOp extends PrimOp
+case object BitAndOp extends PrimOp
+case object BitOrOp extends PrimOp
+case object BitXorOp extends PrimOp
+case object BitAndReduceOp extends PrimOp
+case object BitOrReduceOp extends PrimOp
+case object BitXorReduceOp extends PrimOp
+case object ConcatOp extends PrimOp
+case object BitsSelectOp extends PrimOp
+case object HeadOp extends PrimOp
+case object TailOp extends PrimOp
+
+trait Expression extends AST
+case class Ref(name: String, tpe: Type) extends Expression
+case class SubField(exp: Expression, name: String, tpe: Type) extends Expression
+case class SubIndex(exp: Expression, value: BigInt, tpe: Type) extends Expression
+case class SubAccess(exp: Expression, index: Expression, tpe: Type) extends Expression
+case class Mux(cond: Expression, tval: Expression, fval: Expression, tpe: Type) extends Expression
+case class ValidIf(cond: Expression, value: Expression, tpe: Type) extends Expression
+case class UIntValue(value: BigInt, width: Width) extends Expression
+case class SIntValue(value: BigInt, width: Width) extends Expression
+case class DoPrim(op: PrimOp, args: Seq[Expression], consts: Seq[BigInt], tpe: Type) extends Expression
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
+case class DefRegister(info: Info, name: String, tpe: Type, clock: Expression, reset: Expression, init: Expression) extends Stmt
+case class DefInstance(info: Info, name: String, module: String) extends Stmt
+case class DefMemory(info: Info, name: String, dataType: Type, depth: Int, writeLatency: Int,
+ readLatency: Int, readers: Seq[String], writers: Seq[String], readwriters: Seq[String]) extends Stmt
+case class DefNode(info: Info, name: String, value: Expression) extends Stmt
+case class Conditionally(info: Info, pred: Expression, conseq: Stmt, alt: Stmt) extends Stmt
+case class Begin(stmts: Seq[Stmt]) extends Stmt
+case class BulkConnect(info: Info, loc: Expression, exp: Expression) extends Stmt
+case class Connect(info: Info, loc: Expression, exp: Expression) extends Stmt
+case class IsInvalid(info: Info, exp: Expression) extends Stmt
+case class Stop(info: Info, ret: Int, clk: Expression, en: Expression) extends Stmt
+case class Print(info: Info, string: String, args: Seq[Expression], clk: Expression, en: Expression) extends Stmt
+case object Empty extends Stmt
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
+trait Flip extends AST
+case object Default extends Flip
+case object Reverse extends Flip
-case class Field(name: String, dir: FieldDir, tpe: Type) extends AST
+case class Field(name: String, flip: Flip, 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 ClockType extends Type
case object UnknownType extends Type
-trait PortDir extends AST
-case object Input extends PortDir
-case object Output extends PortDir
+trait Direction extends AST
+case object Input extends Direction
+case object Output extends Direction
-case class Port(info: Info, name: String, dir: PortDir, tpe: Type) extends AST
+case class Port(info: Info, name: String, dir: Direction, tpe: Type) extends AST
case class Module(info: Info, name: String, ports: Seq[Port], stmt: Stmt) extends AST