diff options
Diffstat (limited to 'src/main/scala/firrtl/IR.scala')
| -rw-r--r-- | src/main/scala/firrtl/IR.scala | 149 |
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 |
