Skip to content

Commit 9dce32d

Browse files
author
Oron Port
committed
refactor: Simplify ExplicitCondExprAssign stage implementation by fixing patch mechanism's ReplacementContext
1 parent 79793df commit 9dce32d

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

compiler/stages/src/main/scala/dfhdl/compiler/stages/ExplicitCondExprAssign.scala

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,23 @@ case object ExplicitCondExprAssign extends Stage:
1313
def nullifies: Set[Stage] = Set(DropUnreferencedAnons)
1414

1515
def transform(designDB: DB)(using MemberGetSet, CompilerOptions): DB =
16-
var headers = List.empty[DFConditional.Header]
1716
extension (ch: DFConditional.Header)
1817
// recursive call to patch conditional block chains
1918
private def patchChains(headerVar: DFVal, op: DFNet.Op): List[(DFMember, Patch)] =
2019
// changing type of header to unit, since the expression is now a statement
21-
headers = ch :: headers
20+
val headerPatch = ch -> Patch.Replace(
21+
ch.updateDFType(DFUnit),
22+
Patch.Replace.Config.FullReplacement
23+
)
2224
val cbChain = getSet.designDB.conditionalChainTable(ch)
2325
val lastMembers = cbChain.map(_.members(MemberView.Folded).last)
24-
lastMembers.flatMap {
26+
headerPatch :: lastMembers.flatMap {
2527
case ident @ Ident(underlying: DFConditional.Header) =>
2628
ident -> Patch.Remove() :: underlying.patchChains(headerVar, op)
2729
case ident @ Ident(underlying) =>
2830
val assignDsn = new MetaDesign(
2931
ident,
30-
Patch.Add.Config.After
32+
Patch.Add.Config.ReplaceWithLast(Patch.Replace.Config.FullReplacement)
3133
):
3234
(op: @unchecked) match
3335
case DFNet.Op.Assignment =>
@@ -39,7 +41,7 @@ case object ExplicitCondExprAssign extends Stage:
3941
headerVar.asVarAny.nbassign(underlying.asValAny)(using
4042
dfc.setMetaAnon(ident.meta.position)
4143
)
42-
ident -> Patch.Remove() :: assignDsn.patch :: Nil
44+
Some(assignDsn.patch)
4345
case _ => ??? // not possible
4446
}
4547
end patchChains
@@ -51,7 +53,7 @@ case object ExplicitCondExprAssign extends Stage:
5153
val removeNetPatch = net -> Patch.Remove()
5254
removeNetPatch :: ch.patchChains(headerVar, op)
5355
end extension
54-
val patchList1 = designDB.members.view
56+
val patchList = designDB.members.view
5557
// collect all the assignments from anonymous conditionals
5658
.flatMap {
5759
case net @ DFNet.Assignment(toVal, header: DFConditional.Header) if header.isAnonymous =>
@@ -61,15 +63,7 @@ case object ExplicitCondExprAssign extends Stage:
6163
header.patchChainsNet(toVal, net, DFNet.Op.Assignment)
6264
case _ => Nil
6365
}.toList
64-
val patchList2 = headers.map { h =>
65-
h -> Patch.Replace(
66-
h.updateDFType(DFUnit),
67-
Patch.Replace.Config.FullReplacement
68-
)
69-
}
70-
designDB
71-
.patch(patchList1)
72-
.patch(patchList2)
66+
designDB.patch(patchList)
7367
end transform
7468
end ExplicitCondExprAssign
7569

core/src/main/scala/dfhdl/compiler/patching/ReplacementContext.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,19 @@ private final case class ReplacementContext(
106106
// * refs from origMember - references from this member to other members
107107
// Together these cover both directions of two-way references
108108
val purgedRefs =
109-
memberTable.getOrElse(origMember, Set()) ++ origMember.getRefs
109+
memberTable.getOrElse(origMember, Set()) ++ origMember.getRefs + origMember.ownerRef
110110
val (updatedTypeRefRepeats, purgedRefsWithoutRepeatedTypeRefs) =
111111
getUpdatedTypeRefCount(purgedRefs)
112+
val updatedMemberTable = purgedRefsWithoutRepeatedTypeRefs.foldLeft(memberTable) {
113+
case (mt, r) =>
114+
mt.updatedWith(r.get)(SomeRefs => Some(SomeRefs.get - r))
115+
}
112116
this.copy(
113117
refTable = this.refTable -- purgedRefsWithoutRepeatedTypeRefs,
118+
memberTable = updatedMemberTable,
114119
typeRefRepeats = updatedTypeRefRepeats
115120
)
121+
end removeMember
116122

117123
end ReplacementContext
118124

0 commit comments

Comments
 (0)