Skip to content

Commit 40ffaf4

Browse files
author
Oron Port
committed
move the port modifier indication to the A part
1 parent 539a063 commit 40ffaf4

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

core/src/main/scala/dfhdl/core/Modifier.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dfhdl.core
22
import dfhdl.compiler.ir.DFVal.Modifier as IRModifier
33
import dfhdl.internals.*
44

5+
//A: Access, C: Connectivity, I: Initialization, P: Parameteric (Const or not)
56
sealed class Modifier[+A, +C, +I, +P](val value: IRModifier):
67
override def toString: String = value.toString
78

@@ -14,10 +15,13 @@ object Modifier:
1415
sealed trait Initializable
1516
sealed trait Initialized
1617
sealed trait Port
18+
sealed trait PortIN extends Port
19+
sealed trait PortOUT extends Port, Assignable
20+
sealed trait PortINOUT extends PortIN, PortOUT
1721
type Mutable = Modifier[Assignable, Any, Any, dfhdl.core.NOTCONST]
1822
type Dcl = Modifier[Assignable, Connectable, Initializable, dfhdl.core.NOTCONST]
19-
type DclPort[+A] = Modifier[A, Port & Connectable, Initializable, dfhdl.core.NOTCONST]
20-
type DclREG[+C] = Modifier[AssignableREG, C, Initializable, dfhdl.core.NOTCONST]
23+
type DclPort[+A] = Modifier[A, Connectable, Initializable, dfhdl.core.NOTCONST]
24+
type DclREG[+A] = Modifier[AssignableREG & A, Connectable, Initializable, dfhdl.core.NOTCONST]
2125
type DclSHARED = Modifier[AssignableSHARED, Any, Initializable, dfhdl.core.NOTCONST]
2226
protected type RTDomainOnly[A] = AssertGiven[
2327
A <:< DomainType.RT,
@@ -32,11 +36,11 @@ object Modifier:
3236
inline def REG(using dt: DomainType)(using RTDomainOnly[dt.type]) = pREG
3337
protected object pSHARED extends DclSHARED(IRModifier(IRModifier.VAR, IRModifier.SHARED))
3438
inline def SHARED(using dt: DomainType)(using EDDomainOnly[dt.type]) = pSHARED
35-
object IN extends DclPort[Any](IRModifier(IRModifier.IN, IRModifier.Ordinary))
36-
object OUT extends DclPort[Assignable](IRModifier(IRModifier.OUT, IRModifier.Ordinary)):
37-
protected object pREG extends DclREG[Port](IRModifier(IRModifier.OUT, IRModifier.REG))
39+
object IN extends DclPort[PortIN](IRModifier(IRModifier.IN, IRModifier.Ordinary))
40+
object OUT extends DclPort[PortOUT](IRModifier(IRModifier.OUT, IRModifier.Ordinary)):
41+
protected object pREG extends DclREG[PortOUT](IRModifier(IRModifier.OUT, IRModifier.REG))
3842
inline def REG(using dt: DomainType)(using RTDomainOnly[dt.type]) = pREG
39-
object INOUT extends Dcl(IRModifier(IRModifier.INOUT, IRModifier.Ordinary))
43+
object INOUT extends DclPort[PortINOUT](IRModifier(IRModifier.INOUT, IRModifier.Ordinary))
4044
type CONST = Modifier[Any, Any, Any, dfhdl.core.CONST]
4145
extension (modifier: ModifierAny) def asIR: IRModifier = modifier.value
4246
end Modifier

plugin/src/main/scala/plugin/TopAnnotPhase.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ class TopAnnotPhase(setting: Setting) extends CommonPhase:
119119
def portCond(tpe: Type): Boolean =
120120
if (tpe.typeSymbol == dfValSym)
121121
tpe match
122-
// DFVal[_, Modifier[_, Port, _, _]]
123-
case AppliedType(_, _ :: AppliedType(_, _ :: c :: _) :: Nil) =>
124-
c <:< portModTpe
122+
// DFVal[_, Modifier[Port, _, _, _]]
123+
case AppliedType(_, _ :: AppliedType(_, a :: _) :: Nil) =>
124+
a <:< portModTpe
125125
case _ => false
126126
else false
127127
val hasPorts = Literal(Constant(clsSym.hasNestedMemberCond(portCond)))

0 commit comments

Comments
 (0)