PAT:过程分析工具包

一种用于并发和实时系统的增强模拟器、模型检查器和优化检查器

月度档案2009年9月

2009年9月25日:PAT支持用户定义的数据结构


仅PAT
支架整数,布尔值
整数数组为了有效验证。
然而,高级数据结构(例如堆栈、队列、哈希表等
on)对于某些型号是必需的。为了支持任意数据结构,PAT
提供一个接口,通过继承
抽象类
表达式值

这个
下面是一个简单的例子,展示了如何创建哈希表
在C#中。


使用系统。收藏;
使用
拍打。常见。课程。表达。表达式类;

//命名空间必须为PAT。类名和方法名可以
武断
名称空间PAT。图书馆{
公众阶级
哈希表:ExpressionValue
{
公共哈希表
表格;

///默认
不带任何参数的构造函数必须是
已实现
公众散列表()
{
           
table=新哈希表();
       
}

公众
哈希表(HashTable newTable)
{
           
table=新表;
       
}

public void Add(int
键,int值)
{
           
if(!table.ContainsKey(key))
{
               
表。添加(键,
值);
           
}
       
}
       

公共bool ContainsKey(int
键)
{
           
返回
表。包含密钥(key);
       
}

公共int
GetValue(int键)
{
           
return(int)table[key];
       
}

///返回
散列的字符串表示
表。
///此方法必须
被覆盖
公共覆盖
一串ToString(目标字符串)()
{
           
字符串returnString=
“”;
           
foreach(表中的DictionaryEntry条目)
{
               
returnString+=条目。键+“=”+输入。价值+
“,”;
           
}

           
return returnString;
       
}

///返回深度
哈希表的克隆
        ///
此方法必须
被覆写
公共覆盖
表达式值获取克隆()
{
           
return new HashTable(new
哈希表(表));
       
}

///返回
哈希的紧凑字符串表示
表。
///此方法必须
被覆盖
///智能
该方法的实现可以减少状态空间和加速
验证
公众
覆盖字符串获取ID()
{
           
字符串returnString=
“”;
           
foreach(表中的DictionaryEntry条目)
{
               
returnString+=条目。键+“=”+输入。价值+
“,”;
           
}

           
return returnString;
       
}
   
}
}

 请注意
创建自己的数据结构时遵循以下要求
物体:

  • 这个
    命名空间必须是“PAT.Lib”,否则将无法识别。没有
    类名和方法的限制
    名称。
  • 导入PAT表达式名称
    空间使用“
    使用
    拍打。常见。课程。表达。表达式类;
    “.
  • 仅限
    公共方法可用于PAT模型
  • 这个
    参数必须是“bool”、“int”、“int[]”(int数组)或对象类型
    (对象类型允许用户将用户定义的数据类型传递为
    参数)
  • 这个
    参数的数量可以是0或多个。
  • 这个
    返回类型必须是“void”、“bool”、“int”、“int[]”(int
    数组)或用户定义的数据类型
  • 这个
    方法名区分大小写。
  • 放置
    PAT安装目录的“Lib”文件夹中编译的dll
    易于使用的链接#导入
    “DLL_Name”;

如果您的
方法需要处理异常情况,可以抛出PAT运行时
例外情况,如以下示例所示。


public static int StackPeek(int[]数组)
{
if(数组长度>
0)
返回
数组[array.Length–1];

//抛出PAT运行时
例外
抛出新的
拍打。常见。课程。表达。表达式类。RuntimeException(“访问
空的
堆栈!”);
}

收件人
导入模型中的库,用户可以使用以下命令
语法:

#进口“PAT.Lib.Hashtable”;//在下导入库
PAT安装路径的Lib文件夹

#进口
“C:程序文件IntelHashtable.dll”;//使用绝对值导入库
路径

收件人
声明模型中用户定义的类型,请使用以下命令

语法以下为:

无功功率,无功功率<HashTable>表;//在此处使用类名
作为变量的类型。

收件人
调用模型中的公共方法,请使用
以下语法
以下为:

  • 表。增加(10,2);
  • 如果(表.ContainsKey(10))…


 


版权所有©2007-2009国立大学计算机学院
新加坡

2009年9月5日:PAT 2.7.0发布!

PAT 2.7.0的新增功能

在这个版本中,主要的成就是在实时系统(RTS)模块中实现了时间细化检查算法。在此阶段,所有计划的算法都在RTS模块中实现。未来,我们将致力于RTS模块的语法丰富和性能改进。在这个版本中,CSP和RTS模块中的建模语言得到了改进,以获得更好的表达能力和解析精度。其他更新包括新示例和错误修复。

定时优化
有时,计时方面在系统要求中很重要,例如,人类的心跳速度必须在50/分钟到200/分钟之间(过低或过高对人类生命至关重要)。在这些情况下,我们可以使用时间细化来检查输入模型是否符合所需的时间要求。语法如下:

#assert Implementation()细化<T>TimedSpec();

注:对于定时优化检查,RTS模块使用定时跟踪语义(即从模型到一组有限定时事件序列的映射)和定时跟踪优化关系(即当且仅当模型的定时跟踪是规范的子集时,模型满足规范)。为时间细化检查开发的验证算法将通过显示细化关系来验证系统模型与规范的一致性。如果不存在这种细化关系,则将时间事件序列作为反例。对于定时细化检查,PAT要求实现或规范不发散,否则共享时钟将不受限制。如果系统发散,PAT将要求用户提供共享时钟的上限(默认值为2^15)。

分组流程中支持流程参数
为了获得更好的组合行为,我们允许在分组过程中使用过程参数。例如,在[]x中:{0..n}@P或||{0}@P(),n可以是全局常量或进程参数,但不能是全局变量。我们出于性能原因进行此限制。例如,以下定义在PAT中均有效。
#定义n 10|||x:{0..n}@P
P(n)=|||x:{0..n}@Q

通道名称可以用作事件名称
事件名称是形式为('a'..'z'|'a'..'z'|'_')('a''..'z'|'a''..'z'|'0'..'9'|'_')*的任意字符串。但是,全局变量名、全局常量名、进程名、进程参数名、命题名不能用作事件名。一个例外是允许使用通道名称,因为我们可能希望在规范过程中使用通道名称来模拟通道行为,并使用细化检查来与真实的通道事件进行比较。

无差异
假设P()是一个进程,下面的断言询问P()是否无发散。
#断言P()不发散;
给定一个过程,它可以永远执行内部转换,而不参与任何有用的事件,例如,P=(a->P){a};,在这种情况下,P被认为是发散的。发散系统通常是不受欢迎的。

定时无偏差
假设P()是一个进程,下面的断言询问P()是否是无时间差异的。
#断言P()不发散<T>;
给定一个过程,它可以永远执行内部转换和定时转换,而不参与任何有用的事件,例如,Q=(a->Wait[5];Q){a};,在这种情况下,P被称为时间发散。定时发散系统是不可取的,它可以提供无限的计时器,这不允许定时优化检查。

注释:P=(a->P){a};发散,但不是时间发散,因为它永远执行内部转换,而不进行时间转换。

其他
1用户手册更新为最新版本。
添加了2个实时系统示例(Timed PaceMaker)和定时优化断言。
3修复解析、GUI等地方的错误。