Skip to content

Commit ce328a0

Browse files
author
Oron Port
committed
refactoring resources to automatically add unused pull up/down pins
1 parent a97ef17 commit ce328a0

File tree

16 files changed

+70
-31
lines changed

16 files changed

+70
-31
lines changed

compiler/ir/src/main/scala/dfhdl/compiler/ir/annotation.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ object constraints:
185185
slewRate: ConfigN[IO.SlewRate] = None,
186186
driveStrength: ConfigN[Int] = None,
187187
pullMode: ConfigN[IO.PullMode] = None,
188-
dualPurposeGroups: ConfigN[String] = None
188+
dualPurposeGroups: ConfigN[String] = None,
189+
unusedPullMode: ConfigN[IO.PullMode] = None
189190
) extends SigConstraint derives CanEqual, ReadWriter:
190191
protected def `prot_=~`(that: HWAnnotation)(using MemberGetSet): Boolean = this == that
191192
lazy val getRefs: List[DFRef.TwoWayAny] = Nil
@@ -202,7 +203,8 @@ object constraints:
202203
slewRate = slewRate.merge(that.slewRate),
203204
driveStrength = driveStrength.merge(that.driveStrength),
204205
pullMode = pullMode.merge(that.pullMode),
205-
dualPurposeGroups = dualPurposeGroups.merge(that.dualPurposeGroups)
206+
dualPurposeGroups = dualPurposeGroups.merge(that.dualPurposeGroups),
207+
unusedPullMode = unusedPullMode.merge(that.unusedPullMode)
206208
)
207209
)
208210
case _ => None
@@ -217,7 +219,8 @@ object constraints:
217219
csParam("slewRate", slewRate),
218220
csParam("driveStrength", driveStrength),
219221
csParam("pullMode", pullMode),
220-
csParam("dualPurposeGroups", dualPurposeGroups)
222+
csParam("dualPurposeGroups", dualPurposeGroups),
223+
csParam("unusedPullMode", unusedPullMode)
221224
).filter(_.nonEmpty).mkString(", ")
222225
s"""@io($params)"""
223226
end codeString

core/src/main/scala/dfhdl/core/DFEnum.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ object DFEncoding:
5151
final def encode(idx: Int): BigInt = bigIntValue
5252
end Manual
5353

54-
abstract class Toggle extends Default, ExplicitWidth[1]:
54+
abstract class Toggle extends Default, ExplicitWidth[1] derives CanEqual:
5555
val width: 1 = 1
5656

5757
end DFEncoding

core/src/main/scala/dfhdl/core/Design.scala

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,47 @@ trait Design extends Container, HasClsMetaArgs:
4242
private var hasStartedLate: Boolean = false
4343
final override def onCreateStartLate: Unit =
4444
hasStartedLate = true
45+
import dfc.getSet
46+
if (
47+
dfc.owner.asIR.getThisOrOwnerDesign.dclMeta.annotations.exists(
48+
_.isInstanceOf[ir.constraints.DeviceID]
49+
)
50+
)
51+
handleResourceConstraints()
4552
dfc.exitOwner()
4653
dfc.enterLate()
4754
private[dfhdl] def skipChecks: Boolean = false
4855

4956
def customTopChecks(): Unit = {}
57+
private def handleResourceConstraints(): Unit =
58+
import dfhdl.{<>, OUT, NOTHING}
59+
import ir.constraints.{IO, SigConstraint}
60+
import dfhdl.platforms.resources.*
61+
import dfhdl.platforms.devices.Pin
62+
def addUnusedPinPort(pinID: String, constraints: List[SigConstraint]): Unit =
63+
val port =
64+
DFBit.<>(OUT)(using dfc.setName(s"Pin_${pinID}_unused").setAnnotations(constraints))
65+
port <> NOTHING(DFBit)(using dfc.anonymize)
66+
val usedPinIDs: Set[String] =
67+
dfc.mutableDB.ResourceOwnershipContext
68+
.getConnectedResourceMap.values.flatten
69+
.flatMap(_._2.allSigConstraints)
70+
.collect { case IO(loc = pinID: String) => pinID }.toSet
71+
def addUnusedPinPorts(resourceOwner: ResourceOwner): Unit =
72+
resourceOwner.getChildren.foreach(addUnusedPinPorts)
73+
resourceOwner.getResources.foreach {
74+
case pin: Pin if (!usedPinIDs.contains(pin.id)) =>
75+
val hasUnusedPullMode = pin.allSigConstraints.exists {
76+
case IO(unusedPullMode = unusedPullMode: IO.PullMode) => true
77+
case _ => false
78+
}
79+
if (hasUnusedPullMode)
80+
addUnusedPinPort(pin.id, pin.allSigConstraints)
81+
case _ =>
82+
}
83+
dfc.mutableDB.ResourceOwnershipContext.getTopResourceOwners.foreach(addUnusedPinPorts)
84+
end handleResourceConstraints
85+
5086
final override def onCreateEnd(thisOwner: Option[This]): Unit =
5187
if (hasStartedLate)
5288
dfc.exitLate()

core/src/main/scala/dfhdl/core/MutableDB.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ final class MutableDB():
316316
private var topResourceOwners: List[ResourceOwner] = Nil
317317
private var stack: List[ResourceOwner] = Nil
318318
private val connectedResourceMap = mutable.Map.empty[DFVal.Dcl, List[(Range, Resource)]]
319+
def getConnectedResourceMap: Map[DFVal.Dcl, List[(Range, Resource)]] =
320+
connectedResourceMap.toMap
319321
def connectResource(dcl: DFVal.Dcl, range: Range, resource: Resource): Unit =
320322
connectedResourceMap.updateWith(dcl) {
321323
case Some(connections) => Some((range, resource) :: connections)

core/src/main/scala/dfhdl/hw/annotation.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ object constraints:
100100
slewRate: ir.ConfigN[io.SlewRate] = None,
101101
driveStrength: ir.ConfigN[Int] = None,
102102
pullMode: ir.ConfigN[io.PullMode] = None,
103-
dualPurposeGroups: ir.ConfigN[String] = None
103+
dualPurposeGroups: ir.ConfigN[String] = None,
104+
unusedPullMode: ir.ConfigN[io.PullMode] = None
104105
) extends SigConstraint:
105106
val asIR: ir.constraints.IO =
106107
ir.constraints.IO(
107-
bitIdx, loc, levelVolt, standard, slewRate, driveStrength, pullMode, dualPurposeGroups
108+
bitIdx, loc, levelVolt, standard, slewRate, driveStrength, pullMode, dualPurposeGroups,
109+
unusedPullMode
108110
)
109111
end io
110112
object io:
File renamed without changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dfhdl.platforms.devices
2+
import dfhdl.platforms.resources.*
3+
import Resource.CanConnect
4+
5+
abstract class Bank extends ResourceGroup:
6+
type This <: Bank
7+
protected given Bank: This = this.asInstanceOf[This]
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)