CN106648813B - 一种同步数据流程序的形式化编译方法 - Google Patents

一种同步数据流程序的形式化编译方法 Download PDF

Info

Publication number
CN106648813B
CN106648813B CN201610832046.9A CN201610832046A CN106648813B CN 106648813 B CN106648813 B CN 106648813B CN 201610832046 A CN201610832046 A CN 201610832046A CN 106648813 B CN106648813 B CN 106648813B
Authority
CN
China
Prior art keywords
clock
signal
equation
program
representing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201610832046.9A
Other languages
English (en)
Other versions
CN106648813A (zh
Inventor
杨志斌
袁胜浩
屈有昊
王飞
谢健
王永孟
薛垒
周勇
黄志球
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University of Aeronautics and Astronautics
Original Assignee
Nanjing University of Aeronautics and Astronautics
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University of Aeronautics and Astronautics filed Critical Nanjing University of Aeronautics and Astronautics
Priority to CN201610832046.9A priority Critical patent/CN106648813B/zh
Publication of CN106648813A publication Critical patent/CN106648813A/zh
Application granted granted Critical
Publication of CN106648813B publication Critical patent/CN106648813B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/458Synchronisation, e.g. post-wait, barriers, locks

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Design And Manufacture Of Integrated Circuits (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及到一个同步数据流语言SIGNAL自动生成串行C代码的编译器,该编译器对用户输入的SIGNAL程序,能自动将其生成相应的串行C代码。该编译器使用函数式程序设计语言CAML来编写程序,因为CAML语言使用强类型系统,具有较高的安全性,并且可以使用对应的定理证明方法来验证编译器的正确性。此外,该编译器使用模块化结构,一旦改进或优化编译器,仅需验证对应的模型即可,而非重新对整个编译器进行验证。

Description

一种同步数据流程序的形式化编译方法
技术领域
本发明涉及一种同步数据流程序的形式化编译方法,尤其涉及将同步语言SIGNAL编译并自动生成串行C代码。
背景技术
安全关键嵌入式系统广泛应用于航空电子、航天器及核能控制等领域,这类系统也被称为反应式系统(reactive systems),因为系统不断地和环境在进行交互。其中,环境可以是一些被系统控制的物理设备,也可以是操作人员或其他反应式系统。这类系统从环境中接收输入,经过计算得到输出信息,并最终将输出信息输出到环境。同步编程方法,基于同步假设理论,非常适合用来设计这类系统。首先,计算过程的时间被抽象为0,这使得系统行为被划分成离散的逻辑时刻序列。在每个逻辑时刻,系统的输入-计算-输出时间为0。其次,不同输入事件的发生顺序被抽象为事件之间的相对顺序。虽然物理时钟被抽象,但系统固有的功能特性并未改变,所以同步编程方法是在平台无关层次上表达和验证系统的功能特性。
目前有ESTEREL、LUSTRE、SIGNAL和QUARTZ等同步语言,它们可以看作同步假设理论的不同实现。其中,ESTEREL、LUSTRE以及QUARTZ语言使用纯同步模式(PerfectSynchrony),即存在一个全局时钟(单时钟),而SIGNAL语言使用多态同步模式(Polychrony),即多时钟,能够更自然和方便地表达分布式系统。
同步语言编译过程并不局限于代码生成:首先需要分析同步模型是否可执行。同步数据流语言SIGNAL编译过程中的时钟演算分析是很重要的一步,而代码生成是根据时钟演算得来的。时钟演算包含多个步骤,例如进程间的同步,也就是时钟关系等式系统的构造;时钟等式系统的消解;代码自动生成所依赖的时钟树的构建等。
发明内容
发明目的:对安全关键系统来说,一方面,完善生成代码的控制结构非常重要。在SIGNAL编译器中,抽象时钟表达的控制流用于得到代码自动生成的控制结构。因此,时钟演算的质量对实现的正确性和效率影响很大。另一方面,编译器也被要求必须经过形式化验证来确保保留了源程序的语义。我们提出了一种SIGNAL编译过程的形式化方法,用CAML语言实现。这是为了下一步使用定理证明-验证编译器方法来验证我们的编译器。在我们的形式化方法中,已经考虑了现有的优化方案。和转换确认(Translation Validation)方法相比,我们把编译器看作一个“白盒”。在定理证明一验证编译器方法中,源程序改变,不需重新验证编译器。然而,这类方法也存在一个问题,即编译器发生任何改动,例如优化和更新,证明过程需要重新验证。为了减轻这个问题,我们提出了一个适当的模块化结构来支持我们的形式化方法,这意味着,当编译器的某些模块发生改变,只需要对相应部分进行重新证明。
技术方案:一个SIGNAL形式化编译并自动生成串行C代码的编译器,基于模块化结构设计技术,将编译过程分为用户程序的标准化、SIGNAL进程间的同步、时钟等式系统的消解、时钟等式的分层表示和代码自动生成五个模块,采用函数式程序设计语言CAML来编程,一旦编译器需要改进或优化,不需要验证整个编译器,只需要验证对应的模块即可。
本发明还提供一种利用所述的编译器实现的一种基于同步数据流程序编译的形式化方法,用于将同步语言SIGNAL形式化编译,
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的用户程序标准化;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的SIGNAL进程间的同步;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的时钟等式系统的消解;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的时钟等式系统的分层表示;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的代码自动生成。
进一步的,所述的用户程序标准化具体如下:在词法分析,语法分析和类型检查之后,编译器将用户程序转换成标准化程序,其中用户程序的声明是由基本结构和扩展结构表示,标准化程序只有基本结构;
A)用户程序语法:
ty:表示SIGNAL的数据类型;
exp:表示SIGNAL的表达式,能够是常数表达式或由四种基本结构组成,Ident表示为信号的标识符,等式中常量用CInt,CReal,CBool,CString和CChar表示,Func,Delay,When和Default表示四种基本结构,Func还表示时钟的集合操作;
eqn:表示SIGNAL的等式,一个等式表示数据或时钟之间的关系,Constraint表示时钟的比较操作^<,^>,^#和^=;
decl:表示SIGNAL每个进程中的局部声明;
proc:表示SIGNAL中进程,进程proc是一组等式的集合(eqn list),表示信号间的时钟关系和数据关系;此外,进程包含进程名,输入信号,输出信号和局部声明;
spec:一个SIGNAL程序表示为spec,即进程的集合;
B)标准化后的语法,即k-signal:
sty:表示k-signal的数据类型,同SIGNAL;
sexp:表示k-signal的表达式,SIdent为变量表达式,SCReal等为常量表达式,SFunc为瞬时函数中一元或二元操作;
expSig:表示k-signal中的其余三种基本结构:延迟SDelay、条件采样SWhen和确定性合并SDefault;
seqn:表示k-signal的等式,同SIGNAL;
kdecl:表示k-signal每个进程中的局部声明,同SIGNAL;
kproc:表示k-signal中进程,同SIGNAL;
kspec:一个标准化后的SIGNAL程序表示为kspec;
基于k-signal语法,用户程序将会扁平化,并且扩展结构将会转换成基本结构。
进一步的,扩展结构到基本结构的转化规则为:
转化规则0:基本规则,等式
Figure BDA0001116120030000031
用基本结构表示如下:
Figure BDA0001116120030000032
转化规则1:抽象时钟的集合操作:时钟交集,并集,差集,表示如下,并且能用基本结构如下:
Figure BDA0001116120030000041
转化规则2:抽象时钟的比较操作能够用时钟集合操作表示,从而进一步能够用基本结构表示,
Figure BDA0001116120030000042
表示为空时钟:
Figure BDA0001116120030000043
进一步的,所述SIGNAL进程间的同步具体如下:首先给出扩展的时钟抽象表示,然后基于扩展时钟抽象给出SIGNAL基本结构的时钟同步关系;
扩展的时钟抽象表示:
clk:信号对应的时钟,分为Hat和Nonhat;
clkexpr:时钟表达式,其中数值型表达式看作一个复杂的关系表达式;
clkeq:时钟等式;
clkeqs:时钟等式集合;
扩展时钟的抽象表示定义如下,
Figure BDA0001116120030000044
Figure BDA0001116120030000045
SIGNAL基本结构的抽象表示:
trans_eqns_clkeq_eqs:对每种基本结构构造其扩展时钟同步关系;
trans_pl_clkeq_pl:对一个进程构造其扩展时钟同步关系;
基于扩展时钟的抽象表示,每种基本结构的扩展时钟同步关系如下:
Figure BDA0001116120030000051
进一步的,所述时钟等式系统的消解具体如下:
CAML定义的消解时钟等式系统程序语法:
nfs:表示一组标准化的时钟方程;
unfs:表示一组非标准化的时钟方程;
l:表示时钟变量是否在时钟方程的左侧;
r:表示时钟变量是否在时钟方程的右侧;
esmap:表示一个用以保存等价类和该等价类所包含的时钟变量的对应关系;
具体采用的方法如下:
步骤1:给定时钟方程系统的任意方程eq,用NFS与之对应的定义来替换eq两边的时钟变量;这样得到一个新公式eq’;
步骤2:如果eq’的左侧是时钟的表达式,其右侧是一个时钟变量,那么颠倒eq’;
步骤3:如果eq’的左侧是一个时钟变量,并且eq’的右侧存在,那么执行步骤5,否则执行步骤6;
步骤4:如果eq’左侧和右侧都是时钟表达式,则被称为复杂的时钟关系,那么执行步骤5;
步骤5:把eq’代入UNFS中,执行步骤8;
步骤6:把eq’代入NFS中,执行步骤7;
步骤7:用eq’来替换在UNFS中每个方程式ceq两侧的时钟变量,得到一个新的方程ceq’,如果ceq’左侧和右侧是等价的,那么就从UNFS中消除它,否则,将它添加到UNFS;
步骤8:重复步骤1-7,直到在时钟等式系统中没有非标准的等式;
步骤9:如果UNFS是空的,则返回NFS,否则返回一个出错信息。
进一步的,所述时钟等式系统的分层表示具体如下:
var_in_sexp:表示判断两个时钟方程的先后顺序;
dass:表示赋值行为;
input:表示输入行为;
output:表示输出行为;
cass:表示等价类;
具体采用的方法如下:
步骤1:获取一个排序列表中的元素;
步骤2:如果当前元素是通过简化范式(Reduced Normal Form)的方程,即它是时钟等价类之间的关系,也称为规约时钟方程,那么在时钟树中能够找到它的分支,并找到基于时钟包含关系的一个合适插入地点,然后对于方程左侧的等价类创建一个新的节点;
步骤3:如果当前元素是作为输入,输出,或者一个赋值操作,那么能够找到已经被插入在时钟树中的相应等价类,并将此操作插入到对应等价类的操作列表,在这里并不需要排序的操作列表,因为他们已经在排序列表被排序;
步骤4:重复步骤1-步骤3中,直到在排序列表中没有元素。
进一步的,所述时钟代码自动生成具体如下:
pre_def:表示对应c程序的头文件部分,该部分生成在c程序文件内;
produce_types_file:表示对应c程序的头文件部分,该部分生成在一个独立的存放头文件中.h文件中;
produce_body_file:表示存放initialize()、step_initialize()、step_finalize()、step()函数的声明;
produce_ext_proc_file:表示存放额外建立的函数的声明;
io_code_not_op:在生成未优化的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量;
io_code_op:在生成优化后的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量;
code_body:用于生成c程序的代码主体部分;
finalization_code:用于生成c程序的最后一部分,即step_finalize()函数。
有益效果:本发明涉及到一个SIGNAL形式化编译并自动生成串行C代码的编译器,该编译器对用户输入的SIGNAL程序,都能自动将其生成相应的串行C代码。该编译器使用函数式程序设计语言CAML来编写程序,因为CAML程序可以用对应的定理证明-验证编译器方法来验证我们的编译器的正确性,此方法对于不同的源程序,无需重新验证编译器。此外,我们使用模块化结构来支持我们的形式化编译,这样一旦编译器需要改进或优化,我们不需要验证整个编译器,而只需要验证对应的模块即可。
附图说明
图1:SIGNAL形式化编译的模块化体系结构;
图2:SIGNAL程序的自动代码生成。
具体实施方式
下面将结合附图对本发明作进一步的说明:
1)工具总体概述
如图1所示,该SIGNAL编译器,基于模块化结构设计技术,将编译过程分为用户程序的标准化、SIGNAL进程间的同步、时钟等式系统的消解、时钟等式的分层表示和代码自动生成这五个模块。为了便于以后用定理证明-验证编译器方法来验证编译器的正确性,我们采用函数式程序设计语言CAML来编程。
2)用户程序的标准化
在我们的SIGNAL编译器中,为了把合适的宏提供给用户,扩展结构被定义为基本结构的组合。所以,在词法分析,语法分析和类型检查之后,编译器将用户程序转换成标准化程序,其中用户程序的声明是由基本结构和扩展结构表示的,而标准化程序只有基本结构。
CAML定义的简化的用户语法:
●ty:表示SIGNAL的数据类型,例如integer,real,complex,boolean等;
●exp:表示SIGNAL的表达式,可以是常数表达式或由四种基本结构组成,Ident表示为信号的标识符,等式中常量用CInt,CReal,CBool,CString和CChar表示,Func,Delay,When和Default表示四种基本结构,Func还表示时钟的集合操作,例如^+,^*和^-;
●eqn:表示SIGNAL的等式,一个等式表示数据或时钟之间的关系,Constraint表示时钟的比较操作^<,^>,^#和^=;
●decl:表示SIGNAL每个进程中的局部声明;
●proc:表示SIGNAL中进程,进程proc是一组等式的集合(eqn list),表示信号间的时钟关系和数据关系。此外,进程包含进程名,输出信号,输出信号和局部声明;
●spec:一个SIGNAL程序表示为spec,即进程的集合。
CAML定义的k-signal语法:
●sty:表示k-signal的数据类型,同SIGNAL;
●sexp:表示k-signal的表达式,SIdent为变量表达式,SCReal等为常量表达式,SFunc为瞬时函数中一元或二元操作;
●expSig:表示k-signal中的其余三种基本结构:延迟SDelay、条件采样SWhen和确定性合并SDefault;
●seqn:表示k-signal的等式,同SIGNAL;
●kdecl:表示k-signal每个进程中的局部声明,同SIGNAL;
●kproc:表示k-signal中进程,同SIGNAL;
●kspec:一个标准化后的SIGNAL程序表示为kspec。
基于k-signal语法,用户程序将会扁平化,并且扩展结构将会转换成基本结构。扩展结构到基本结构的转化规则为:
转化规则0:基本规则,等式
Figure BDA0001116120030000081
用基本结构表示如下:
Figure BDA0001116120030000082
转化规则1:抽象时钟的集合操作:时钟交集,并集,差集,表示如下,并且能用基本结构如下:
转化规则2:抽象时钟的比较操作能够用时钟集合操作表示,从而进一步能够用基本结构表示,
Figure BDA0001116120030000084
表示为空时钟:
Figure BDA0001116120030000091
此外,SIGNAL语言中常量信号需要依据上下文来判断其时钟,我们使用延迟结构来定义常量信号。例如,在等式y=2whenb和y′=2whenb′中,两个常量信号2可能分别具有不同的时钟,因此,我们使用x1=x1$init 2和x2=x2$init 2来分别定义两个常量信号。
3)SIGNAL进程间的同步
我们首先给出扩展时钟的抽象表示,然后给出SIGNAL基本结构的时钟同步对应关系。
扩展的时钟抽象表示:
●clk:信号对应的时钟,分为Hat和Nonhat;
●clkexpr:时钟表达式,其中数值型表达式看作一个复杂的关系表达式;
●clkeq:时钟等式;
●clkeqs:时钟等式集合;
对于条件采样结构,如果信号x定义为数值表达式,例如一个整数比较或者一个复杂的boolean型表达式,那么SIGNAL把关系时钟[x]和[-x]看作黑盒。当x定义为复杂的Boolean型表达式,我们有
Figure BDA0001116120030000092
基于这种抽象表示,我们可以得到更精确的时钟消解。此外,我们不对x为数值型表达式的情况进行处理,并把它看作一个复杂的关系表达式C。
扩展时钟的抽象表示定义如下,
Figure BDA0001116120030000095
SIGNAL基本结构的抽象表示:
●trans_eqns_clkeq_eqs:对每种基本结构构造其扩展时钟同步关系;
●trans_pl_clkeq_pl:对一个进程构造其扩展时钟同步关系;
基于扩展时钟的抽象表示,每种基本结构的扩展时钟同步关系如下:
Figure BDA0001116120030000101
4)除了条件采样结构外,我们还扩展了确定性合并的时钟同步关系。对于结构x:=x1default x2,它被分成两部分:x=x1与时钟
Figure BDA0001116120030000102
相对应,x=x2与时钟
Figure BDA0001116120030000103
相对应。也就是说,增加了一个新的时钟变量
Figure BDA0001116120030000104
这个扩展在时钟树结构起很大作用,可以避免时钟-数据环。
5)时钟等式系统的消解
SIGNAL用时钟关系表示数据流规约控制,在任一给定逻辑时刻,信号x的值再被计算之前,必须先测试x的时钟是存在还是缺失,所以消解方法需要有效地检查时钟是否存在。
CAML定义的消解时钟等式系统程序语法:
●nfs:表示一组标准化的时钟方程。
●unfs:表示一组非标准化的时钟方程。
●l:表示时钟变量是否在时钟方程的左侧。
●r:表示时钟变量是否在时钟方程的右侧。
esmap:表示一个用以保存等价类和该等价类所包含的时钟变量的对应关系。
具体采用的算法:
步骤1:给定时钟方程系统的任意方程eq,用NFS与之对应的定义(如果已经被定义了)来替换eq两边的时钟变量。这样我们得到一个新公式eq’。
步骤2:如果eq’的左侧是时钟的表达式,其右侧是一个时钟变量,那么我们颠倒eq’。
步骤3:如果eq’的左侧是一个时钟变量,并且eq’的右侧存在,那么执行步骤5,否则执行步骤6。
步骤4:如果eq’左侧和右侧都是时钟表达式,则被称为复杂的时钟关系,那么执行步骤5。
步骤5:把eq’代入UNFS中,执行步骤8。
步骤6:把eq’代入NFS中,执行步骤7。
步骤7:用eq’来替换在UNFS中每个方程式ceq两侧的时钟变量,这样我们得到一个新的方程ceq’,如果ceq’左侧和右侧是等价的,那么我们就从UNFS中消除它,否则,我们将它添加到UNFS。
步骤8:重复步骤1-7,直到在时钟等式系统中没有非标准的等式。
步骤9:如果UNFS是空的,则返回NFS,否则返回一个出错信息。
5)时钟等式系统的分层表示
经过消解的时钟等式能够生成可执行代码。为了高效的应用重写和保持时钟等式系统的三元组结构,我们使用了一种基于树的等式表示,称为时钟树。而且它也被用于检查程序是否是时间可确定,称为endochronous性质,即整个时钟树只存在一个根时钟,这样能够生成一个对应的确定性的串行可执行程序。
CAML定义的时钟等式系统分层表示:
●var_in_sexp:表示判断两个时钟方程的先后顺序。
●dass:表示赋值行为。
●input:表示输入行为。
●output:表示输出行为。
●cass:表示等价类。
这里构造时钟树的算法:
步骤1:获取一个排序列表中的元素。
步骤2:如果当前元素是通过简化范式(Reduced Normal Form)的方程,即它是时钟等价类之间的关系,也称为规约时钟方程,那么在时钟树中能够找到它的限制分支,并找到基于时钟包含关系的一个合适插入地点,然后对于方程左侧的等价类创建一个新的节点;
步骤3:如果当前元素是作为输入,输出,或者一个赋值这样的操作,那么我们可以找到已经被插入在时钟树中的相应等价类,并将此操作插入到对应等价类的操作列表(在这里我们并不需要排序的操作列表,因为他们已经在排序列表被排序)。
步骤4:重复步骤1-步骤3中,直到在排序列表中没有元素。
6)代码自动生成
代码生成基于之前所描述的程序转换。从时钟演算到构成目标语言程序,时钟树一直起着重要的指导作用。而数据依赖图不仅在时钟序列的局部有序的基本操作中起作用,还帮助在树状目标代码中增加了功能行为。这样的代码通用于不同的目标语言中,包括主流的语言如C、C++、Java。
首先创建一个代码生成树,然后生成串行C代码。其主体生成步骤见图2。
CAML定义的代码生成:
●pre_def:表示对应c程序的头文件部分,该部分生成在c程序文件内。
●produce_types_file:表示对应c程序的头文件部分,该部分生成在一个独立的存放头文件中.h文件中。
●produce_body_file:表示存放initialize()、step_initialize()、step_finalize()、step()函数的声明。
●produce_ext_proc_file:表示存放额外建立的函数的声明。
●io_code_not_op:在生成未优化的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量。
●io_code_op:在生成优化后的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量。
●code_body:用于生成c程序的代码主体部分。
●finalization_code:用于生成c程序的最后一部分,即step_finalize()函数。
通过时钟演算来获得时钟树的结果,能够引导构建目标语言程序。此外,通过数据依赖关系不仅可以在序列中局部确定基本操作,而且还可以在分层目标代码中安排各部分运行。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (6)

