115 lines
2.7 KiB
Plaintext
115 lines
2.7 KiB
Plaintext
-------------------------- MODULE denom_record2 ----------------------------
|
|
|
|
(**
|
|
The implementation of denomination traces that allows one- or two-step sequences
|
|
Represented via records
|
|
*)
|
|
|
|
EXTENDS identifiers
|
|
|
|
CONSTANT
|
|
Denoms
|
|
|
|
MaxDenomLength == 5
|
|
|
|
DenomPrefixes == [
|
|
port: Identifiers,
|
|
channel: Identifiers
|
|
]
|
|
|
|
NullDenomPrefix == [
|
|
port |-> NullId,
|
|
channel |-> NullId
|
|
]
|
|
|
|
MakeDenomPrefix(port, channel) == [
|
|
port |-> port,
|
|
channel |-> channel
|
|
]
|
|
|
|
IsValidDenomPrefix(prefix) ==
|
|
/\ prefix.port /= NullId
|
|
/\ prefix.channel /= NullId
|
|
|
|
DenomTraces == [
|
|
prefix1: DenomPrefixes, \* the most recent prefix
|
|
prefix0: DenomPrefixes, \* the deepest prefix
|
|
denom: Denoms
|
|
]
|
|
|
|
NullDenomTrace == [
|
|
prefix1 |-> NullDenomPrefix,
|
|
prefix0 |-> NullDenomPrefix,
|
|
denom |-> NullId
|
|
]
|
|
|
|
|
|
TraceLen(trace) ==
|
|
IF trace.prefix0 = NullDenomPrefix
|
|
THEN 1
|
|
ELSE IF trace.prefix1 = NullDenomPrefix
|
|
THEN 3
|
|
ELSE 5
|
|
|
|
LatestPrefix(trace) ==
|
|
IF trace.prefix0 = NullDenomPrefix
|
|
THEN NullDenomPrefix
|
|
ELSE IF trace.prefix1 = NullDenomPrefix
|
|
THEN trace.prefix0
|
|
ELSE trace.prefix1
|
|
|
|
|
|
ExtendDenomTrace(port, channel, trace) ==
|
|
IF trace.prefix0 = NullDenomPrefix
|
|
THEN [
|
|
prefix1 |-> NullDenomPrefix,
|
|
prefix0 |-> MakeDenomPrefix(port, channel),
|
|
denom |-> trace.denom
|
|
]
|
|
ELSE IF trace.prefix1 = NullDenomPrefix
|
|
THEN [
|
|
prefix1 |-> MakeDenomPrefix(port, channel),
|
|
prefix0 |-> trace.prefix0,
|
|
denom |-> trace.denom
|
|
]
|
|
ELSE NullDenomTrace \* can extend only for two steps
|
|
|
|
ReduceDenomTrace(trace) ==
|
|
IF trace.prefix1 /= NullDenomPrefix
|
|
THEN [
|
|
prefix1 |-> NullDenomPrefix,
|
|
prefix0 |-> trace.prefix0,
|
|
denom |-> trace.denom
|
|
]
|
|
ELSE IF trace.prefix0 /= NullDenomPrefix
|
|
THEN [
|
|
prefix1 |-> NullDenomPrefix,
|
|
prefix0 |-> NullDenomPrefix,
|
|
denom |-> trace.denom
|
|
]
|
|
ELSE NullDenomTrace \* cannot reduce further
|
|
|
|
GetPort(trace) == LatestPrefix(trace).port
|
|
GetChannel(trace) == LatestPrefix(trace).channel
|
|
GetDenom(trace) == trace.denom
|
|
|
|
IsValidDenomTrace(trace) ==
|
|
/\ GetDenom(trace) /= NullId
|
|
/\ IF IsValidDenomPrefix(trace.prefix1)
|
|
THEN IsValidDenomPrefix(trace.prefix0)
|
|
ELSE
|
|
/\ trace.prefix1 = NullDenomPrefix
|
|
/\ (IsValidDenomPrefix(trace.prefix0) \/ trace.prefix0 = NullDenomPrefix)
|
|
|
|
IsNativeDenomTrace(trace) == LatestPrefix(trace) = NullDenomPrefix /\ GetDenom(trace) /= NullId
|
|
IsPrefixedDenomTrace(trace) == LatestPrefix(trace) /= NullDenomPrefix /\ GetDenom(trace) /= NullId
|
|
|
|
DENOM == INSTANCE denom
|
|
DenomTypeOK == DENOM!DenomTypeOK
|
|
|
|
|
|
=============================================================================
|
|
\* Modification History
|
|
\* Last modified Fri Dec 04 10:38:10 CET 2020 by andrey
|
|
\* Created Fri Dec 04 10:22:10 CET 2020 by andrey
|