本發(fā)明涉及一種同步數(shù)據(jù)流程序的形式化編譯方法,尤其涉及將同步語(yǔ)言SIGNAL編譯并自動(dòng)生成串行C代碼。
背景技術(shù):
安全關(guān)鍵嵌入式系統(tǒng)廣泛應(yīng)用于航空電子、航天器及核能控制等領(lǐng)域,這類系統(tǒng)也被稱為反應(yīng)式系統(tǒng)(reactive systems),因?yàn)橄到y(tǒng)不斷地和環(huán)境在進(jìn)行交互。其中,環(huán)境可以是一些被系統(tǒng)控制的物理設(shè)備,也可以是操作人員或其他反應(yīng)式系統(tǒng)。這類系統(tǒng)從環(huán)境中接收輸入,經(jīng)過(guò)計(jì)算得到輸出信息,并最終將輸出信息輸出到環(huán)境。同步編程方法,基于同步假設(shè)理論,非常適合用來(lái)設(shè)計(jì)這類系統(tǒng)。首先,計(jì)算過(guò)程的時(shí)間被抽象為0,這使得系統(tǒng)行為被劃分成離散的邏輯時(shí)刻序列。在每個(gè)邏輯時(shí)刻,系統(tǒng)的輸入-計(jì)算-輸出時(shí)間為0。其次,不同輸入事件的發(fā)生順序被抽象為事件之間的相對(duì)順序。雖然物理時(shí)鐘被抽象,但系統(tǒng)固有的功能特性并未改變,所以同步編程方法是在平臺(tái)無(wú)關(guān)層次上表達(dá)和驗(yàn)證系統(tǒng)的功能特性。
目前有ESTEREL、LUSTRE、SIGNAL和QUARTZ等同步語(yǔ)言,它們可以看作同步假設(shè)理論的不同實(shí)現(xiàn)。其中,ESTEREL、LUSTRE以及QUARTZ語(yǔ)言使用純同步模式(Perfect Synchrony),即存在一個(gè)全局時(shí)鐘(單時(shí)鐘),而SIGNAL語(yǔ)言使用多態(tài)同步模式(Polychrony),即多時(shí)鐘,能夠更自然和方便地表達(dá)分布式系統(tǒng)。
同步語(yǔ)言編譯過(guò)程并不局限于代碼生成:首先需要分析同步模型是否可執(zhí)行。同步數(shù)據(jù)流語(yǔ)言SIGNAL編譯過(guò)程中的時(shí)鐘演算分析是很重要的一步,而代碼生成是根據(jù)時(shí)鐘演算得來(lái)的。時(shí)鐘演算包含多個(gè)步驟,例如進(jìn)程間的同步,也就是時(shí)鐘關(guān)系等式系統(tǒng)的構(gòu)造;時(shí)鐘等式系統(tǒng)的消解;代碼自動(dòng)生成所依賴的時(shí)鐘樹的構(gòu)建等。
技術(shù)實(shí)現(xiàn)要素:
發(fā)明目的:對(duì)安全關(guān)鍵系統(tǒng)來(lái)說(shuō),一方面,完善生成代碼的控制結(jié)構(gòu)非常重要。在SIGNAL編譯器中,抽象時(shí)鐘表達(dá)的控制流用于得到代碼自動(dòng)生成的控制結(jié)構(gòu)。因此,時(shí)鐘演算的質(zhì)量對(duì)實(shí)現(xiàn)的正確性和效率影響很大。另一方面,編譯器也被要求必須經(jīng)過(guò)形式化驗(yàn)證來(lái)確保保留了源程序的語(yǔ)義。我們提出了一種SIGNAL編譯過(guò)程的形式化方法,用CAML語(yǔ)言實(shí)現(xiàn)。這是為了下一步使用定理證明-驗(yàn)證編譯器方法來(lái)驗(yàn)證我們的編譯器。在我們的形式化方法中,已經(jīng)考慮了現(xiàn)有的優(yōu)化方案。和轉(zhuǎn)換確認(rèn)(Translation Validation)方法相比,我們把編譯器看作一個(gè)“白盒”。在定理證明一驗(yàn)證編譯器方法中,源程序改變,不需重新驗(yàn)證編譯器。然而,這類方法也存在一個(gè)問(wèn)題,即編譯器發(fā)生任何改動(dòng),例如優(yōu)化和更新,證明過(guò)程需要重新驗(yàn)證。為了減輕這個(gè)問(wèn)題,我們提出了一個(gè)適當(dāng)?shù)哪K化結(jié)構(gòu)來(lái)支持我們的形式化方法,這意味著,當(dāng)編譯器的某些模塊發(fā)生改變,只需要對(duì)相應(yīng)部分進(jìn)行重新證明。
技術(shù)方案:一個(gè)SIGNAL形式化編譯并自動(dòng)生成串行C代碼的編譯器,基于模塊化結(jié)構(gòu)設(shè)計(jì)技術(shù),將編譯過(guò)程分為用戶程序的標(biāo)準(zhǔn)化、SIGNAL進(jìn)程間的同步、時(shí)鐘等式系統(tǒng)的消解、時(shí)鐘等式的分層表示和代碼自動(dòng)生成五個(gè)模塊,采用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML來(lái)編程,一旦編譯器需要改進(jìn)或優(yōu)化,不需要驗(yàn)證整個(gè)編譯器,只需要驗(yàn)證對(duì)應(yīng)的模塊即可。
本發(fā)明還提供一種利用所述的編譯器實(shí)現(xiàn)的一種基于同步數(shù)據(jù)流程序編譯的形式化方法,用于將同步語(yǔ)言SIGNAL形式化編譯,
使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML描述同步語(yǔ)言SIGNAL的編譯過(guò)程的用戶程序標(biāo)準(zhǔn)化;
使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML描述同步語(yǔ)言SIGNAL的編譯過(guò)程的SIGNAL進(jìn)程間的同步;
使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML描述同步語(yǔ)言SIGNAL的編譯過(guò)程的時(shí)鐘等式系統(tǒng)的消解;
使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML描述同步語(yǔ)言SIGNAL的編譯過(guò)程的時(shí)鐘等式系統(tǒng)的分層表示;
使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML描述同步語(yǔ)言SIGNAL的編譯過(guò)程的代碼自動(dòng)生成。
進(jìn)一步的,所述的用戶程序標(biāo)準(zhǔn)化具體如下:在詞法分析,語(yǔ)法分析和類型檢查之后,編譯器將用戶程序轉(zhuǎn)換成標(biāo)準(zhǔn)化程序,其中用戶程序的聲明是由基本結(jié)構(gòu)和擴(kuò)展結(jié)構(gòu)表示,標(biāo)準(zhǔn)化程序只有基本結(jié)構(gòu);
A)用戶程序語(yǔ)法:
ty:表示SIGNAL的數(shù)據(jù)類型;
exp:表示SIGNAL的表達(dá)式,能夠是常數(shù)表達(dá)式或由四種基本結(jié)構(gòu)組成,Ident表示為信號(hào)的標(biāo)識(shí)符,等式中常量用CInt,CReal,CBool,CString和CChar表示,F(xiàn)unc,Delay,When和Default表示四種基本結(jié)構(gòu),F(xiàn)unc還表示時(shí)鐘的集合操作;
eqn:表示SIGNAL的等式,一個(gè)等式表示數(shù)據(jù)或時(shí)鐘之間的關(guān)系,Constraint表示時(shí)鐘的比較操作^<,^>,^#和^=;
decl:表示SIGNAL每個(gè)進(jìn)程中的局部聲明;
proc:表示SIGNAL中進(jìn)程,進(jìn)程proc是一組等式的集合(eqn list),表示信號(hào)間的時(shí)鐘關(guān)系和數(shù)據(jù)關(guān)系;此外,進(jìn)程包含進(jìn)程名,輸入信號(hào),輸出信號(hào)和局部聲明;
spec:一個(gè)SIGNAL程序表示為spec,即進(jìn)程的集合;
B)標(biāo)準(zhǔn)化后的語(yǔ)法,即k-signal:
sty:表示k-signal的數(shù)據(jù)類型,同SIGNAL;
sexp:表示k-signal的表達(dá)式,SIdent為變量表達(dá)式,SCReal等為常量表達(dá)式,SFunc為瞬時(shí)函數(shù)中一元或二元操作;
expSig:表示k-signal中的其余三種基本結(jié)構(gòu):延遲SDelay、條件采樣SWhen和確定性合并SDefault;
seqn:表示k-signal的等式,同SIGNAL;
kdecl:表示k-signal每個(gè)進(jìn)程中的局部聲明,同SIGNAL;
kproc:表示k-signal中進(jìn)程,同SIGNAL;
kspec:一個(gè)標(biāo)準(zhǔn)化后的SIGNAL程序表示為kspec;
基于k-signal語(yǔ)法,用戶程序?qū)?huì)扁平化,并且擴(kuò)展結(jié)構(gòu)將會(huì)轉(zhuǎn)換成基本結(jié)構(gòu)。
進(jìn)一步的,擴(kuò)展結(jié)構(gòu)到基本結(jié)構(gòu)的轉(zhuǎn)化規(guī)則為:
轉(zhuǎn)化規(guī)則0:基本規(guī)則,等式用基本結(jié)構(gòu)表示如下:
轉(zhuǎn)化規(guī)則1:抽象時(shí)鐘的集合操作:時(shí)鐘交集,并集,差集,表示如下,并且能用基本結(jié)構(gòu)如下:
轉(zhuǎn)化規(guī)則2:抽象時(shí)鐘的比較操作能夠用時(shí)鐘集合操作表示,從而進(jìn)一步能夠用基本結(jié)構(gòu)表示,表示為空時(shí)鐘:
進(jìn)一步的,所述SIGNAL進(jìn)程間的同步具體如下:首先給出擴(kuò)展的時(shí)鐘抽象表示,然后基于擴(kuò)展時(shí)鐘抽象給出SIGNAL基本結(jié)構(gòu)的時(shí)鐘同步關(guān)系;
擴(kuò)展的時(shí)鐘抽象表示:
clk:信號(hào)對(duì)應(yīng)的時(shí)鐘,分為Hat和Nonhat;
clkexpr:時(shí)鐘表達(dá)式,其中數(shù)值型表達(dá)式看作一個(gè)復(fù)雜的關(guān)系表達(dá)式;
clkeq:時(shí)鐘等式;
clkeqs:時(shí)鐘等式集合;
擴(kuò)展時(shí)鐘的抽象表示定義如下,
SIGNAL基本結(jié)構(gòu)的抽象表示:
trans_eqns_clkeq_eqs:對(duì)每種基本結(jié)構(gòu)構(gòu)造其擴(kuò)展時(shí)鐘同步關(guān)系;
trans_pl_clkeq_pl:對(duì)一個(gè)進(jìn)程構(gòu)造其擴(kuò)展時(shí)鐘同步關(guān)系;
基于擴(kuò)展時(shí)鐘的抽象表示,每種基本結(jié)構(gòu)的擴(kuò)展時(shí)鐘同步關(guān)系如下:
進(jìn)一步的,所述時(shí)鐘等式系統(tǒng)的消解具體如下:
CAML定義的消解時(shí)鐘等式系統(tǒng)程序語(yǔ)法:
nfs:表示一組標(biāo)準(zhǔn)化的時(shí)鐘方程;
unfs:表示一組非標(biāo)準(zhǔn)化的時(shí)鐘方程;
l:表示時(shí)鐘變量是否在時(shí)鐘方程的左側(cè);
r:表示時(shí)鐘變量是否在時(shí)鐘方程的右側(cè);
esmap:表示一個(gè)用以保存等價(jià)類和該等價(jià)類所包含的時(shí)鐘變量的對(duì)應(yīng)關(guān)系;
具體采用的方法如下:
步驟1:給定時(shí)鐘方程系統(tǒng)的任意方程eq,用NFS與之對(duì)應(yīng)的定義來(lái)替換eq兩邊的時(shí)鐘變量;這樣得到一個(gè)新公式eq’;
步驟2:如果eq’的左側(cè)是時(shí)鐘的表達(dá)式,其右側(cè)是一個(gè)時(shí)鐘變量,那么顛倒eq’;
步驟3:如果eq’的左側(cè)是一個(gè)時(shí)鐘變量,并且eq’的右側(cè)存在,那么執(zhí)行步驟5,否則執(zhí)行步驟6;
步驟4:如果eq’左側(cè)和右側(cè)都是時(shí)鐘表達(dá)式,則被稱為復(fù)雜的時(shí)鐘關(guān)系,那么執(zhí)行步驟5;
步驟5:把eq’代入U(xiǎn)NFS中,執(zhí)行步驟8;
步驟6:把eq’代入NFS中,執(zhí)行步驟7;
步驟7:用eq’來(lái)替換在UNFS中每個(gè)方程式ceq兩側(cè)的時(shí)鐘變量,得到一個(gè)新的方程ceq’,如果ceq’左側(cè)和右側(cè)是等價(jià)的,那么就從UNFS中消除它,否則,將它添加到UNFS;
步驟8:重復(fù)步驟1-7,直到在時(shí)鐘等式系統(tǒng)中沒有非標(biāo)準(zhǔn)的等式;
步驟9:如果UNFS是空的,則返回NFS,否則返回一個(gè)出錯(cuò)信息。
進(jìn)一步的,所述時(shí)鐘等式系統(tǒng)的分層表示具體如下:
var_in_sexp:表示判斷兩個(gè)時(shí)鐘方程的先后順序;
dass:表示賦值行為;
input:表示輸入行為;
output:表示輸出行為;
cass:表示等價(jià)類;
具體采用的方法如下:
步驟1:獲取一個(gè)排序列表中的元素;
步驟2:如果當(dāng)前元素是通過(guò)簡(jiǎn)化范式(Reduced Normal Form)的方程,即它是時(shí)鐘等價(jià)類之間的關(guān)系,也稱為規(guī)約時(shí)鐘方程,那么在時(shí)鐘樹中能夠找到它的分支,并找到基于時(shí)鐘包含關(guān)系的一個(gè)合適插入地點(diǎn),然后對(duì)于方程左側(cè)的等價(jià)類創(chuàng)建一個(gè)新的節(jié)點(diǎn);
步驟3:如果當(dāng)前元素是作為輸入,輸出,或者一個(gè)賦值操作,那么能夠找到已經(jīng)被插入在時(shí)鐘樹中的相應(yīng)等價(jià)類,并將此操作插入到對(duì)應(yīng)等價(jià)類的操作列表,在這里并不需要排序的操作列表,因?yàn)樗麄円呀?jīng)在排序列表被排序;
步驟4:重復(fù)步驟1-步驟3中,直到在排序列表中沒有元素。
進(jìn)一步的,所述時(shí)鐘代碼自動(dòng)生成具體如下:
pre_def:表示對(duì)應(yīng)c程序的頭文件部分,該部分生成在c程序文件內(nèi);
produce_types_file:表示對(duì)應(yīng)c程序的頭文件部分,該部分生成在一個(gè)獨(dú)立的存放頭文件中.h文件中;
produce_body_file:表示存放initialize()、step_initialize()、step_finalize()、step()函數(shù)的聲明;
produce_ext_proc_file:表示存放額外建立的函數(shù)的聲明;
io_code_not_op:在生成未優(yōu)化的c程序中,將signal中的信號(hào)轉(zhuǎn)化為對(duì)應(yīng)變量,以及在轉(zhuǎn)化過(guò)程中需要使用到的新聲明的變量;
io_code_op:在生成優(yōu)化后的c程序中,將signal中的信號(hào)轉(zhuǎn)化為對(duì)應(yīng)變量,以及在轉(zhuǎn)化過(guò)程中需要使用到的新聲明的變量;
code_body:用于生成c程序的代碼主體部分;
finalization_code:用于生成c程序的最后一部分,即step_finalize()函數(shù)。
有益效果:本發(fā)明涉及到一個(gè)SIGNAL形式化編譯并自動(dòng)生成串行C代碼的編譯器,該編譯器對(duì)用戶輸入的SIGNAL程序,都能自動(dòng)將其生成相應(yīng)的串行C代碼。該編譯器使用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML來(lái)編寫程序,因?yàn)镃AML程序可以用對(duì)應(yīng)的定理證明-驗(yàn)證編譯器方法來(lái)驗(yàn)證我們的編譯器的正確性,此方法對(duì)于不同的源程序,無(wú)需重新驗(yàn)證編譯器。此外,我們使用模塊化結(jié)構(gòu)來(lái)支持我們的形式化編譯,這樣一旦編譯器需要改進(jìn)或優(yōu)化,我們不需要驗(yàn)證整個(gè)編譯器,而只需要驗(yàn)證對(duì)應(yīng)的模塊即可。
附圖說(shuō)明
圖1:SIGNAL形式化編譯的模塊化體系結(jié)構(gòu);
圖2:SIGNAL程序的自動(dòng)代碼生成。
具體實(shí)施方式
下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的說(shuō)明:
1)工具總體概述
如圖1所示,該SIGNAL編譯器,基于模塊化結(jié)構(gòu)設(shè)計(jì)技術(shù),將編譯過(guò)程分為用戶程序的標(biāo)準(zhǔn)化、SIGNAL進(jìn)程間的同步、時(shí)鐘等式系統(tǒng)的消解、時(shí)鐘等式的分層表示和代碼自動(dòng)生成這五個(gè)模塊。為了便于以后用定理證明-驗(yàn)證編譯器方法來(lái)驗(yàn)證編譯器的正確性,我們采用函數(shù)式程序設(shè)計(jì)語(yǔ)言CAML來(lái)編程。
2)用戶程序的標(biāo)準(zhǔn)化
在我們的SIGNAL編譯器中,為了把合適的宏提供給用戶,擴(kuò)展結(jié)構(gòu)被定義為基本結(jié)構(gòu)的組合。所以,在詞法分析,語(yǔ)法分析和類型檢查之后,編譯器將用戶程序轉(zhuǎn)換成標(biāo)準(zhǔn)化程序,其中用戶程序的聲明是由基本結(jié)構(gòu)和擴(kuò)展結(jié)構(gòu)表示的,而標(biāo)準(zhǔn)化程序只有基本結(jié)構(gòu)。
CAML定義的簡(jiǎn)化的用戶語(yǔ)法:
●ty:表示SIGNAL的數(shù)據(jù)類型,例如integer,real,complex,boolean等;
●exp:表示SIGNAL的表達(dá)式,可以是常數(shù)表達(dá)式或由四種基本結(jié)構(gòu)組成,Ident表示為信號(hào)的標(biāo)識(shí)符,等式中常量用CInt,CReal,CBool,CString和CChar表示,F(xiàn)unc,Delay,When和Default表示四種基本結(jié)構(gòu),F(xiàn)unc還表示時(shí)鐘的集合操作,例如^+,^*和^-;
●eqn:表示SIGNAL的等式,一個(gè)等式表示數(shù)據(jù)或時(shí)鐘之間的關(guān)系,Constraint表示時(shí)鐘的比較操作^<,^>,^#和^=;
●decl:表示SIGNAL每個(gè)進(jìn)程中的局部聲明;
●proc:表示SIGNAL中進(jìn)程,進(jìn)程proc是一組等式的集合(eqn list),表示信號(hào)間的時(shí)鐘關(guān)系和數(shù)據(jù)關(guān)系。此外,進(jìn)程包含進(jìn)程名,輸出信號(hào),輸出信號(hào)和局部聲明;
●spec:一個(gè)SIGNAL程序表示為spec,即進(jìn)程的集合。
CAML定義的k-signal語(yǔ)法:
●sty:表示k-signal的數(shù)據(jù)類型,同SIGNAL;
●sexp:表示k-signal的表達(dá)式,SIdent為變量表達(dá)式,SCReal等為常量表達(dá)式,SFunc為瞬時(shí)函數(shù)中一元或二元操作;
●expSig:表示k-signal中的其余三種基本結(jié)構(gòu):延遲SDelay、條件采樣SWhen和確定性合并SDefault;
●seqn:表示k-signal的等式,同SIGNAL;
●kdecl:表示k-signal每個(gè)進(jìn)程中的局部聲明,同SIGNAL;
●kproc:表示k-signal中進(jìn)程,同SIGNAL;
●kspec:一個(gè)標(biāo)準(zhǔn)化后的SIGNAL程序表示為kspec。
基于k-signal語(yǔ)法,用戶程序?qū)?huì)扁平化,并且擴(kuò)展結(jié)構(gòu)將會(huì)轉(zhuǎn)換成基本結(jié)構(gòu)。擴(kuò)展結(jié)構(gòu)到基本結(jié)構(gòu)的轉(zhuǎn)化規(guī)則為:
轉(zhuǎn)化規(guī)則0:基本規(guī)則,等式用基本結(jié)構(gòu)表示如下:
轉(zhuǎn)化規(guī)則1:抽象時(shí)鐘的集合操作:時(shí)鐘交集,并集,差集,表示如下,并且能用基本結(jié)構(gòu)如下:
轉(zhuǎn)化規(guī)則2:抽象時(shí)鐘的比較操作能夠用時(shí)鐘集合操作表示,從而進(jìn)一步能夠用基本結(jié)構(gòu)表示,表示為空時(shí)鐘:
此外,SIGNAL語(yǔ)言中常量信號(hào)需要依據(jù)上下文來(lái)判斷其時(shí)鐘,我們使用延遲結(jié)構(gòu)來(lái)定義常量信號(hào)。例如,在等式y(tǒng)=2whenb和y′=2whenb′中,兩個(gè)常量信號(hào)2可能分別具有不同的時(shí)鐘,因此,我們使用x1=x1$init 2和x2=x2$init 2來(lái)分別定義兩個(gè)常量信號(hào)。
3)SIGNAL進(jìn)程間的同步
我們首先給出擴(kuò)展時(shí)鐘的抽象表示,然后給出SIGNAL基本結(jié)構(gòu)的時(shí)鐘同步對(duì)應(yīng)關(guān)系。
擴(kuò)展的時(shí)鐘抽象表示:
●clk:信號(hào)對(duì)應(yīng)的時(shí)鐘,分為Hat和Nonhat;
●clkexpr:時(shí)鐘表達(dá)式,其中數(shù)值型表達(dá)式看作一個(gè)復(fù)雜的關(guān)系表達(dá)式;
●clkeq:時(shí)鐘等式;
●clkeqs:時(shí)鐘等式集合;
對(duì)于條件采樣結(jié)構(gòu),如果信號(hào)x定義為數(shù)值表達(dá)式,例如一個(gè)整數(shù)比較或者一個(gè)復(fù)雜的boolean型表達(dá)式,那么SIGNAL把關(guān)系時(shí)鐘[x]和[-x]看作黑盒。當(dāng)x定義為復(fù)雜的Boolean型表達(dá)式,我們有和基于這種抽象表示,我們可以得到更精確的時(shí)鐘消解。此外,我們不對(duì)x為數(shù)值型表達(dá)式的情況進(jìn)行處理,并把它看作一個(gè)復(fù)雜的關(guān)系表達(dá)式C。
擴(kuò)展時(shí)鐘的抽象表示定義如下,
SIGNAL基本結(jié)構(gòu)的抽象表示:
●trans_eqns_clkeq_eqs:對(duì)每種基本結(jié)構(gòu)構(gòu)造其擴(kuò)展時(shí)鐘同步關(guān)系;
●trans_pl_clkeq_pl:對(duì)一個(gè)進(jìn)程構(gòu)造其擴(kuò)展時(shí)鐘同步關(guān)系;
基于擴(kuò)展時(shí)鐘的抽象表示,每種基本結(jié)構(gòu)的擴(kuò)展時(shí)鐘同步關(guān)系如下:
4)除了條件采樣結(jié)構(gòu)外,我們還擴(kuò)展了確定性合并的時(shí)鐘同步關(guān)系。對(duì)于結(jié)構(gòu)x:=x1default x2,它被分成兩部分:x=x1與時(shí)鐘相對(duì)應(yīng),x=x2與時(shí)鐘相對(duì)應(yīng)。也就是說(shuō),增加了一個(gè)新的時(shí)鐘變量這個(gè)擴(kuò)展在時(shí)鐘樹結(jié)構(gòu)起很大作用,可以避免時(shí)鐘-數(shù)據(jù)環(huán)。
5)時(shí)鐘等式系統(tǒng)的消解
SIGNAL用時(shí)鐘關(guān)系表示數(shù)據(jù)流規(guī)約控制,在任一給定邏輯時(shí)刻,信號(hào)x的值再被計(jì)算之前,必須先測(cè)試x的時(shí)鐘是存在還是缺失,所以消解方法需要有效地檢查時(shí)鐘是否存在。
CAML定義的消解時(shí)鐘等式系統(tǒng)程序語(yǔ)法:
●nfs:表示一組標(biāo)準(zhǔn)化的時(shí)鐘方程。
●unfs:表示一組非標(biāo)準(zhǔn)化的時(shí)鐘方程。
●l:表示時(shí)鐘變量是否在時(shí)鐘方程的左側(cè)。
●r:表示時(shí)鐘變量是否在時(shí)鐘方程的右側(cè)。
esmap:表示一個(gè)用以保存等價(jià)類和該等價(jià)類所包含的時(shí)鐘變量的對(duì)應(yīng)關(guān)系。
具體采用的算法:
步驟1:給定時(shí)鐘方程系統(tǒng)的任意方程eq,用NFS與之對(duì)應(yīng)的定義(如果已經(jīng)被定義了)來(lái)替換eq兩邊的時(shí)鐘變量。這樣我們得到一個(gè)新公式eq’。
步驟2:如果eq’的左側(cè)是時(shí)鐘的表達(dá)式,其右側(cè)是一個(gè)時(shí)鐘變量,那么我們顛倒eq’。
步驟3:如果eq’的左側(cè)是一個(gè)時(shí)鐘變量,并且eq’的右側(cè)存在,那么執(zhí)行步驟5,否則執(zhí)行步驟6。
步驟4:如果eq’左側(cè)和右側(cè)都是時(shí)鐘表達(dá)式,則被稱為復(fù)雜的時(shí)鐘關(guān)系,那么執(zhí)行步驟5。
步驟5:把eq’代入U(xiǎn)NFS中,執(zhí)行步驟8。
步驟6:把eq’代入NFS中,執(zhí)行步驟7。
步驟7:用eq’來(lái)替換在UNFS中每個(gè)方程式ceq兩側(cè)的時(shí)鐘變量,這樣我們得到一個(gè)新的方程ceq’,如果ceq’左側(cè)和右側(cè)是等價(jià)的,那么我們就從UNFS中消除它,否則,我們將它添加到UNFS。
步驟8:重復(fù)步驟1-7,直到在時(shí)鐘等式系統(tǒng)中沒有非標(biāo)準(zhǔn)的等式。
步驟9:如果UNFS是空的,則返回NFS,否則返回一個(gè)出錯(cuò)信息。
5)時(shí)鐘等式系統(tǒng)的分層表示
經(jīng)過(guò)消解的時(shí)鐘等式能夠生成可執(zhí)行代碼。為了高效的應(yīng)用重寫和保持時(shí)鐘等式系統(tǒng)的三元組結(jié)構(gòu),我們使用了一種基于樹的等式表示,稱為時(shí)鐘樹。而且它也被用于檢查程序是否是時(shí)間可確定,稱為endochronous性質(zhì),即整個(gè)時(shí)鐘樹只存在一個(gè)根時(shí)鐘,這樣能夠生成一個(gè)對(duì)應(yīng)的確定性的串行可執(zhí)行程序。
CAML定義的時(shí)鐘等式系統(tǒng)分層表示:
●var_in_sexp:表示判斷兩個(gè)時(shí)鐘方程的先后順序。
●dass:表示賦值行為。
●input:表示輸入行為。
●output:表示輸出行為。
●cass:表示等價(jià)類。
這里構(gòu)造時(shí)鐘樹的算法:
步驟1:獲取一個(gè)排序列表中的元素。
步驟2:如果當(dāng)前元素是通過(guò)簡(jiǎn)化范式(Reduced Normal Form)的方程,即它是時(shí)鐘等價(jià)類之間的關(guān)系,也稱為規(guī)約時(shí)鐘方程,那么在時(shí)鐘樹中能夠找到它的限制分支,并找到基于時(shí)鐘包含關(guān)系的一個(gè)合適插入地點(diǎn),然后對(duì)于方程左側(cè)的等價(jià)類創(chuàng)建一個(gè)新的節(jié)點(diǎn);
步驟3:如果當(dāng)前元素是作為輸入,輸出,或者一個(gè)賦值這樣的操作,那么我們可以找到已經(jīng)被插入在時(shí)鐘樹中的相應(yīng)等價(jià)類,并將此操作插入到對(duì)應(yīng)等價(jià)類的操作列表(在這里我們并不需要排序的操作列表,因?yàn)樗麄円呀?jīng)在排序列表被排序)。
步驟4:重復(fù)步驟1-步驟3中,直到在排序列表中沒有元素。
6)代碼自動(dòng)生成
代碼生成基于之前所描述的程序轉(zhuǎn)換。從時(shí)鐘演算到構(gòu)成目標(biāo)語(yǔ)言程序,時(shí)鐘樹一直起著重要的指導(dǎo)作用。而數(shù)據(jù)依賴圖不僅在時(shí)鐘序列的局部有序的基本操作中起作用,還幫助在樹狀目標(biāo)代碼中增加了功能行為。這樣的代碼通用于不同的目標(biāo)語(yǔ)言中,包括主流的語(yǔ)言如C、C++、Java。
首先創(chuàng)建一個(gè)代碼生成樹,然后生成串行C代碼。其主體生成步驟見圖2。
CAML定義的代碼生成:
●pre_def:表示對(duì)應(yīng)c程序的頭文件部分,該部分生成在c程序文件內(nèi)。
●produce_types_file:表示對(duì)應(yīng)c程序的頭文件部分,該部分生成在一個(gè)獨(dú)立的存放頭文件中.h文件中。
●produce_body_file:表示存放initialize()、step_initialize()、step_finalize()、step()函數(shù)的聲明。
●produce_ext_proc_file:表示存放額外建立的函數(shù)的聲明。
●io_code_not_op:在生成未優(yōu)化的c程序中,將signal中的信號(hào)轉(zhuǎn)化為對(duì)應(yīng)變量,以及在轉(zhuǎn)化過(guò)程中需要使用到的新聲明的變量。
●io_code_op:在生成優(yōu)化后的c程序中,將signal中的信號(hào)轉(zhuǎn)化為對(duì)應(yīng)變量,以及在轉(zhuǎn)化過(guò)程中需要使用到的新聲明的變量。
●code_body:用于生成c程序的代碼主體部分。
●finalization_code:用于生成c程序的最后一部分,即step_finalize()函數(shù)。
通過(guò)時(shí)鐘演算來(lái)獲得時(shí)鐘樹的結(jié)果,能夠引導(dǎo)構(gòu)建目標(biāo)語(yǔ)言程序。此外,通過(guò)數(shù)據(jù)依賴關(guān)系不僅可以在序列中局部確定基本操作,而且還可以在分層目標(biāo)代碼中安排各部分運(yùn)行。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。