1.一种应用SIGNAL自动生成串行C代码的形式化编译器的同步数据流程序编译的形式化方法,其特征在于:所述SIGNAL自动生成串行C代码的形式化编译器基于模块化结构设计技术,将编译过程分为用户程序的标准化、SIGNAL进程间的同步、时钟等式系统的消解、时钟等式的分层表示和代码自动生成五个模块,采用函数式程序设计语言CAML来编程,一旦编译器需要改进或优化,不需要验证整个编译器,只需要验证对应的模块即可;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的用户程序标准化;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的SIGNAL进程间的同步;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的时钟等式系统的消解;
所述时钟等式系统的消解具体如下:
CAML定义的消解时钟等式系统程序语法:
nfs:表示一组标准化的时钟方程;
unfs:表示一组非标准化的时钟方程;
l:表示时钟变量是否在时钟方程的左侧;
r:表示时钟变量是否在时钟方程的右侧;
esmap:表示一个用以保存等价类和该等价类所包含的时钟变量的对应关系;
具体采用的方法如下:
步骤1:给定时钟方程系统的任意方程eq,用NFS与之对应的定义来替换eq两边的时钟变量;这样得到一个新公式eq’;
步骤2:如果eq’的左侧是时钟的表达式,其右侧是一个时钟变量,那么颠倒eq’;
步骤3:如果eq’的左侧是一个时钟变量,并且eq’的右侧存在,那么执行步骤5,否则执行步骤6;
步骤4:如果eq’左侧和右侧都是时钟表达式,则被称为复杂的时钟关系,那么执行步骤5;
步骤5:把eq’代入UNFS中,执行步骤8;
步骤6:把eq’代入NFS中,执行步骤7;
步骤7:用eq’来替换在UNFS中每个方程式ceq两侧的时钟变量,得到一个新的方程ceq’,如果ceq’左侧和右侧是等价的,那么就从UNFS中消除它,否则,将它添加到UNFS;
步骤8:重复步骤1-7,直到在时钟等式系统中没有非标准的等式;
步骤9:如果UNFS是空的,则返回NFS,否则返回一个出错信息;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的时钟等式系统的分层表示;
使用函数式程序设计语言CAML描述同步语言SIGNAL的编译过程的代码自动生成。
2.根据权利要求1所述的一种同步数据流程序编译的形式化方法,其特征在于:所述的用户程序标准化具体如下:在词法分析,语法分析和类型检查之后,编译器将用户程序转换成标准化程序,其中用户程序的声明是由基本结构和扩展结构表示,标准化程序只有基本结构;
A)用户程序语法:
ty:表示SIGNAL的数据类型;
exp:表示SIGNAL的表达式,能够是常数表达式或由四种基本结构组成,Ident表示为信号的标识符,等式中常量用CInt,CReal,CBool,CString和CChar表示,Func,Delay,When和Default表示四种基本结构,Func还表示时钟的集合操作;
eqn:表示SIGNAL的等式,一个等式表示数据或时钟之间的关系,Constraint表示时钟的比较操作^<,^>,^#和^=;
decl:表示SIGNAL每个进程中的局部声明;
proc:表示SIGNAL中进程,进程proc是一组等式的集合(eqn list),表示信号间的时钟关系和数据关系;此外,进程包含进程名,输入信号,输出信号和局部声明;
spec:一个SIGNAL程序表示为spec,即进程的集合;
B)标准化后的语法,即k-signal:
sty:表示k-signal的数据类型,同SIGNAL;
sexp:表示k-signal的表达式,SIdent为变量表达式,SCReal等为常量表达式,SFunc为瞬时函数中一元或二元操作;
expSig:表示k-signal中的其余三种基本结构:延迟SDelay、条件采样SWhen和确定性合并SDefault;
seqn:表示k-signal的等式,同SIGNAL;
kdecl:表示k-signal每个进程中的局部声明,同SIGNAL;
kproc:表示k-signal中进程,同SIGNAL;
kspec:一个标准化后的SIGNAL程序表示为kspec;
基于k-signal语法,用户程序将会扁平化,并且扩展结构将会转换成基本结构。
3.根据权利要求2所述的一种同步数据流程序编译的形式化方法,其特征在于:扩展结构到基本结构的转化规则为:
转化规则0:基本规则,等式
Figure FDA0002258676860000031
用基本结构表示如下:
Figure FDA0002258676860000032
转化规则1:抽象时钟的集合操作:时钟交集,并集,差集,并且能转换到基本结构如下:
Figure FDA0002258676860000033
转化规则2:抽象时钟的比较操作能够用时钟集合操作表示,从而进一步能够用基本结构表示,表示为空时钟:
4.根据权利要求1所述的一种同步数据流程序编译的形式化方法,其特征在于:所述SIGNAL进程间的同步具体如下:首先给出扩展的时钟抽象表示,然后基于扩展时钟抽象给出SIGNAL基本结构的时钟同步关系;
扩展的时钟抽象表示:
clk:信号对应的时钟,分为Hat和Nonhat;
clkexpr:时钟表达式,其中数值型表达式看作一个复杂的关系表达式;
clkeq:时钟等式;
clkeqs:时钟等式集合;
扩展时钟的抽象表示定义如下,
Figure FDA0002258676860000041
Figure FDA0002258676860000042
SIGNAL基本结构的抽象表示:
trans_eqns_clkeq_eqs:对每种基本结构给出其扩展时钟同步关系;
trans_pl_clkeq_pl:对一个进程给出其扩展时钟同步关系;
基于扩展时钟的抽象表示,每种基本结构的扩展时钟同步关系如下:
5.根据权利要求1所述的一种同步数据流程序编译的形式化方法,其特征在于:所述时钟等式系统的分层表示具体如下:
var_in_sexp:表示判断两个时钟方程的先后顺序;
dass:表示赋值行为;
input:表示输入行为;
output:表示输出行为;
cass:表示等价类;
具体采用的方法如下:
步骤1:获取一个排序列表中的元素;
步骤2:如果当前元素是通过简化范式的方程,即它是时钟等价类之间的关系,也称为规约时钟方程,那么在时钟树中能够找到它的分支,并找到基于时钟包含关系的一个合适插入点,然后对于方程左侧的等价类创建一个新的节点;
步骤3:如果当前元素是作为输入,输出,或者一个赋值操作,那么能够找到已经被插入在时钟树中的相应等价类,并将此操作插入到对应等价类的操作列表,在这里并不需要排序的操作列表,因为他们已经在排序列表被排序;
步骤4:重复步骤1-步骤3中,直到在排序列表中没有元素。
6.根据权利要求1所述的一种同步数据流程序编译的形式化方法,其特征在于:所述代码自动生成具体如下:
pre_def:表示对应c程序的头文件部分,该部分生成在c程序文件内;
produce_types_file:表示对应c程序的头文件部分,该部分生成在一个独立的存放头文件中.h文件中;
produce_body_file:表示存放initialize()、step_initialize()、step_finalize()、step()函数的声明;
produce_ext_proc_file:表示存放额外建立的函数的声明;
io_code_not_op:在生成未优化的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量;
io_code_op:在生成优化后的c程序中,将signal中的信号转化为对应变量,以及在转化过程中需要使用到的新声明的变量;
code_body:用于生成c程序的代码主体部分;
finalization_code:用于生成c程序的最后一部分,即step_finalize()函数。
CN201610832046.9A 2016-09-19 2016-09-19 一种同步数据流程序的形式化编译方法 Active CN106648813B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610832046.9A CN106648813B (zh) 2016-09-19 2016-09-19 一种同步数据流程序的形式化编译方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610832046.9A CN106648813B (zh) 2016-09-19 2016-09-19 一种同步数据流程序的形式化编译方法

