定义第一个event状态类型及参数为该状态类型的函数
问题描述:创建一个event状态类型,这个状态类型的值只能是Bot或Top,并编写一个函数判断event的状态是否为Top
代码:
-- 通过type生成一个状态类型event,这个event的值只能是Bot或Top
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
b = (e = Top) ;
tel
Simulat执行结果:
创建结点执行上述event相关的函数
问题描述:如果event的值为Top,则x的值为in的值, 如果event的值为Bot,则x当前时刻的值为false,以后时刻的值均为上一个时刻x的值,out输出每个时刻x的初始值
代码:
-- 通过type生成一个状态类型event,这个event的值只能是Bot或Top
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
b = (e = Top) ;
tel
node Clocked(in: bool; clock: event) returns (out: bool) ;
var x: bool ;
let
out = x ;
x = if Pres(clock) then in else (false -> pre x) ;
tel
Simulate执行结果:
创建一个布尔event,并在节点中进行调用
问题描述:创建一个结点Triggered,输入的状态中,如果in的status的值为Top,那么输出的out的值为输入的in的值,x的值为前一时刻的x的值加一,否则,输出的out的值的status为Bot,value的值为bool_choose()的返回值false,x的值为前一时刻的x的值
-- node imported表示辅助结点
-- 作用是在计算的每一步模拟两个布尔值之间的非确定性选择。
-- 默认情况下,调用该结点返回的布尔值为false
node imported bool_choose() returns (b: bool) ;
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
b = (e = Top) ;
tel
-- 创建一个布尔event类型
-- 这个类型定义的状态的状态值有一个event类型的status和一个布尔类型的value
type bool_event = {status: event; value: bool } ;
-- 如果输入的状态e的status值等于Top,那么b的值为true,否则为false
function bool_Pres(e: bool_event) returns (b: bool) ;
let
b = (e.status = Top) ;
tel
-- 创建一个结点Triggered,输入的状态中
-- 如果in的status的值为Top,那么输出的out的值为输入的in的值,x的值为前一时刻的x的值加一
-- 否则,输出的out的值的status为Bot,value的值为bool_choose()的返回值false,x的值为前一时刻的x的值
node Triggered(in: bool_event) returns (out: bool_event) ;
var x: int ;
let
out = if bool_Pres(in) then in
else bool_event {status = Bot; value = bool_choose() } ;
x = 0 -> if bool_Pres(in) then pre x + 1 else pre x ;
tel
Simulate执行结果:
在Simulate执行结果中我们可以看到,在Time为1、2、5的时刻,我们对in.status赋值为Top,此时x的值会增加一;我们在Time为1、2、4的时刻,对in.value赋值为ture,但因为只有在 1、2时刻,in.status的值为Top,所以这两个时刻,out.value为true,其余时刻均为false
对存在event的结点进行验证
问题描述:输入两个event类型的状态req1、req2,根据输入的状态和多重if语句,对gra1和gra2进行赋值
代码:
-- node imported表示辅助结点
-- 作用是在计算的每一步模拟两个布尔值之间的非确定性选择。
-- 默认情况下,调用该结点返回的布尔值为false
node imported bool_choose() returns (b: bool) ;
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
b = (e = Top) ;
tel
function Abs(e: event) returns (b: bool) ;
let
-- 比较e和Bot是否相等,并将比较结果赋值给b
b = (e = Bot) ;
tel
-- 通过多重if语句对gra1和gra2进行赋值
node Arbiter(req1, req2: event) returns (gra1, gra2: event) ;
var c: bool;
let
c = bool_choose();
gra1 = if Abs(req1) then Bot
else if Abs(req2) then Top
else if c then Top
else Bot ;
gra2 = if Abs(req2) then Bot
else if Abs(req1) then Top
else if c then Bot
else Top ;
-- 期望提示错误的验证:
-- 当Pres(req1)和Pres(req2)都有效时,想要验证Pres(gra1)是否有效
-- 但因为Pres(req1)和Pres(req2)有效并不能保证Pres(gra1)或者Pres(gra1)也是有效的
-- 所以下面两个公式的验证结果均为非法的公式
--%PROPERTY "P1.1" Pres(req1) and Pres(req2) => Pres(gra1) ;
--%PROPERTY "P1.2" Pres(req1) and Pres(req2) => Pres(gra2) ;
-- 期望提示正确的验证:
-- 当Pres(req1)和Pres(req2)都有效时, Pres(gra1)或者Pres(gra2)一定是有效的
--%PROPERTY "P2" Pres(req1) and Pres(req2) => Pres(gra1) xor Pres(gra2) ;
-- 当Pres(req1)和Abs(req2)都有效时,Pres(gra1)也是有效的
--%PROPERTY "P3.1" Pres(req1) and Abs(req2) => Pres(gra1) ;
-- 当Pres(req2)和Abs(req1)都有效时,Pres(gra2)也是有效的
--%PROPERTY "P3.2" Pres(req2) and Abs(req1) => Pres(gra2) ;
-- 当Pres(gra1)有效时,Pres(req1)也是有效的
--%PROPERTY "P4.1" Pres(gra1) => Pres(req1) ;
-- 当Pres(gra2)有效时,Pres(req2)也是有效的
--%PROPERTY "P4.2" Pres(gra2) => Pres(req2) ;
tel
Check运行结果: