Skip to content
This repository was archived by the owner on Jun 16, 2024. It is now read-only.

Commit 70f421b

Browse files
committed
refactor connectors.
1 parent 16074b9 commit 70f421b

File tree

9 files changed

+53
-27
lines changed

9 files changed

+53
-27
lines changed

src/main/scala/ee/hrzn/chryse/platform/ecp5/ECP5Top.scala

+1-3
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ object ECP5Top {
3030
def apply[Top <: Module](
3131
platform: BoardPlatform[_ <: BoardResources],
3232
genTop: => Top,
33-
) = {
34-
platform.resources.setNames() // XXX: refactor setNames call
33+
) =
3534
new ECP5Top(platform, genTop)
36-
}
3735
}

src/main/scala/ee/hrzn/chryse/platform/ice40/ICE40Top.scala

-10
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,3 @@ class ICE40Top[Top <: Module](
8989

9090
lastPCF = Some(PCF(ios.to(Map), freqs.to(Map)))
9191
}
92-
93-
object ICE40Top {
94-
def apply[Top <: Module](
95-
platform: BoardPlatform[_ <: BoardResources],
96-
genTop: => Top,
97-
) = {
98-
platform.resources.setNames() // XXX refactor setNames call
99-
new ICE40Top(platform, genTop)
100-
}
101-
}

src/main/scala/ee/hrzn/chryse/platform/ice40/IceBreakerPlatform.scala

+15-10
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ final case class IceBreakerPlatform(ubtnReset: Boolean = false)
1919

2020
val resources = new IceBreakerResources
2121

22-
override def apply[Top <: Module](genTop: Platform => Top) =
23-
ICE40Top(this, genTop(this))
22+
override def apply[Top <: Module](genTop: Platform => Top) = {
23+
resources.setNames()
24+
new ICE40Top(this, genTop(this))
25+
}
2426
}
2527

2628
class IceBreakerResources extends BoardResources {
@@ -33,14 +35,17 @@ class IceBreakerResources extends BoardResources {
3335
val ledg = resource.LED().inverted.onPin(37)
3436
val ledr = resource.LED().inverted.onPin(11)
3537

36-
val pmod1a1 = resource.InOut().onPin(4)
37-
val pmod1a2 = resource.InOut().onPin(2)
38-
val pmod1a3 = resource.InOut().onPin(47)
39-
val pmod1a4 = resource.InOut().onPin(45)
40-
val pmod1a7 = resource.InOut().onPin(3)
41-
val pmod1a8 = resource.InOut().onPin(48)
42-
val pmod1a9 = resource.InOut().onPin(46)
43-
val pmod1a10 = resource.InOut().onPin(44)
38+
val pmod1a = resource.Connector(
39+
resource.InOut(),
40+
1 -> 4,
41+
2 -> 2,
42+
3 -> 47,
43+
4 -> 45,
44+
7 -> 3,
45+
8 -> 48,
46+
9 -> 46,
47+
10 -> 44,
48+
)
4449

4550
val pmod1b1 = resource.InOut().onPin(43)
4651
val pmod1b2 = resource.InOut().onPin(38)

src/main/scala/ee/hrzn/chryse/platform/resource/Base.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ee.hrzn.chryse.platform.resource
22

33
import chisel3._
44

5-
abstract class Base[HW <: Data](gen: => HW) extends Resource {
5+
abstract class Base[HW <: Data](gen: => HW) extends SinglePinResource {
66
final private[chryse] var pinId: Option[Pin] = None
77
final var name: Option[String] = None
88

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package ee.hrzn.chryse.platform.resource
2+
3+
import chisel3._
4+
5+
class Connector[E <: SinglePinResource](
6+
gen: => E,
7+
private val ixToPin: (Int, Pin)*,
8+
) extends Resource {
9+
private val mappings: Map[Int, E] = ixToPin
10+
.map { case (i, p) =>
11+
i -> gen.onPin(p)
12+
}
13+
.to(Map)
14+
15+
def apply(ix: Int): E = mappings(ix)
16+
17+
def setName(name: String): Unit =
18+
mappings.foreach { case (i, e) => e.setName(s"$name$i") }
19+
20+
def bases(): Seq[Base[_ <: Data]] = mappings.flatMap(_._2.bases()).toSeq
21+
}
22+
23+
object Connector {
24+
def apply[E <: SinglePinResource](gen: => E, ixToPin: (Int, Pin)*) =
25+
new Connector(gen, ixToPin: _*)
26+
}

src/main/scala/ee/hrzn/chryse/platform/resource/InOut.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ee.hrzn.chryse.platform.resource
22

33
import chisel3._
44

5-
class InOut extends Resource {
5+
class InOut extends Resource with SinglePinResource {
66
val i = new Base[Bool](Input(Bool())) {}
77
val o = new Base[Bool](Output(Bool())) {}
88

src/main/scala/ee/hrzn/chryse/platform/resource/Resource.scala

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import ee.hrzn.chryse.platform.BoardResources
55

66
import scala.collection.mutable.ArrayBuffer
77

8+
// XXX: This is more of a resource holder/container.
9+
// It's one or possibly many (or no?) resources. Hrm.
810
trait Resource {
911
def setName(name: String): Unit
1012
def bases(): Seq[Base[_ <: Data]]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package ee.hrzn.chryse.platform.resource
2+
3+
trait SinglePinResource extends Resource {
4+
def onPin(id: Pin): this.type
5+
}

src/test/scala/ee/hrzn/chryse/platform/BoardResourcesSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ class InversionTop(platform: Platform) extends Module {
130130
class InOutTop(platform: Platform) extends Module {
131131
val plat = platform.asInstanceOf[IceBreakerPlatform]
132132
// Treat pmod1a1 as output, 1a2 as input.
133-
plat.resources.pmod1a1.o := plat.resources.uart.rx
134-
plat.resources.uart.tx := plat.resources.pmod1a2.i
133+
plat.resources.pmod1a(1).o := plat.resources.uart.rx
134+
plat.resources.uart.tx := plat.resources.pmod1a(2).i
135135

136136
// Do the same with 1b1 and 1b2, but use inverted inputs/outputs.
137137
plat.resources.pmod1b1.o := plat.resources.ubtn

0 commit comments

Comments
 (0)