diff options
| author | Adam Izraelevitz | 2019-10-18 19:01:19 -0700 |
|---|---|---|
| committer | GitHub | 2019-10-18 19:01:19 -0700 |
| commit | fd981848c7d2a800a15f9acfbf33b57dd1c6225b (patch) | |
| tree | 3609a301cb0ec867deefea4a0d08425810b00418 /src/main/scala/firrtl/constraint/IsNeg.scala | |
| parent | 973ecf516c0ef2b222f2eb68dc8b514767db59af (diff) | |
Upstream intervals (#870)
Major features:
- Added Interval type, as well as PrimOps asInterval, clip, wrap, and sqz.
- Changed PrimOp names: bpset -> setp, bpshl -> incp, bpshr -> decp
- Refactored width/bound inferencer into a separate constraint solver
- Added transforms to infer, trim, and remove interval bounds
- Tests for said features
Plan to be released with 1.3
Diffstat (limited to 'src/main/scala/firrtl/constraint/IsNeg.scala')
| -rw-r--r-- | src/main/scala/firrtl/constraint/IsNeg.scala | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/constraint/IsNeg.scala b/src/main/scala/firrtl/constraint/IsNeg.scala new file mode 100644 index 00000000..46f739c6 --- /dev/null +++ b/src/main/scala/firrtl/constraint/IsNeg.scala @@ -0,0 +1,32 @@ +// See LICENSE for license details. + +package firrtl.constraint + +object IsNeg { + def apply(child: Constraint): Constraint = new IsNeg(child, 0).reduce() +} + +// Dummy arg is to get around weird Scala issue that can't differentiate between a +// private constructor and public apply that share the same arguments +case class IsNeg private (child: Constraint, dummyArg: Int) extends Constraint { + override def reduce(): Constraint = child match { + case k: IsKnown => k.neg + case x: IsAdd => IsAdd(x.children.map { b => IsNeg(b) }) + case x: IsMul => IsMul(Seq(IsNeg(x.children.head)) ++ x.children.tail) + case x: IsNeg => x.child + case x: IsPow => this + // -[max(a, b)] -> min[-a, -b] + case x: IsMax => IsMin(x.children.map { b => IsNeg(b) }) + case x: IsMin => IsMax(x.children.map { b => IsNeg(b) }) + case x: IsVar => this + case _ => this + } + + lazy val children = Vector(child) + + override def map(f: Constraint=>Constraint): Constraint = IsNeg(f(child)) + + override def serialize: String = "(-" + child.serialize + ")" +} + + |