Publications (2)

Publication Number Publication Date
CN106648813A CN106648813A (zh) 2017-05-10
CN106648813B true CN106648813B (zh) 2020-01-10

Family

ID=58853011

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610832046.9A Active CN106648813B (zh) 2016-09-19 2016-09-19 一种同步数据流程序的形式化编译方法

Country Status (1)

Country Link
CN (1) CN106648813B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108647030B (zh) * 2018-03-30 2022-03-11 北京计算机技术及应用研究所 基于闭包算法的同步语言航天c代码自动生成方法
CN109710226A (zh) * 2018-09-06 2019-05-03 天翼电子商务有限公司 一种编译器后端指令选择学习系统及具有该系统的编译器和指令选择方法
CN112579065A (zh) * 2019-09-27 2021-03-30 北京广利核系统工程有限公司 一种将图形组态画面生成跨平台代码的方法及系统
CN112269734B (zh) * 2020-10-15 2022-04-26 南京航空航天大学 一种基于可满足性求解的同步语言程序自动验证方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1609792A (zh) * 2003-10-24 2005-04-27 微软公司 计算机程序的编程接口
CN104516818A (zh) * 2014-12-29 2015-04-15 北京四方继保自动化股份有限公司 一种适用于逻辑组态软件中编译器的自动化测试系统及其方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8359186B2 (en) * 2006-01-26 2013-01-22 Subbu Ganesan Method for delay immune and accelerated evaluation of digital circuits by compiling asynchronous completion handshaking means

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1609792A (zh) * 2003-10-24 2005-04-27 微软公司 计算机程序的编程接口
CN104516818A (zh) * 2014-12-29 2015-04-15 北京四方继保自动化股份有限公司 一种适用于逻辑组态软件中编译器的自动化测试系统及其方法

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
A Verified Transformation:from Polychronous Programs to a Variant of Clocked Guarded Actions;杨志斌等;《In: Proceedings of the 17th ACM International Workshop on》;20140611;第128-137页 *
Experience Report:Using Objective Caml to Develop;Bruno Pagano;《In: Proceedings of the》;20090902;第215-220页 *
Towards a Verified Compiler Prototype for the Synchronous Language SIGNAL;Zhibin Yang 等;《Frontiers of Computer Science》;20160524;第10卷(第3期);第37-53页 *
同步语言的时间可预测多线程代码生成方法;杨志斌等;《软件学报》;20160105;第27卷(第3期);第611-632页 *
面向同步规范的并行代码自动生成;胡凯;《http://www.cnki.net/kcms/detail/11.2560.TP.20160504.0844.004.html》;20160504;第1-15页 *

