CN101907999B - 超长指令字程序的二进制翻译方法 - Google Patents

超长指令字程序的二进制翻译方法 Download PDF

Info

Publication number
CN101907999B
CN101907999B CN 201010231147 CN201010231147A CN101907999B CN 101907999 B CN101907999 B CN 101907999B CN 201010231147 CN201010231147 CN 201010231147 CN 201010231147 A CN201010231147 A CN 201010231147A CN 101907999 B CN101907999 B CN 101907999B
Authority
CN
China
Prior art keywords
program
super
data flow
instruction word
long instruction
Prior art date
Application number
CN 201010231147
Other languages
English (en)
Other versions
CN101907999A (zh
Inventor
安虹
刘谷
徐光�
许牧
李小强
韩文廷
张倩
刘玉
Original Assignee
中国科学技术大学
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 中国科学技术大学 filed Critical 中国科学技术大学
Priority to CN 201010231147 priority Critical patent/CN101907999B/zh
Publication of CN101907999A publication Critical patent/CN101907999A/zh
Application granted granted Critical
Publication of CN101907999B publication Critical patent/CN101907999B/zh

Links

Abstract

本发明的实施例提出了一种超长指令字程序的二进制翻译方法,包括以下步骤:对程序中的超长指令字进行指令解码;还原所述程序中的控制流图以及数据流图;重建类数据流计算模型下的控制流图与数据流图;对所述程序进行超长指令字程序的二进制翻译。本发明提出的上述技术方案,能保证控制流计算模型的程序在类数据流处理器上执行的准确性,效率高,满足了类数据流处理器上数据依赖关系表达的特殊要求。本发明提出的上述方案实现简单,避免了专用编译器的设计开销,可以面向不同的类数据流体系结构处理器进行二进制翻译,并适用于多种目标平台,具有广泛的通用性。

Description

超长指令字程序的二进制翻译方法

技术领域

[0001] 本发明涉及软件移植技术领域,具体而言,本发明涉及超长指令字程序的二进制翻译方法。

背景技术

[0002] 二进制翻译(Binary Translation)是一种直接翻译可执行二进制程序的技术,能够解决不同指令集结构硬件平台之间软件移植的问题。二进制翻译可以分为静态翻译与动态翻译两类。静态翻译是在源处理器代码执行之前对其进行翻译。动态翻译则在程序运行时对执行到的片断进行翻译。静态翻译的代码执行效率较高。

[0003] VLIff (Very Long Instruction Word,超长指令字)把许多条指令构成一个很长的指令组合,用来增加运算速度以及开发指令级并行性。VLIW体系结构的处理器在一个长指令字中编码所有功能单元上的操作,采用集中控制的方式组织计算资源,编译器能够静态地精确调度每一个操作,大大简化了运行时的资源调度开销。VLIW在嵌入式芯片设计领域中扮演了重要的角色。

[0004] 传统的计算机模型分为控制流和数据流两大类。控制流的计算机又称为冯•诺依曼计算机,当代主流计算机主要采用这种体系结构模型。在这种结构中,通过程序计数器来控制指令的执行次序,需要用存储器或寄存器来暂存指令间传递的操作数。而在数据流的计算机中,指令按照数据流图来执行,指令间的依赖关系决定了指令的执行顺序,操作数无需用集中式的存储器或寄存器来暂存,生产者指令的计算结果直接传送到消费者指令操作数域指定的运算单元中,一旦指令执行所需要的全部操作数到达后指令就可以发射执行。

[0005] 类数据流计算模型将全局的控制流计算和局部的数据流计算结合起来。即,按控制流图将程序划分成若干个控制 相关的超块,在超块的内部实现局部的数据流驱动执行,而在超块之间由控制流驱动执行。所述的超块是指利用谓词执行技术将若干个基本块集合在一起形成的一段指令序列,仅有唯一的控制流入口,可有多个出口。这种计算模型不仅降低了数据流计算对硬件资源的要求,同时减少了用于依赖检测的集中式控制部件,有利于降低芯片功耗。

[0006] 为了在类数据流处理器上利用较为成熟的VLIW编译技术,产生高效的可执行代码,可以利用二进制翻译技术,采用静态翻译方法,将VLIW指令序列翻译成类数据流处理器上的超块序列。使用二进制翻译器可以避免设计全套的编译工具链所带来的高昂代价。但是,现在尚无针对数据流计算模型的二进制翻译技术。原因在于不同计算模型的指令集格式之间无法实现一一对应,类数据流指令间的操作数依赖关系也无法显式确定,必须结合指令上下文来确定指令的执行顺序。

[0007] 因此,有必要提出一种有效的超长指令字程序的二进制翻译方案,以提高代码的利用效率。

发明内容[0008] 本发明的目的旨在至少解决上述技术缺陷之一,特别是提出一种有效的超长指令字程序的二进制翻译方案,以提高代码的利用效率。[0009] 为了达到上述目的,本发明的实施例提出了一种超长指令字程序的二进制翻译方法,包括以下步骤:[0010] 对程序中的超长指令字进行指令解码;[0011] 还原所述程序中的控制流图以及数据流图;[0012] 重建类数据流计算模型下的控制流图与数据流图;[0013] 对所述程序进行超长指令字程序的二进制翻译。[0014] 根据本发明的实施例,所述对程序中的超长指令字进行指令解码包括:[0015] 解码获得并发执行的操作,并记录下每个操作的信息,所述操作的信息包括计算部件的操作码、寄存器读写的地址、访存操作的地址以及片上通信的位置信息。[0016] 根据本发明的实施例,所述还原所述程序中的控制流图以及数据流图为:[0017] 还原所述程序中的控制流图:确定并保存所述程序中指令的控制流方向;以及[0018] 还原所述程序中的数据流图:确定并保存指令间的数据依赖关系。[0019] 根据本发明的实施例,所述重建类数据流计算模型下的控制流图与数据流图包括:[0020] 调用超块生成算法确定超块的边界,将程序中的指令以超块为单位进行划分;[0021] 在所述还原所述程序中的数据流图的基础上,处理超块内部的数据和超块间的数据的依赖关系。[0022] 根据本发明的实施例,所述将程序中的指令以超块为单位进行划分包括:以每条超长指令字包含的指令组合成一个超块。[0023] 根据本发明的实施例,所述处理超块内部的数据和超块间的数据的依赖关系包括:[0024] 对超块内部的数据依赖,通过增加操作数域读写指令实现操作数的传递;[0025] 对超块间的数据依赖,通过增加寄存器读写操作来实现操作数传递。[0026] 根据本发明的实施例,所述对所述程序进行超长指令字程序的二进制翻译包括:[0027] 对所述程序进行超长指令进行静态翻译;[0028] 对所述程序进行超长指令进行指令调整和调度;以及[0029] 对所述程序进行超长指令进行指令编码与封装。[0030] 根据本发明的实施例,所述对所述程序进行超长指令进行静态翻译包括:[0031] 对解码得到的操作静态地翻译成类数据流的指令格式。[0032] 根据本发明的实施例,所述对所述程序进行超长指令进行指令调整和调度包括:[0033] 根据所述类数据流指令的格式限制对超块内部指令进行调整,使之满足指令格式的要求;[0034] 根据硬件信息对超块内部指令的放置进行调度,基于调度算法为每条指令分配硬件资源。[0035] 根据本发明的实施例,所述对所述程序进行超长指令进行指令编码与封装包括:[0036] 根据类数据流处理器的指令格式对指令进行编码,其后根据指令超块的封装规则进行指令封装。[0037] 本发明提出的上述方案具有下列显著的优点:保证了控制流计算模型的程序在类数据流处理器上执行的准确性,效率高,满足了类数据流处理器上数据依赖关系表达的特殊要求。本发明提出的上述方案实现简单,避免了专用编译器的设计开销。本发明提出的上述方案可以面向不同的类数据流体系结构处理器进行二进制翻译,可以适用于多种目标平台,具有广泛的通用性。[0038] 本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。附图说明[0039] 本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:[0040] 图1为本发明实施例超长指令字程序的二进制翻译方法的流程图;[0041 ] 图2为TPA-PD使用的类数据流指令集格式示意图;[0042] 图3为超块封装格式示意图。具体实施方式[0043] 下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。[0044] 为了实现本发明之目的,本发明公开了一种超长指令字程序的二进制翻译方法,包括以下步骤:对程序中的超长指令字进行指令解码;还原所述程序中的控制流图以及数据流图;重建类数据流计算模型下的控制流图与数据流图;对所述程序进行超长指令字程序的二进制翻译。[0045] 如图1所示,为本发明实施例超长指令字程序的二进制翻译方法的流程图,包括以下步骤:[0046] SllO:对程序中的超长指令字进行指令解码。[0047] 在步骤SllO中,通过对程序进行指令解码,获得若干条并发执行的操作,记录下各个操作的信息,包括计算部件的操作码,寄存器读写的地址,访存操作的地址,片上通信的位置信息等。[0048] S120:还原程序中的控制流图以及数据流图。[0049] 在步骤S120中,包括还原程序控制流图以及还原程序数据流图。其中,还原所述程序中的控制流图包括:确定并保存所述程序中指令的控制流方向。还原所述程序中的数据流图包括:确定并保存指令间的数据依赖关系。[0050] S130:重建类数据流计算模型下的控制流图与数据流图。[0051] 在步骤S130中,重建类数据流计算模型下的控制流图与数据流图包括:[0052] 调用超块生成算法确定超块的边界,将程序中的指令以超块为单位进行划分;[0053] 在所述还原所述程序中的数据流图的基础上,处理超块内部的数据和超块间的数据的依赖关系。[0054] 调用的算法可以根据具体情况确定,例如,一种简单的处理方式为,可以以每条超长指令字包含的指令组合成一个超块。[0055] 具体而言,处理超块内部的数据和超块间的数据的依赖关系包括:[0056] 对超块内部的数据依赖,通过增加操作数域读写指令实现操作数的传递;对超块间的数据依赖,通过增加寄存器读写操作来实现操作数传递。[0057] S140:对所述程序进行超长指令字程序的二进制翻译。[0058] 在步骤S140中,对所述程序进行超长指令字程序的二进制翻译包括以下步骤:[0059] 对所述程序进行超长指令进行静态翻译;[0060] 对所述程序进行超长指令进行指令调整和调度;以及[0061] 对所述程序进行超长指令进行指令编码与封装。[0062] 具体而言,对程序进行超长指令进行静态翻译包括:[0063] 对解码得到的操作静态地翻译成类数据流的指令格式。[0064] 具体而言,对程序进行超长指令进行指令调整和调度包括:[0065] 根据所述类数据流指令的格式限制对超块内部指令进行调整,使之满足指令格式的要求;[0066] 根据硬件信息对超块内部指令的放置进行调度,基于调度算法为每条指令分配硬件资源。[0067] 具体而言,对程序进行超长指令进行指令编码与封装包括:[0068] 根据类数据流处理器的指令格式对指令进行编码,其后根据指令超块的封装规则进行指令封装。[0069] 本发明提出的上述方案具有下列显著的优点:保证了控制流计算模型的程序在类数据流处理器上执行的准确性,效率高,满足了类数据流处理器上数据依赖关系表达的特殊要求。本发明提出的上述方案实现简单,避免了专用编译器的设计开销。本发明提出的上述方案可以面向不同的类数据流体系结构处理器进行二进制翻译,可以适用于多种目标平台,具有广泛的通用性。[0070] 为了更好的理解本发明的技术方案,以下通过进一步的实施例对本发明作进一步描述。[0071] 以下基于KLBT作为本项实施例,KLBT是分片式流处理器TPA-PD上面向VLIW可执行程序的二进制翻译器。[0072] TPA-PD是一款分片式流处理器,作为主机的一个协处理器完成计算任务。在主机和TPA-PD系统上实现两级的流编程模型,其中计算密集的核心级程序在TPA-PD上执行。面向另一款VLIW指令的流处理器Imagine使用核心级编译器IS⑶将KernelC语言编写的核心级程序编译成VLIW格式的微代码。KLBT以该二进制代码为输入,应用本发明所述的二进制翻译方法,产生可在TPA-PD上执行的类数据流指令二进制微码作为输出。KLBT的实现的二进制翻译方法步骤包括:[0073] 步骤1:对输入的VLIW格式的微代码进行解码。[0074] VLIW微码长度是569bit,对于以下每个部件都有一个对应的指令域:3个加法器、2个乘法器、一个除法/开方部件、便签簿存储区、通讯单元、微控制器单元中循环控制单元等。每个部件的指令域又包括以下子域:部件的操作码、条件码寄存器文件的读地址、LRF(本地寄存器文件)的读地址、LRF的写地址、LRF写端口的交叉开关地址编号。通过创建一个全局的数组VLIW_DeCOde来保存解码后的每一条VLIW指令的相关信息,其中包括计算部件操作,访存操作,寄存器读写操作和通信操作。[0075] 步骤2:对程序还原控制流图[0076] 由于KernelC的语法只允许循环作为控制转移指令,可以通过寻找循环指令来确定程序的控制流图。对于以索引计数作为循环控制检测的指令有下列两种组合,分别判断循环索引变量count的值是否为零来决定是否跳转到offset指定的指令行号:[0077] CHECK_UCR(count);[0078] NLOOP, offset =常数;[0079]或[0080] CHECK_UCR_DEC (count)[0081] LOOP, offset =常数;[0082] 对于以流长度作为循环控制检测的指令也有两种组合,其中的CHECK_E0S(in)用于判断流的长度是否为零:[0083] CHECK_E0S(in);[0084] NL00P,offset =常数;[0085]或[0086] CHECK_E0S(in);[0087] LOOP, offset =常数;[0088] 在所有指令解码完成后,顺序搜索指令寻找和控制流相关的指令,参考相关的offset域,就可以还原整个kernel程序的控制流图。控制流图的表示是依靠在VLIW_Decoded数组的每一项中填写上所在基本块的起始指令编号和结束指令编号。[0089] 步骤3:还原程序数据流图[0090] 将VLIW解码提取出所有的有效的操作后,需要在这些操作间建立数据依赖关系,还原数据流图。这些操作间存在的寄存器依赖关系和指针依赖关系,寄存器依赖是指某个功能部件操作将结果写入LRF,另一个操作把写入的值作为自己的操作数,这两个操作间存在RAW关系。指针依赖是指对运算簇内部的便笺簿存储区(Scratch Pad)进行读写操作间的RAW关系,读写地址是不确定的,可以是动态生成的。寄存器依赖可以通过不同操作在不同的VLIW间静态的依赖关系来确定,而指针依赖由于访问数据的存放位置即地址值是动态确定的,所以不能直接建立操作间的RAW关系,只能按照操作在VLIW中的静态顺序来保证写操作和读操作间的顺序一致性。[0091] 在还原数据流图时,根据对寄存器读写的顺序,建立全局读写操作队列。不同的操作之间有寄存器依赖的就链接到对应操作的读写队列上。对全部操作经过一次遍历后即可还原程序的数据流图。[0092] 步骤4:构建类数据流计算模型下的控制流图和数据流图[0093] 可以使用任何一种超块生成算法来确定超块的边界。KLBT使用基本块作为超块的天然划分。对数据流图处理两种类型的数据依赖关系:[0094] (4.1)块间数据依赖:我们使用LREAD和LWRITE指令实现块间操作数传递,LREAD指令将操作数写到DT中便签簿存储器中,在需要这个操作数的block中LWRITE指令把操作数从便签簿中取出。[0095] (4.2)块内数据依赖:使用类数据流指令中的目标域来表示指令的操作数的传递方向。对于超过目标域个数限制的操作可能要增加操作数移动指令MOVT来实现操作数的传递。[0096] 步骤5:指令静态翻译[0097] (5.1)计算操作:直接按照SIMD的语义翻译成对应的数条类数据流计算指令。[0098] (5.2)控制流操作:将循环操作翻译成对应的寄存器指令和跳转指令序列。[0099] (5.3)通信操作:按照不同的通信模式,翻译成对应的寄存器指令和操作数移动指令序列。[0100] 步骤6:指令调整和调度[0101] 根据TPA-PD的硬件信息,使用超块的指令调度算法来分配发射槽、保留站等硬件资源。[0102] 步骤7:类数据流指令编码与封装[0103] 按照指令格式,对指令的各个域进行二进制编码。TPA-PD使用的类数据流指令集格式见图2。[0104] 当指令的域都填充好,就可以开始指令封装。指令封装是以超块为单位,将超块中的指令封装成适合TPA-PD处理器取指、发射的格式如图3所示。微码中每个超块中chunk的个数是静态确定的。ChunkO中存放寄存器读写指令。chunkl中有分支转移指令BRANCH,chunkl-chunk8分别存放其它计算与通信指令。[0105] 本领域普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。[0106] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。[0107] 上述提到的存储介质可以是只读存储器,磁盘或光盘等。[0108] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (6)

1.一种超长指令字程序的二进制翻译方法,其特征在于,包括以下步骤: 51、对程序中的超长指令字进行指令解码,包括:解码获得并发执行的操作,并记录下每个操作的信息;操作的信息包括计算部件的操作码、寄存器读写的地址、访存操作的地址以及片上通信的位置信息; 52、对经过步骤SI处理的程序,还原程序中的控制流图以及数据流图;还原程序中的控制流图包括:确定并保存程序中指令的控制流方向;还原程序中的数据流图包括:确定并保存指令间的数据依赖关系; 53、对经过步骤S2处理的程序,重建类数据流计算模型下的控制流图与数据流图,包括:调用超块生成算法确定超块的边界,将程序中的指令以超块为单位进行划分;在还原程序中的数据流图的基础上,处理超块内部的数据和超块间的数据的依赖关系; 54、对经过步骤S3处理的程序,对程序进行超长指令字程序的二进制翻译,包括:对程序进行超长指令进行静态翻译;对程序进行超长指令进行指令调整和调度;以及对程序进行超长指令进行指令编码与封装。
2.如权利要求1所述的超长指令字程序的二进制翻译方法,其特征在于,所述将程序中的指令以超块为单位进行划分包括: 以每条超长指令字包含的指令组合成一个超块。
3.如权利要求1所述的超长指令字程序的二进制翻译方法,其特征在于,所述处理超块内部的数据和超块间的数据的依赖关系包括: 对超块内部的数据依赖,通过增加操作数域读写指令实现操作数的传递; 对超块间的数据依赖,通过增加寄存器读写操作来实现操作数传递。
4.如权利要求1所述的超长指令字程序的二进制翻译方法,其特征在于,所述对程序进行超长指令进行静态翻译包括: 对解码得到的操作静态地翻译成类数据流的指令格式。
5.如权利要求4所述的超长指令字程序的二进制翻译方法,其特征在于,所述对程序进行超长指令进行指令调整和调度包括: 根据所述类数据流的指令格式限制对超块内部指令进行调整,使之满足指令格式的要求; 根据硬件信息对超块内部指令的放置进行调度,基于调度算法为每条指令分配硬件资源。
6.如权利要求5所述的超长指令字程序的二进制翻译方法,其特征在于,所述对程序进行超长指令进行指令编码与封装包括: 根据类数据流处理器的指令格式对指令进行编码,其后根据指令超块的封装规则进行指令封装。
CN 201010231147 2010-07-19 2010-07-19 超长指令字程序的二进制翻译方法 CN101907999B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201010231147 CN101907999B (zh) 2010-07-19 2010-07-19 超长指令字程序的二进制翻译方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201010231147 CN101907999B (zh) 2010-07-19 2010-07-19 超长指令字程序的二进制翻译方法

Publications (2)

Publication Number Publication Date
CN101907999A CN101907999A (zh) 2010-12-08
CN101907999B true CN101907999B (zh) 2013-06-26

Family

ID=43263465

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201010231147 CN101907999B (zh) 2010-07-19 2010-07-19 超长指令字程序的二进制翻译方法

Country Status (1)

Country Link
CN (1) CN101907999B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1378665A (zh) * 1999-06-10 2002-11-06 Pact信息技术有限公司 编程概念
US6686914B2 (en) * 2001-06-11 2004-02-03 General Electric Company Methods and systems for automatically translating geometric data

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101546271B (zh) * 2009-04-30 2012-01-04 上海交通大学 动态二进制翻译系统中超级块的寄存器分配方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1378665A (zh) * 1999-06-10 2002-11-06 Pact信息技术有限公司 编程概念
US6686914B2 (en) * 2001-06-11 2004-02-03 General Electric Company Methods and systems for automatically translating geometric data

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
二进制翻译中的函数返回类型恢复技术;吴伟峰等;《计算机应用》;20070430;第27卷(第04期);872-874 *
吴伟峰等.二进制翻译中的函数返回类型恢复技术.《计算机应用》.2007,第27卷(第04期),872-874.

Also Published As

Publication number Publication date
CN101907999A (zh) 2010-12-08

Similar Documents

Publication Publication Date Title
Hoffmann et al. Architecture exploration for embedded processors with LISA
JP3602857B2 (ja) 多機種対応型情報処理システム、および、方法
US6567895B2 (en) Loop cache memory and cache controller for pipelined microprocessors
US8332854B2 (en) Virtualized thread scheduling for hardware thread optimization based on hardware resource parameter summaries of instruction blocks in execution groups
Auerbach et al. Lime: a Java-compatible and synthesizable language for heterogeneous architectures
Kapasi et al. The Imagine stream processor
Nagarajan et al. A design space evaluation of grid processor architectures
Wolf et al. Multiprocessor system-on-chip (MPSoC) technology
US8037465B2 (en) Thread-data affinity optimization using compiler
Thies et al. A practical approach to exploiting coarse-grained pipeline parallelism in C programs
EP1569104A2 (en) An automated method for performing parallelization of sequential code and a computerized system adapted therefore
Zhu et al. A retargetable, ultra-fast instruction set simulator
CN102782672B (zh) 用于高效嵌入式同类多核平台的基于瓦片的处理器架构模型
KR19980032264A (ko) 벡터 프로세서 프로그래밍 및 벡터 프로세서와 risc 프로세서를 구비하는 비대칭 이중 프로세서의 병렬 프로그래밍
Agarwal et al. The RAW compiler project
Marwedel et al. Code generation for embedded processors
US20080320246A1 (en) Methods and apparatus for compiling instructions for a data processor
Lee et al. Dataflow architectures and multithreading
Gordon et al. Exploiting coarse-grained task, data, and pipeline parallelism in stream programs
Callahan et al. Instruction-level parallelism for reconfigurable computing
US7207038B2 (en) Constructing control flows graphs of binary executable programs at post-link time
CN102298514B (zh) 用于有效动态二进制变换的寄存器映射技术
Owaida et al. Synthesis of platform architectures from OpenCL programs
AU776972B2 (en) Program product and data processing system
JP4283131B2 (ja) プロセッサ及びコンパイル方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant