Skip to content

Commit 5f3baae

Browse files
author
Oron Port
committed
add 7seg resource
workaround scalac bug (not minimized)
1 parent 615250b commit 5f3baae

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

build.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ lazy val platforms = project
127127
libraryDependencies ++= commonDependencies
128128
)
129129
.dependsOn(
130+
core % "test->test",
130131
lib
131132
)
132133

internals/src/main/scala/dfhdl/internals/Exact.scala

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,32 @@ private def exactOp2Macro[Op, Ctx, OutUB](
294294
import quotes.reflect.*
295295
val lhsExactInfo = lhs.exactInfo
296296
val rhsExactInfo = rhs.exactInfo
297-
Expr.summonOrError[ExactOp2[
298-
Op,
299-
Ctx,
300-
OutUB,
301-
lhsExactInfo.Underlying,
302-
rhsExactInfo.Underlying
303-
]] match
297+
val exactOp2ExprOrError =
298+
try
299+
Expr.summonOrError[ExactOp2[
300+
Op,
301+
Ctx,
302+
OutUB,
303+
lhsExactInfo.Underlying,
304+
rhsExactInfo.Underlying
305+
]]
306+
catch
307+
// TODO: this is a workaround for a Scala compiler bug that is not minimized yet.
308+
// It throws an exception which somehow disappears when we widen the types and run show.
309+
// Regression test is in platforms/src/test/scala/PlatformSpec.scala
310+
case e: Throwable =>
311+
lhsExactInfo.exactTpe.widen.show
312+
rhsExactInfo.exactTpe.widen.show
313+
Expr.summonOrError[ExactOp2[
314+
Op,
315+
Ctx,
316+
OutUB,
317+
lhsExactInfo.Underlying,
318+
rhsExactInfo.Underlying
319+
]]
320+
end try
321+
end exactOp2ExprOrError
322+
exactOp2ExprOrError match
304323
case Right(expr) => '{
305324
$expr(${ lhsExactInfo.exactExpr }, ${ rhsExactInfo.exactExpr })(using $ctx)
306325
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dfhdl.platforms.resources
2+
import dfhdl.{DFC, Encoded}
3+
import dfhdl.hw.constraints.*
4+
import SevenSegDisplay.{Segment, Select}
5+
import dfhdl.compiler.ir.PhysicalNumber.Ops.us
6+
import dfhdl.compiler.ir.constraints.{IO, Timing}
7+
8+
class SevenSegDisplay[L <: Int & Singleton](
9+
val digits: L,
10+
val selectActiveState: Select,
11+
val segmentActiveState: Segment
12+
) extends ResourceGroup:
13+
val SELECT = IOBus.fill(digits)(Select(selectActiveState))
14+
val A = Segment(segmentActiveState)
15+
val B = Segment(segmentActiveState)
16+
val C = Segment(segmentActiveState)
17+
val D = Segment(segmentActiveState)
18+
val E = Segment(segmentActiveState)
19+
val F = Segment(segmentActiveState)
20+
val G = Segment(segmentActiveState)
21+
val DP = Segment(segmentActiveState)
22+
end SevenSegDisplay
23+
object SevenSegDisplay:
24+
enum Segment extends Encoded.Toggle:
25+
case Off, On
26+
object Segment:
27+
@io(standard = io.Standard.LVCMOS, slewRate = io.SlewRate.SLOW)
28+
@timing.ignore(maxFreqMinPeriod = 200.us)
29+
protected[SevenSegDisplay] class Resource private[Segment] (val activeState: Segment)
30+
extends ToggleIO[Segment]
31+
protected[SevenSegDisplay] def apply(activeState: Segment)(using DFC): Resource =
32+
new Resource(activeState)
33+
enum Select extends Encoded.Toggle:
34+
case Disabled, Enabled
35+
object Select:
36+
protected[SevenSegDisplay] class Resource private[Select] (val activeState: Select)
37+
extends ToggleIO[Select]:
38+
private val pullMode = if (activeState == Select.Enabled) IO.PullMode.DOWN else IO.PullMode.UP
39+
injectConstraint(IO(
40+
standard = IO.Standard.LVCMOS,
41+
slewRate = IO.SlewRate.SLOW,
42+
unusedPullMode = pullMode
43+
))
44+
injectConstraint(Timing.Ignore(maxFreqMinPeriod = 200.us))
45+
protected[SevenSegDisplay] def apply(activeState: Select)(using DFC): Resource =
46+
new Resource(activeState)
47+
end SevenSegDisplay

0 commit comments

Comments
 (0)