发明内容
针对上述技术问题,本发明提出了一种状态机的合并方法和装置,将每个功能部件的状态机合并为一个复合状态机,并只需要使用一个配置文件控制这个状态机,从而大大减少编写状态机和算法应用程序的工作量,使得状态机操控硬件的微码程序设计工作大大简化,并且程序的可复用性和可调试性都得到了很大的提高。
为了实现上述目的,作为本发明的一个方面,本发明提出了一种状态机的合并方法,包括以下步骤:
步骤1,对输入的所有子状态机的状态进行分析,并将所述所有子状态机的状态转换图转变为顺序连接的一个或多个状态块;
步骤2,将输入的所有子状态机的首个状态块取出,判断这些状态块的可拼接性和输出子状态机的拼接类型;
若该步骤判定可拼接性是采用拼接规则,且拼接类型是全顺序块类型、全循环块类型或全嵌套循环块类型之一,则判断循环次数是否相同,若相同则将所有输入子状态机放入步骤5的输入中,直到本次输入中没有子状态机时跳到步骤5,若循环次数不相同则采用等价变换规则判定,跳转至步骤3进行子状态机提取规则判定;
若该步骤判定可拼接性是采用等价变换规则,且拼接类型是有嵌套循环块的全循环块类型,则将当前状态块为循环块的子状态机放入下一次步骤2的输入中,将当前状态块为嵌套循环块的子状态机放入步骤3的输入中,直到本次输入中没有子状态机时跳到步骤3;
若该步骤判定可拼接性是采用等价变换规则,且拼接类型是非全顺序块类型,则将当前状态块为顺序块的子状态机放入下一次步骤2的输入中,将当前状态块为非顺序块的子状态机放入步骤3的输入中,直到本次输入中没有子状态机时跳到步骤3;
若该步骤判定可拼接性和输出的拼接类型不符合上述情况时,该方法输出子状态机不可拼接,该方法结束;
步骤3,接收符合等价变换规则的状态块,根据状态块组合的情况判定需要提取的状态数量并输出给步骤4;
步骤4,将输入的子状态机按照拼接类型进行等价变换,等价变换后的子状态机与输入子状态机功能完全一致,但状态块结构不同,并且等价变换后的子状态机状态块表示输出到步骤2的输入中替换原子状态机的状态块表示,重新做可拼接性判定;若输入的拼接类型是非全顺序块类型,则将输入的所有子状态机做抽取顺序块等价变换,若输入的拼接类型是有嵌套循环块的全循环块类型,则将输入的所有子状态机做抽取循环块等价变换,当输入中没有需要等价变换的子状态机时,跳转到步骤2;
步骤5,对输入的所有子状态机状态块进行拼接,输出合并状态机;若存在不能拼接的状态块,则跳转到步骤2。
其中,所述步骤1包括:
子步骤1.0,读取一个输入子状态机的当前状态,判断该状态是哪种状态块的起始状态,并跳转到相应状态块分析的子步骤;
子步骤1.1,收集符合顺序块特征的状态,并输出到一个顺序块中;
子步骤1.2,收集符合循环块特征的状态,并输出到一个循环块中,并记录循环块的循环条件;
子步骤1.3,识别并输出只有一个状态的循环状态块,并记录循环块的循环条件;
子步骤1.4,删除输入子状态机状态转换图中该嵌套循环的状态转换,并将该状态转换信息输出到子步骤1.5;以及
子步骤1.5,根据输入的状态,嵌套循环块的嵌套信息将子状态机的状态块表示输出到步骤2的输入中。
其中,所述的子步骤1.5包括以下步骤:
判断输入中是否有嵌套循环的循环条件,若有,则创建一个新的嵌套循环块,记录该嵌套循环块的结束状态,并将输入中的状态块放入该嵌套循环块中,并将该新嵌套循环块作为输入的状态块;
若当前有嵌套循环块未结束,则将输入的状态块放入当前嵌套循环块;
若输入的状态块是嵌套循环块则将当前嵌套循环块切换到输入的状态块;
若当前输入的状态块的最后一个状态是当前嵌套循环块标记的结束状态,则退出当前嵌套循环块,将当前嵌套循环块切换为上一层嵌套循环块,若不存在上一层嵌套循环块,则将该嵌套循环块输出到该子状态机的状态块表示中;
若当前没有嵌套循环块且输入不是嵌套循环块,则将输入的状态块输出到该子状态机的状态块表示中;
判断若当前状态是状态机的结束状态,则将该子状态机从子步骤1.0的输入中删除,若子步骤1.0的输入中没有子状态机则跳转到步骤2。
其中,步骤2中所述的输出子状态机的拼接类型包括:含有嵌套循环块的全循环块类型、非全顺序块类型、全顺序块类型、全循环块类型和全嵌套循环块类型。
其中,步骤3中所述的根据状态块组合的情况判定需要提取的状态数量并输出给步骤4进行子状态机等价变换的步骤包括:
判定当前状态块的组合情况,若为非全顺序块类型、含有嵌套循环块的全循环块类型或全循环块,则提取的规则是:
若当前状态块为非全顺序块类型,输出待提取数量为1,跳至步骤4;
若当前状态块为含有嵌套循环块的全循环块类型,则进入循环体并将循环块内部状态视为顺序块处理,递归调用该步骤并输出提取数量,跳至步骤4;以及
若当前状态块为全循环块,而各个循环块的已循环次数不同,此时提取数量为已循环数量之差与循环体内部状态数量的乘积,输出该待提取数量,跳至步骤4。
其中,所述的步骤5包括:
子步骤5.0,根据步骤2输出的拼接类型将输入中所有子状态机状态块表示放入到对应的子步骤输入中;
子步骤5.1,将输入的子状态机的当前状态块(肯定是顺序块)分别提取出一个状态,并将其合并成一个复合状态,将该复合状态放入子步骤5.5的输入中,并跳转到子步骤5.4;
子步骤5.2,将输入的子状态机的当前状态块(肯定是循环块)类型改变成顺序块,并将当前循环状态块的循环条件和循环结束状态位置放入步骤5.4的输入中,并跳转到子步骤5.4;
子步骤5.3,将输入的子状态机的当前状态块替换为该嵌套循环块内部的状态块集合,并将当前嵌套循环状态块的循环条件和循环结束状态位置放入步骤5.4的输入中,并跳转到子步骤5.4;并将替换嵌套循环块后的子状态机状态块表示放入步骤2的输入中替换原子状态机状态块表示;
子步骤5.4,用于记录和检查当前拼接状态是否在一个复合循环块的结束位置,并通知子步骤5.5输出循环状态转换以及循环状态转换的条件;以及子步骤5.5,用于输出输入中的复合状态和该复合状态的状态转换以及状态转换条件。
作为本发明的另一个方面,本发明还提出了一种状态机合并装置,包括:存储子状态机输入的模块1、状态块结构分析模块2、保存逻辑状态块的模块3、等价变换模块4、可拼接性和拼接规则判定模块5、待拼接状态块寄存模块6、流程控制模块7和状态块拼接模块8;其中
所述结构分析模块2接收所述存储子状态机输入的模块1输入的子状态机集合,输出标记类型的状态块,并存储在所述保存逻辑状态块的模块3中;
所述保存逻辑状态块的模块3用于存储逻辑状态块队列的存储器;
所述可拼接性和拼接规则判定模块5读取所述保存逻辑状态块的模块3中存储的逻辑状态块,经过比较和判定后输出不同类型待拼接的状态块并寄存在所述待拼接状态块寄存模块6中,其中可直接拼接的状态块输出给所述状态块拼接模块8进行拼接,需要进行等价变换的输出给所述等价变换模块4;
所述等价变换模块4将需要变换的情况进行变换后输出到所述保存逻辑状态块的模块3中存储的逻辑状态块队列中或者直接输出给所述状态块拼接模块8进行状态块拼接;
所述状态块拼接模块8实现所有状态块的拼接模块过程并输出合并结果,对于不能进行拼接的状态块终止拼接进程并输出错误信息;
所述流程控制模块7控制拼接流程的进行,根据待拼接状态机队列是否为空以及状态块拼接的过程控制整个拼接流程的持续向后推进和结束。
作为本发明的再一个方面,本发明还提出了一种状态机的合并装置,包括:
将输入子状态机的状态转换图转变为顺序连接的一个或若干个状态块的装置;
将输入中的所有子状态机的首个状态块取出,判断这些状态块的可拼接性和输出子状态机的拼接类型的装置;
接收符合等价变换规则的状态块,根据状态块组合的情况判定需要提取的状态数量并输出给下述等价变换装置进行子状态机等价变换的装置;
将输入的子状态机按照拼接类型进行等价变换,等价变换后的子状态机与输入子状态机功能完全一致,但状态块结构不同,并等价变换后的子状态机状态块表示输出到上述判断拼接类型的装置的输入中替换原子状态机的状态块表示,重新做可拼接性判定的装置;以及
根据上述判断拼接类型的装置输出的拼接类型将输入中所有子状态机状态块表示放入到对应的装置的输入中的装置。
其中,所述子状态机的拼接类型包括:含有嵌套循环块的全循环块类型、非全顺序块类型、全顺序块类型、全循环块类型和全嵌套循环块类型。
通过上述技术方案可知,本发明的合并状态机的方法和装置能够只使用一个配置文件控制整个状态机,从而大大减少编写状态机和算法应用程序的工作量,使得状态机操控硬件的微码程序设计工作大大简化,并且程序的可复用性和可调试性都得到了很大的提高。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明作进一步的详细说明。
本发明提出一种合并状态机的方法以及一个基于该方法的状态机合并装置。本发明的合并状态机的方法是通过将若干个独立状态机(简称子状态机),按照给定的步骤,组合为一个复杂的状态机(简称复合状态机),并且该方法保证复合状态机与原若干个子状态机的功能完全一致。若干个子状态机通常表现为一条流水线上用于控制各个流水级的状态机,其独立性表现为子状态机的状态转换时间和转换到的目标状态在各子状态机之间没有约束关系。复合状态机通常表现为一条流水线上用于控制各个流水级的一个状态机,该状态机的每个状态完成包含原所有子状态机在当前的状态。本发明的方法中所述给定的步骤包括:子状态机结构分析步骤、子状态机等价性判定步骤、子状态机提取规则判定步骤、子状态机等价变换步骤和子状态机拼接步骤。本发明的基于该方法的状态机合并装置是指能够接受一个或多个子状态机输入,执行该状态机合并方法中的所有步骤,输出复合状态机的装置。该装置可以辅助程序员仍然按照子状态机编写状态机的配置程序,并且得到合并后一个状态机的配置程序。下面对本发明的状态机合并方法和装置进行详细地阐述。
本发明提供了一种合并状态机的方法,包括以下步骤:子状态机结构分析步骤、子状态机等价性判断步骤、子状态机提取规则判定步骤、子状态机等价变换步骤和子状态机拼接步骤。
1.子状态机分析步骤
该步骤的作用是将输入子状态机的状态转换图转变为顺序连接的一个或多个状态块。子状态机的状态转换图包含一个或若干个状态,每个状态包含一个功能描述,包含一个和多个状态之间的连接线,每个连接线包含一个状态转换的条件。一个当前状态的前驱状态是指与当前状态通过连接线直接连接,连接线的起始端成为前驱状态,连接线的终止端为当前状态。一个当前状态的后继状态是指与当前状态通过连接线直接连接,连接线的起始端为当前状态,连接线的终止端称为当前状态的后继状态。状态块是包含一个或若干个状态或状态块的集合,其中集合的属性包括顺序、循环和嵌套循环。该步骤包含子状态机当前状态识别子步骤、顺序状态块分析子步骤、循环状态块分析子步骤、嵌套循环块分析子步骤、状态块输出子步骤。如图1所示。
1.0子状态机当前状态识别子步骤
该子步骤读取一个输入子状态机的当前状态,判断该状态是哪种状态块的起始状态,并跳转到相应状态块分析的子步骤。
若当前状态有且只有一个前驱状态和一个后继状态,则跳转到子步骤1.1;
若当前状态有且只有两个前驱状态和一个后继状态,跳到子步骤1.2;
若当前状态有且只有两个前驱状态和两个后继状态,且其中的一个前驱和一个后继是当前状态,则跳到子步骤1.3;
若当前状态为其他情况,则跳到子步骤1.4。
1.1顺序状态块分析子步骤
该子步骤收集符合顺序块特征的状态,并输出到一个顺序块中。其中顺序块包含一个或若干个状态,除第一个和最后一个状态外,每个状态有且只有一个前驱状态和一个后继状态。该子步骤的特征在于接收输入的当前状态,若当前状态的后继状态有且只有一个前驱状态和一个后继状态,则将当前状态切换为这个后继状态,重复此过程,若当前状态的后继状态不符合有且只有一个前驱状态和一个后继状态的条件,则标记该顺序块结束,将该状态块放入子步骤1.5的输入中,跳转到子步骤1.5,并将当前状态切换为后继状态。
1.2循环状态块分析子步骤
该子步骤收集符合循环块特征的状态,并输出到一个循环块中,并记录循环块的循环条件。其中循环状态块的特征是除了首尾两个状态外,其它状态都有且只有一个前驱状态和一个后继状态;第一个状态有2个前驱状态和1个后继状态;最后一个状态有1个前驱状态和2个后继状态,且状态块的第一个状态的一个前驱状态是状态块的最后一个状态,同理状态块的最后一个状态的一个后继状态是状态块的第一个状态。该子步骤的特征在于:接收输入的当前状态,若当前状态的后继状态有且只有一个前驱状态和一个后继状态,则将当前状态切换为这个后继状态,重复此过程;若当前状态的后继状态有且只有一个前驱状态和两个后继状态的条件,且其中一个后继状态是状态块的第一个状态,则接收当前状态的后继状态,标记该循环块结束,并将当前状态跳转到状态块的第一个状态的状态转换条件标记为循环条件,将状态块放入子步骤1.5的输入中,跳转到子步骤1.5,并将当前状态切换为循环块结束状态的其中一个后继状态,该后继状态不是循环块第一个状态;若当前状态的后继状态有两个或两个以上前驱状态,则标记当前接收的状态块为顺序块,将该顺序块放入子步骤1.4的输入,并跳转到步骤1.4,并将当前状态切换到顺序块的第一个状态。
1.3单状态循环块分析子步骤
该子步骤识别并输出只有一个状态的循环状态块,并记录循环块的循环条件。该子步骤的特征在于将当前状态输出到循环块中,并且将跳转到自身的状态转换条件标记为循环条件,将该状态块放入子步骤1.5的输入中,跳转到子步骤1.5,并将当前状态切换为后继状态。
1.4嵌套循环块分析子步骤
该子步骤删除输入子状态机状态转换图中该嵌套循环的状态转换,并将该状态转换信息输出到子步骤1.5。嵌套循环块不包含状态,包含一个或若干个子状态块,其中至少包含1个循环状态块或嵌套循环状态块。嵌套循环块可能包含循环状态块和顺序状态块的组合、循环状态块和循环状态块的组合以及多重嵌套组合等。该子步骤的特征在于,从当前状态的前驱状态中距离最远的状态,删除这个前驱状态到当前状态的状态转换,并将删除后的子状态机状态转换图放入子步骤1.0的输入中替换原子状态机的状态转换图,将删除的状态转换上状态转换条件标记为该嵌套循环块的循环条件,输出给子步骤1.5,若当前状态只有一个或没有前驱状态则跳转到分析错误,该拼接方法结束,若该步骤输入中有顺序块,则将顺序块放入子步骤1.5的输入中,并将当前状态切换为该顺序块最后一个状态的后继状态,否则将当前状态保持不变。
1.5状态块输出子步骤:
该子步骤根据输入的状态,嵌套循环块的嵌套信息将子状态机的状态块表示输出到步骤2的输入中。该子步骤的特征在于:判断输入中是否有嵌套循环的循环条件,若有,则创建一个新的嵌套循环块,记录该嵌套循环块的结束状态,并将输入中的状态块放入该嵌套循环块中,并将该新嵌套循环块作为输入的状态块;若当前有嵌套循环块未结束,则将输入的状态块放入当前嵌套循环块;若输入的状态块是嵌套循环块则将当前嵌套循环块切换到输入的状态块;若当前输入的状态块的最后一个状态是当前嵌套循环块标记的结束状态,则退出当前嵌套循环块,将当前嵌套循环块切换为上一层嵌套循环块,若不存在上一层嵌套循环块,则将该嵌套循环块输出到该子状态机的状态块表示中;若当前没有嵌套循环块且输入不是嵌套循环块,则将输入的状态块输出到该子状态机的状态块表示中。判断若当前状态是状态机的结束状态,则将该子状态机从子步骤1.0的输入中删除,若子步骤1.0的输入中没有子状态机则跳转到步骤2。
2.子状态机可拼接性和拼接规则判定步骤
该步骤将输入中的所有子状态机的首个状态块取出,判断这些状态块的可拼接性和输出子状态机的拼接类型。其中状态块的可拼接性是指是否存在一种规则能将所有输入子状态机的首个状态块拼接成一个状态块。其中规则包括拼接规则和等价变换规则。其中输出子状态机的拼接类型包括含有嵌套循环块的全循环块类型、非全顺序块类型、全顺序块类型、全循环块类型和全嵌套循环块类型。
若该步骤判定可拼接性是采用拼接规则,且拼接类型是全顺序块类型,全循环块类型或全嵌套循环块类型之一,则判断循环次数是否相同,相同则将所有输入子状态机放入步骤5的输入中,直到本次输入中没有子状态机时跳到步骤5,若循环次数不相同则采用等价变换规则判定,跳转至步骤3进行子状态机拼接规则判定;若该步骤判定可拼接性是采用等价变换规则,且拼接类型是有嵌套循环块的全循环块类型,则将当前状态块为循环块的子状态机放入下一次步骤2的输入中,将当前状态块为嵌套循环块的子状态机放入步骤3的输入中,直到本次输入中没有子状态机时跳到步骤3;
若该步骤判定可拼接性是采用等价变换规则,且拼接类型是非全顺序块类型,则将当前状态块为顺序块的子状态机放入下一次步骤2的输入中,将当前状态块为非顺序块的子状态机放入步骤3的输入中,直到本次输入中没有子状态机时跳到步骤3;
若该步骤判定可拼接性和输出的拼接类型不符合上述情况时,该方法输出子状态机不可拼接,该方法结束。
3.子状态机提取规则判定步骤
该步骤的特征是接收符合等价变换规则的状态块,根据状态块组合的情况判定需要提取的状态数量(待提取数量)并输出给步骤4进行子状态机等价变换。该步骤判定当前状态块的组合情况,可能为非全顺序块类型、含有嵌套循环块的全循环块类型、全循环块等几种情况之一,提取的规则是:
若当前状态块为非全顺序块类型,输出待提取数量为1,跳至步骤4;
若当前状态块为含有嵌套循环块的全循环块类型,则进入循环体并将循环块内部状态视为顺序块处理,递归调用该步骤并输出提取数量,跳至步骤4;
若当前状态块为全循环块,而各个循环块的已循环次数不同,此时提取数量为已循环数量之差与循环体内部状态数量的乘积,输出该待提取数量,跳至步骤4。
4.子状态机等价变换步骤
该步骤将输入的子状态机按照拼接类型进行等价变换,等价变换后的子状态机与输入子状态机功能完全一致,但状态块结构不同,并等价变换后的子状态机状态块表示输出到步骤2的输入中替换原子状态机的状态块表示,重新做可拼接性判定。若输入的拼接类型是非全顺序块类型,则将输入的所有子状态机做抽取顺序块等价变换,若输入的拼接类型是有嵌套循环块的全循环块类型,则将输入的所有子状态机做抽取循环块等价变换,当输入中没有需要等价变换的子状态机时,跳转到步骤2。
5.子状态机拼接步骤
该步骤将步骤2输出的状态块按照步骤2输出的类型进行拼接。该步骤包括拼接类型判断子步骤、顺序块拼接子步骤、循环块拼接子步骤、循环块尾部检查子步骤、拼接结果输出子步骤。如图2所示。
5.0拼接类型判断子步骤
该子步骤根据步骤2输出的拼接类型将输入中所有子状态机状态块表示放入到对应的子步骤输入中。
若2个当前拼接类型都是全顺序块类型,则跳转到子步骤5.1。
若2个当前拼接类型都是全循环块类型,则跳转到子步骤5.2。
若2个当前拼接类型中是全嵌套循环块类型,则跳转到子步骤5.3。
若当前状态块不能进行拼接,则返回步骤2。
5.1顺序块拼接子步骤
该子步骤将输入的子状态机的当前状态块(肯定是顺序块)分别提取出一个状态,并将其合并成一个复合状态,将该复合状态放入子步骤5.5的输入中,并跳转到子步骤5.4。此外,该子步骤将每个子状态机的当前状态块中的第一个状态删除,若删除后首个状态块中没有状态,则删除该状态块,将改变后的子状态机状态块表示放入步骤2的输入中替换原子状态机状态块表示,若删除状态块后子状态机状态块表示中没有剩余状态块,则将该子状态机从步骤2的输入中删除。
5.2循环块拼接子步骤
该子步骤将输入的子状态机的当前状态块(肯定是循环块)类型改变成顺序块,并将当前循环状态块的循环条件和循环结束状态位置放入步骤5.4的输入中,并跳转到子步骤5.4。此外,该子步骤将改变状态块类型后的子状态机状态块表示放入步骤2的输入中替换原子状态机状态块表示。
5.3嵌套循环块拼接子步骤
该子步骤将输入的子状态机的当前状态块(肯定是嵌套循环块)替换为该嵌套循环块内部的状态块集合,并将当前嵌套循环状态块的循环条件和循环结束状态位置放入步骤5.4的输入中,并跳转到子步骤5.4。此外,该子步骤将替换嵌套循环块后的子状态机状态块表示放入步骤2的输入中替换原子状态机状态块表示。
5.4循环块尾部检查子步骤
该子步骤用于记录和检查当前拼接状态是否在一个复合循环块的结束位置,并通知子步骤5.5输出循环状态转换以及循环状态转换的条件。该步骤的特征是:若输入中的循环条件和循环结束状态位置不为空,则将该输入保存在当前循环队列中,并且将当前拼接状态位置作为循环起始位置保存在当前循环队列中,跳转至步骤2;输入中的循环条件和循环结束状态位置为空,则检查当前拼接的状态位置是否与当前循环队列中保存的循环结束状态位置,若有匹配的项,则将对应的循环条件和循环起始地址放入子步骤5.5的输入中,并将该循环的信息从当前循环队列中删除,重复此过程,直到当前循环队列中没有匹配的项为止,跳转到子步骤5.5。
5.5拼接结果输出子步骤
该子步骤用于输出输入中的复合状态和该复合状态的状态转换以及状态转换条件。该子步骤的特征是,将输入中的复合状态输出到复合状态机中,并添加一个该状态的输入状态转换,前驱是复合状态机的最后一个状态;若输入中存在循环条件和循环起始状态位置,则添加一个该状态的输出状态转换,其后继是循环起始状态位置上的复合状态,其转换条件是循环条件,重复此过程直到输入中没有循环条件和循环起始状态位置为止。若此时步骤2中没有子状态机的状态块表示则该方法成功结束,否则跳转到步骤2。
合并状态机的装置:
状态机合并装置如图3所示。包括状态块结构分析模块2、可拼接性和拼接规则判定模块5、等价变换模块4、状态块拼接模块8等几个功能性模块。辅助性模块包括存储子状态机输入的模块1、保存逻辑状态块的模块3、待拼接状态块寄存模块6、流程控制模块7,以及输出的错误信息9和输出的复合状态机10。
该装置输入子状态机集合1,经过合并装置的处理后输出组合状态机10,或者对于不能拼接的状态机提示相应的错误信息9。
结构分析模块2实现了该方法中的子状态机结构分析步骤1,它接收装置的输入子状态机集合1,输出标记类型(顺序块、循环块、嵌套循环块)的状态块(逻辑状态块3)。
模块3是用于存储逻辑状态块队列的存储器。
等价判断模块5按照可拼接性和拼接规则判定步骤2进行设计。该模块读取模块3存储的逻辑状态块,经过比较和判定后输出不同类型待拼接的状态块并寄存在模块6中,其中可直接拼接的的状态块输出给状态块拼接模块8进行拼接,需要进行等价变换的根据拼接需要输出给等价变换模块4。
等价变换模块4实现了该方法的等价变换步骤。该模块将需要变换的情况进行变换后输出到逻辑状态块3队列中或者直接输出给状态块拼接模块8进行进行状态块拼接。
模块8按照步骤5子状态机拼接步骤进行设计。该模块实现所有状态块的拼接模块过程并输出复合状态机。对于不能进行拼接的状态块(非等价情况)终止拼接进程并输出错误信息。
流程控制单元7控制拼接流程的进行,根据待拼接状态机队列是否为空以及状态块拼接的过程控制整个拼接流程的持续向后推进和结束。
为使能清楚地理解本发明方法的流程,下面结合附图和只体实施例对本发明做进一步阐述。以一个简单的流水线为示例,说明指令状态机拼接的过程。
如图4所示的两个待拼接子状态机。子状态机1包括一个循环3次的状态A1,子状态机2包括一个单独的状态B1和一个循环3次的状态B2。
第一步:步骤1子状态机分析步骤
将接收子状态机1作为输入,进入子步骤1.0:
子步骤1.0:分析子状态机1,状态A1为当前状态,该状态有2个前驱和2个后继,且其中的一个前驱和一个后继是当前状态,跳至子步骤1.3。
子步骤1.3:当前状态A1符合循环状态块条件,将A1放入子步骤1.5中,跳至子步骤1.5。
子步骤1.5:输出循环块A1,循环次数为3,将子状态机1从步骤1.0输入中删除。子状态机1状态块分析结束。
将子状态机2输入至子步骤1.0。
子步骤1.0:分析子状态机2,状态B1为当前状态,该状态有1个前驱和1个后继,跳至子步骤1.1。
子步骤1.1:只有一个状态B1复合顺序块特征,标记顺序块结束,跳至子步骤1.5。
子步骤1.5:输出顺序块B1,跳至子步骤1.0,将当前状态修改为B2。
子步骤1.0:当前状态B2存在2个前驱和2个后继,且其中的一个前驱和一个后继是当前状态,跳至子步骤1.3。
子步骤1.3:当前状态B2符合循环状态块条件,将B2放入子步骤1.5中,跳至子步骤1.5。
子步骤1.5:输出循环块B2,循环次数为3,将子状态机2从步骤1.0输入中删除。子状态机2状态块分析结束。步骤1结束,跳至步骤2。
此时步骤1结束输出的状态块为:循环块A1,循环次数为3;顺序块B1;循环块B2,循环次数为3。输出至逻辑状态块寄存器(参见图3中的模块3)中,如图5所示。
第二步:步骤2子状态机可拼接性和拼接规则判定步骤
取出子状态机1和子状态机2的第一个状态块。首先判定可拼接性,两个状态块分别是循环块和顺序块,不可直接拼接。将循环块A1输出到步骤4中,顺序块B1输出到下一次步骤2中,跳至步骤4。
第三步:步骤4子状态机等价变换步骤
将循环3次的循环块A1拆分为一个顺序块A1和一个循环2次的循环块A1,且第一个顺序块A1在前,他的后继状态是2次循环的循环块A1,跳至步骤2。见图6所示。
第四步:步骤2子状态机可拼接性和拼接规则判定步骤
子状态机1此时首个状态块为顺序块A1,子状态机2首个状态块为顺序块B1,符合拼接规则,可以进行状态块拼接。跳至步骤5。
第五步:步骤5子状态机拼接步骤
子步骤5.0:当前两个待拼接状态块都是顺序状态块,跳至子步骤5.1。
子步骤5.1:合并A1和B1作为新的复合状态块A1B1,跳至子步骤5.4。
子步骤5.4:输出拼接结果顺序块A1B1。删除队列中的A1顺序块和B1顺序块,子状态机1向后读取下一个状态块为2次的循环块A1,子状态机2向后读取下一个状态块为3次的循环块B2,待拼接队列不为空,返回子步骤5.0。
子步骤5.0:当前两个状态块不能拼接,返回步骤2。此时状态块如图7所示。
第六步:步骤2子状态机可拼接性和拼接规则判定步骤
判定拼接规则,A1的2次循环块和B2的3次循环块不可拼接,需要进行等价变换,将A1循环块和B2循环块输出至步骤3,跳至步骤4。
第七步:步骤4子状态机等价变换步骤
对应2次循环的循环块A1,将3次循环的循环块B2拆分为一个2次循环的循环块B2和1个顺序块B2,且2次循环块B2的一个后继状态为顺序块B2。跳至步骤2。此时状态块如图8所示。
第八步:步骤2子状态机可拼接性和拼接规则判定步骤
子状态机1此时首个状态块为2次循环块A1,子状态机2首个状态块为2次循环块B2,符合拼接规则,可以进行状态块拼接。跳至步骤5。
第九步:步骤5子状态机拼接步骤
子步骤5.0:当前两个待拼接状态块都是循环块且循环次数相同,跳至子步骤5.2。
子步骤5.2:合并循环块A1和B2作为新的2次复合循环块状态块A1B2,跳至子步骤5.4。
子步骤5.4:输出拼接结果2次循环块A1B2。删除队列中的A1循环块和B2循环块,子状态机1向后读取下一个状态块为空,子状态机2向后读取下一个状态块为顺序块B2,待拼接队列不为空,返回子步骤5.0。此时状态块如图9所示。
子步骤5.0:子状态机1的待拼接队列为空,输出剩余的子状态机2状态块B2加之当前复合状态机尾,清空子状态机2状态块队列,跳至子步骤5.4。
子步骤5.4:两个子状态机队列均为空,拼接结束,输出当前复合状态机:顺序块A1B1、2次循环块A1B2、顺序块B2。
最终拼接得到的复合状态机如图10所示。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。