Skip to content

Commit f54b94e

Browse files
author
Oron Port
committed
connected resource projection
1 parent e6f002e commit f54b94e

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

core/src/main/scala/dfhdl/platforms/resources/Resource.scala

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,28 @@
11
package dfhdl.platforms.resources
22
import scala.annotation.implicitNotFound
3-
import scala.collection.mutable.ListBuffer
3+
import scala.collection.mutable
4+
import dfhdl.compiler.ir.constraints.SigConstraint
45

56
trait Resource extends ResourceContext:
6-
private val owner: ResourceOwner = dfc.mutableDB.ResourceOwnershipContext.owner
7-
private val connections = ListBuffer[Resource]()
7+
private val connections = mutable.ListBuffer[Resource]()
88
protected[resources] def connect(that: Resource): Unit =
99
connections += that
10+
private lazy val allConnections: List[Resource] =
11+
val visited = mutable.Set[Resource]()
12+
val result = mutable.ListBuffer[Resource]()
13+
def dfs(res: Resource): Unit =
14+
for (conn <- res.connections)
15+
if (!visited.contains(conn))
16+
visited += conn
17+
result += conn
18+
dfs(conn)
19+
dfs(this)
20+
result.distinct.toList
21+
end allConnections
22+
lazy val allSigConstraints: List[SigConstraint] =
23+
allConnections.flatMap(_.directAndOwnerSigConstraints).distinct
1024
owner.addResource(this)
25+
end Resource
1126

1227
private trait ResourceLP:
1328
import Resource.CanConnect

core/src/main/scala/dfhdl/platforms/resources/ResourceContext.scala

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,32 @@ package dfhdl.platforms.resources
22
import dfhdl.internals.*
33
import dfhdl.core.*
44
import scala.annotation.Annotation
5-
import dfhdl.compiler.ir.constraints.Constraint
5+
import dfhdl.compiler.ir.constraints.{Constraint, SigConstraint}
66
import scala.collection.mutable.ListBuffer
77

88
trait ResourceContext extends OnCreateEvents, HasDFC, HasClsMetaArgs:
99
final lazy val dfc: DFC = __dfc
1010
final lazy val id: String = dfc.nameOpt.get
11-
private var resourceConstraints = ListBuffer[Constraint]()
12-
def getResourceConstraints: List[Constraint] =
13-
resourceConstraints.toList ++ dfc.annotations.collect {
14-
case constraint: Constraint => constraint
15-
}
11+
// the top-level resource owner is set to be itself
12+
private[resources] val owner: ResourceOwner =
13+
dfc.mutableDB.ResourceOwnershipContext.ownerOpt.getOrElse(this.asInstanceOf[ResourceOwner])
14+
private[resources] val isTopResource: Boolean =
15+
dfc.mutableDB.ResourceOwnershipContext.ownerOpt.isEmpty
16+
private var resourceConstraints = ListBuffer.from(dfc.annotations.collect {
17+
case constraint: Constraint => constraint
18+
})
19+
def getResourceConstraints: List[Constraint] = resourceConstraints.toList
20+
// the constraints that are directly applied to this resource and its owners
21+
private[resources] lazy val directAndOwnerSigConstraints: List[SigConstraint] =
22+
val ownerConstraints = if (isTopResource) Nil else owner.directAndOwnerSigConstraints
23+
(ownerConstraints ++ getResourceConstraints.collect {
24+
case constraint: SigConstraint => constraint
25+
}).distinct
1626
protected def __dfc: DFC =
1727
println("Severe error: missing DFHDL context!\nMake sure you enable the DFHDL compiler plugin.")
1828
sys.exit(1)
29+
protected def injectConstraint(constraint: Constraint): Unit =
30+
resourceConstraints += constraint
1931
protected def setClsNamePos(
2032
name: String,
2133
position: Position,

0 commit comments

Comments
 (0)