Also Published As

Publication number Publication date
CN106648813A (zh) 2017-05-10

Similar Documents

Publication Publication Date Title
Bourke et al. A formally verified compiler for Lustre
Torlak et al. Growing solver-aided languages with rosette
Verbaere et al. JunGL: a scripting language for refactoring
CN106648813B (zh) 一种同步数据流程序的形式化编译方法
CN110870249A (zh) 用于将高级语言代码编译为区块链平台上可执行的脚本的系统和方法
WO2014011696A1 (en) Method and system for automated improvement of parallelism in program compilation
CN108319458B (zh) 一种基于图形化卫式命令演算的多任务编译方法
Arcaini et al. AsmetaSMV: a way to link high-level ASM models to low-level NuSMV specifications
McFarland et al. An abstract model of behavior for hardware descriptions
US7086047B1 (en) Determining hardware generated by high level language compilation through loop optimizations
Denney et al. A generic annotation inference algorithm for the safety certification of automatically generated code
Auguston et al. Behavior models and composition for software and systems architecture
Hungar et al. What if model checking must be truly symbolic
Izerrouken et al. Certifying an Automated Code Generator Using Formal Tools: Preliminary experiments in the GeneAuto project.
Demange et al. Mechanizing conventional SSA for a verified destruction with coalescing
Marin et al. Towards a framework for generating program dependence graphs from source code
Lai et al. Defining and verifying behaviour of domain specific language with fUML
Hao et al. Equivalence checking for function pipelining in behavioral synthesis
Mathaikutty et al. Ewd: A metamodeling driven customizable multi-moc system modeling framework
Kalla et al. Automated generation of synchronous formal models from SystemC descriptions
Amjad et al. Translation validation of code generation from the SIGNAL data-flow language to verilog
Bandyopadhyay et al. An efficient path based equivalence checking for petri net based models of programs
Amjad et al. Verilog code generation scheme from signal language
Haslbeck et al. An Isabelle/HOL formalization of AProVE’s termination method for LLVM IR
Arató et al. A data flow graph generation method starting from C description by handling loop nest hierarchy

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant