@@ -2,6 +2,7 @@ package dfhdl.core
2
2
import dfhdl .compiler .ir .DFVal .Modifier as IRModifier
3
3
import dfhdl .internals .*
4
4
5
+ // A: Access, C: Connectivity, I: Initialization, P: Parameteric (Const or not)
5
6
sealed class Modifier [+ A , + C , + I , + P ](val value : IRModifier ):
6
7
override def toString : String = value.toString
7
8
@@ -14,10 +15,13 @@ object Modifier:
14
15
sealed trait Initializable
15
16
sealed trait Initialized
16
17
sealed trait Port
18
+ sealed trait PortIN extends Port
19
+ sealed trait PortOUT extends Port , Assignable
20
+ sealed trait PortINOUT extends PortIN , PortOUT
17
21
type Mutable = Modifier [Assignable , Any , Any , dfhdl.core.NOTCONST ]
18
22
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 ]
21
25
type DclSHARED = Modifier [AssignableSHARED , Any , Initializable , dfhdl.core.NOTCONST ]
22
26
protected type RTDomainOnly [A ] = AssertGiven [
23
27
A <:< DomainType .RT ,
@@ -32,11 +36,11 @@ object Modifier:
32
36
inline def REG (using dt : DomainType )(using RTDomainOnly [dt.type ]) = pREG
33
37
protected object pSHARED extends DclSHARED (IRModifier (IRModifier .VAR , IRModifier .SHARED ))
34
38
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 ))
38
42
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 ))
40
44
type CONST = Modifier [Any , Any , Any , dfhdl.core.CONST ]
41
45
extension (modifier : ModifierAny ) def asIR : IRModifier = modifier.value
42
46
end Modifier
0 commit comments