Files
TBgen_App/autoline/__pycache__/semantic_analyzer.cpython-312.pyc

225 lines
43 KiB
Plaintext
Raw Normal View History

2026-03-30 16:46:48 +08:00
<EFBFBD>
<00><><EFBFBD><00><00><><00>dZddlZddlZddlmZmZmZmZmZddl m
Z
m Z ddl m Z eje<0F>ZGd<06>de <0A>Ze
Gd<08>d <09><00>Ze
Gd
<EFBFBD>d <0B><00>Ze
Gd <0C>d <0A><00>Ze
Gd<0E>d<0F><00>Ze
Gd<10>d<11><00>Ze
Gd<12>d<13><00>Ze
Gd<14>d<15><00>ZGd<16>d<17>ZGd<18>d<19>ZGd<1A>d<1B>ZGd<1C>d<1D>ZGd<1E>d<1F>Zd ed!eeeffd"<22>Zd ed!eefd#<23>Z y)$a
Description : Semantic Analysis Layer (Layer 0)
- RTL Structure Parser
- Function Point Recognizer
- Importance Scorer
- Test Scenario Generator
Author : CGA Enhancement Project
Time : 2026/03/08
<EFBFBD>N)<05>List<73>Dict<63>Tuple<6C>Optional<61>Any)<02> dataclass<73>field)<01>Enumc<00>$<00>eZdZdZdZdZdZdZdZy)<08>FunctionPointTypeu功能点类型枚举<E69E9A>fsm<73>counter<65> condition<6F>protocol<6F> exceptionN) <09>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F>FSM<53>COUNTER<45> CONDITION<4F>PROTOCOL<4F> EXCEPTION<4F><00><00>@/home/zhang/CorrectBench/TBgen_App/autoline/semantic_analyzer.pyr r s<00><00><1F>
<0F>C<EFBFBD><17>G<EFBFBD><1B>I<EFBFBD><19>H<EFBFBD><1B>Irr c<00>P<00>eZdZUdZeed<eed<dZeed<dZeed<dZ eed<y )
<EFBFBD>Portu 端口信息<E4BFA1>name<6D> direction<6F><00>widthr<00>msb<73>lsbN<62>
rrrr<00>str<74>__annotations__r#<00>intr$r%rrrrr!s*<00><00><16>
<0A>I<EFBFBD><12>N<EFBFBD><12>E<EFBFBD>3<EFBFBD>N<EFBFBD><10>C<EFBFBD><13>L<EFBFBD><10>C<EFBFBD><13>Lrrc<00>P<00>eZdZUdZeed<eed<dZeed<dZeed<dZ eed<y )
<EFBFBD>Signalu 信号信息r <00> signal_typer"r#rr$r%Nr&rrrr+r++s+<00><00><16>
<0A>I<EFBFBD><14><14><12>E<EFBFBD>3<EFBFBD>N<EFBFBD><10>C<EFBFBD><13>L<EFBFBD><10>C<EFBFBD><13>Lrr+c<00>4<00>eZdZUdZeed<eed<dZeed<y)<07> Parameteru 参数信息r <00>value<75> parameter<65>
param_typeN)rrrrr'r(r1rrrr.r.5s<00><00><16>
<0A>I<EFBFBD> <0E>J<EFBFBD>!<21>J<EFBFBD><03>!rr.c<00>:<00>eZdZUdZeed<eed<eed<eed<y)<07>
CodeRegionu 代码区域<E58CBA>
start_line<EFBFBD>end_line<6E> region_type<70>contentN)rrrrr)r(r'rrrr3r3=s<00><00><16><13>O<EFBFBD><11>M<EFBFBD><14><14> <10>Lrr3c<00><><00>eZdZUdZeed<eed<eeefed<eed<dZ e
ed<dZ e ed <e e<0E>
<EFBFBD>Zeeefed <y ) <0A> FunctionPointu 功能点r <00>fp_type<70>location<6F> code_region<6F><00>importance_scoreF<65>covered<65><01>default_factory<72>
attributesN)rrrrr'r(r rr)r><00>floatr?<00>boolr <00>dictrBrrrrrr9r9FsP<00><00><13>
<0A>I<EFBFBD> <1E><1E><13>C<EFBFBD><13>H<EFBFBD>o<EFBFBD><1D><14><14>!<21><14>e<EFBFBD>!<21><19>G<EFBFBD>T<EFBFBD><19>!&<26>t<EFBFBD>!<<3C>J<EFBFBD><04>S<EFBFBD>#<23>X<EFBFBD><0E><rr9c<00>D<00>eZdZUdZeed<eed<eed<eed<eed<y)<08> TestScenariou测试场景建议r <00>target_function<6F> description<6F>priority<74> scenario_typeN)rrrrr'r(rCrrrrGrGRs!<00><00><1C>
<0A>I<EFBFBD><18><18><14><14><13>O<EFBFBD><16>rrGc<00><><00>eZdZUdZdZeed<ee<08><04>Z e
e ed<ee<08><04>Z e
e ed<ee<08><04>Ze
eed<ee<08><04>Ze
eed<ee<12><04>Zeee
efed <y
) <0B> RTLStructureuRTL结构信息<E4BFA1><00> module_namer@<00>ports<74>signals<6C>
parameters<EFBFBD> code_regions<6E>signal_dependenciesN)rrrrrOr'r(r <00>listrPrrrQr+rRr.rSr3rErTrrrrrMrM\sy<00><00><19><19>K<EFBFBD><13><19><1D>d<EFBFBD>3<>E<EFBFBD>4<EFBFBD><04>:<3A>3<>!<21>$<24>7<>G<EFBFBD>T<EFBFBD>&<26>\<5C>7<>"'<27><04>"=<3D>J<EFBFBD><04>Y<EFBFBD><0F>=<3D>%*<2A>4<EFBFBD>%@<40>L<EFBFBD>$<24>z<EFBFBD>"<22>@<40>05<30>d<EFBFBD>0K<30><17><14>c<EFBFBD>4<EFBFBD><03>9<EFBFBD>n<EFBFBD>-<2D>KrrMc<00>p<00>eZdZdZdefd<03>Zdefd<05>Zd<06>Zd<07>Z d<08>Z
d <09>Z d
<EFBFBD>Z d <0B>Z deefd <0C>Zdeefd <0A>Zy)<0F>RTLStructureParserul
RTL结构解析器
解析RTL代码的基础结构信息为后续分析提供结构化数据
<20>rtl_codec<00>\<00>||_|jd<01>|_t<00>|_y)<03>C
Args:
rtl_code: RTL源代码字符串
<20>
N)<05>code<64>split<69>linesrM<00> structure<72><02>selfrXs r<00>__init__zRTLStructureParser.__init__qs$<00><00>
<1D><04> <09><1D>^<5E>^<5E>D<EFBFBD>)<29><04>
<EFBFBD>%<25><1E><04>r<00>returnc<00><><00>|j<00>|j<00>|j<00>|j<00>|j <00>|j <00>|j S)u执行完整解析)<07>_parse_module_header<65> _parse_ports<74>_parse_signals<6C>_parse_parameters<72>_parse_code_regions<6E>_build_signal_dependenciesr_<00>ras r<00>parsezRTLStructureParser.parsezsT<00><00> <0C>!<21>!<21>#<23> <0C><19><19><1B> <0C><1B><1B><1D> <0C><1E><1E> <20> <0C> <20> <20>"<22> <0C>'<27>'<27>)<29><13>~<7E>~<7E>rc<00><><00>d}tj||jtj<00>}|r!|j d<02>|j
_yy)u解析模块头z6module\s+(\w+)\s*(?:#\s*\([^)]*\))?\s*(?:\(([^)]*)\))?r"N)<07>re<72>searchr\<00>DOTALL<4C>groupr_rO)ra<00>pattern<72>matchs rrez'RTLStructureParser._parse_module_header<65>s@<00><00>L<01><07><12> <09> <09>'<27>4<EFBFBD>9<EFBFBD>9<EFBFBD>b<EFBFBD>i<EFBFBD>i<EFBFBD>8<><05> <10>).<2E><1B><1B>Q<EFBFBD><1E>D<EFBFBD>N<EFBFBD>N<EFBFBD> &<26> rc <00><<00><08>ddg}|D<00>]}tj||j<00>D]<5D>}|jd<03>}|jd<04>rt |jd<04><00>nd}|jd<06>rt |jd<06><00>nd}|jd<07><00>t ||z
<00>dz}t <00>fd<08>|jjD<00><00>r<01><>|jjjt<00>||||<06> <09><00><00><><00><01>y
) u解析端口定义zF(input|output|inout)\s+(?:wire\s+|reg\s+)?(?:\[(\d+):(\d+)\]\s+)?(\w+)z3(input|output|inout)\s+(?:\[(\d+):(\d+)\]\s+)?(\w+)r"<00>r<00><00>c3<00><<00>K<00>|]}|j<00>k(<00><01><00>y<00>w<01>N<>r )<03>.0<EFBFBD>pr s <20>r<00> <genexpr>z2RTLStructureParser._parse_ports.<locals>.<genexpr><3E>s<00><><00><><00>H<>a<EFBFBD>1<EFBFBD>6<EFBFBD>6<EFBFBD>T<EFBFBD>><3E>H<><48><00><01>r r!r#r$r%N) rn<00>finditerr\rqr)<00>abs<62>anyr_rP<00>appendr) ra<00> port_patternsrrrsr!r$r%r#r s @rrfzRTLStructureParser._parse_ports<74>s<><00><><00> V<01> B<>
<EFBFBD> <0A>
%<25> <17>G<EFBFBD><1B><1B><1B>W<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD>8<> <17><05>!<21>K<EFBFBD>K<EFBFBD><01>N<EFBFBD> <09>-2<>[<5B>[<5B><11>^<5E>c<EFBFBD>%<25>+<2B>+<2B>a<EFBFBD>.<2E>)<29><11><03>-2<>[<5B>[<5B><11>^<5E>c<EFBFBD>%<25>+<2B>+<2B>a<EFBFBD>.<2E>)<29><11><03><1C>{<7B>{<7B>1<EFBFBD>~<7E><04><1B>C<EFBFBD>#<23>I<EFBFBD><0E><11>*<2A><05><1B>H<>4<EFBFBD>><3E>><3E>3G<33>3G<33>H<>H<><18>N<EFBFBD>N<EFBFBD>(<28>(<28>/<2F>/<2F><04>!<21>"+<2B>#<23><1F><1F> 1<16><17> <17> rc <00><<00><08>ddg}|D<00>]}tj||j<00>D]<5D>}|jd<03>}|jd<04>rt |jd<04><00>nd}|jd<06>rt |jd<06><00>nd}|jd<07><00>t ||z
<00>dz}t <00>fd<08>|jjD<00><00>r<01><>|jjjt<00>||||<06> <09><00><00><><00><01>y
) u解析内部信号定义z3(wire|reg|logic)\s+(?:\[(\d+):(\d+)\]\s+)?(\w+)\s*;z.(wire|reg|logic)\s+\[(\d+):(\d+)\]\s+(\w+)\s*;r"rurrvrwc3<00><<00>K<00>|]}|j<00>k(<00><01><00>y<00>wryrz)r{<00>sr s <20>rr}z4RTLStructureParser._parse_signals.<locals>.<genexpr><3E>s<00><><00><><00>J<>a<EFBFBD>1<EFBFBD>6<EFBFBD>6<EFBFBD>T<EFBFBD>><3E>J<>r~)r r,r#r$r%N) rnr<>r\rqr)r<>r<>r_rQr<>r+) ra<00>patternsrrrsr,r$r%r#r s @rrgz!RTLStructureParser._parse_signals<6C>s<><00><><00> C<01> =<3D>
<EFBFBD><08>
 <20> <17>G<EFBFBD><1B><1B><1B>W<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD>8<> <17><05>#<23>k<EFBFBD>k<EFBFBD>!<21>n<EFBFBD> <0B>-2<>[<5B>[<5B><11>^<5E>c<EFBFBD>%<25>+<2B>+<2B>a<EFBFBD>.<2E>)<29><11><03>-2<>[<5B>[<5B><11>^<5E>c<EFBFBD>%<25>+<2B>+<2B>a<EFBFBD>.<2E>)<29><11><03><1C>{<7B>{<7B>1<EFBFBD>~<7E><04><1B>C<EFBFBD>#<23>I<EFBFBD><0E><11>*<2A><05><1A>J<>4<EFBFBD>><3E>><3E>3I<33>3I<33>J<>J<><18>N<EFBFBD>N<EFBFBD>*<2A>*<2A>1<>1<>&<26>!<21>$/<2F>#<23><1F><1F> 3<16><17> <17> rc<00>$<00>d}tj||j<00>D]c}|jd<02>}|jd<03>j <00>}|j
j jt||d<04><05><00><00>ed}tj||j<00>D]c}|jd<02>}|jd<03>j <00>}|j
j jt||d<07><05><00><00>ey) u解析参数定义z6parameter\s+(?:\[(\d+):(\d+)\]\s+)?(\w+)\s*=\s*([^;]+)rvrwr0)r r/r1z7localparam\s+(?:\[(\d+):(\d+)\]\s+)?(\w+)\s*=\s*([^;]+)<29>
localparamN) rnr<>r\rq<00>stripr_rRr<>r.)ra<00> param_patternrsr r/<00>localparam_patterns rrhz$RTLStructureParser._parse_parameters<72>s<><00><00>R<01> <0A><17>[<5B>[<5B><1D><04> <09> <09>:<3A> <0F>E<EFBFBD><18>;<3B>;<3B>q<EFBFBD>><3E>D<EFBFBD><19>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>(<28>(<28>*<2A>E<EFBFBD> <10>N<EFBFBD>N<EFBFBD> %<25> %<25> ,<2C> ,<2C>Y<EFBFBD><19><1B>&<26>.<0E> <0F> <0F>X<01><1A><17>[<5B>[<5B>!3<>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>?<3F> <0F>E<EFBFBD><18>;<3B>;<3B>q<EFBFBD>><3E>D<EFBFBD><19>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>(<28>(<28>*<2A>E<EFBFBD> <10>N<EFBFBD>N<EFBFBD> %<25> %<25> ,<2C> ,<2C>Y<EFBFBD><19><1B>'<27>.<0E> <0F> rc <00><00>d}ttj||jtj<00><00>D]<5D>\}}|jd|j <00>j d<03>dz}|jd|j<00>j d<03>dz}|jjjt||d|jd<04><00><06><00><00><>d}ttj||j<00><00>D]w\}}|jd|j <00>j d<03>dz}|}|jjjt||d|jd<04><00><06><00><00>yy) u解析代码区域z&(always\s*@\s*\([^)]*\)\s*begin.*?end)Nr[r"<00>always)r4r5r6r7z(assign\s+\w+\s*=\s*[^;]+;)<29>assign) <0A> enumeraternr<>r\rp<00>start<72>count<6E>endr_rSr<>r3rq)ra<00>always_pattern<72>irsr<>r<><00>assign_patterns rriz&RTLStructureParser._parse_code_regions<6E>sB<00><00>C<01><0E>!<21>"<22>+<2B>+<2B>n<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD><12><19><19>"S<>T<> <0F>H<EFBFBD>A<EFBFBD>u<EFBFBD><18>I<EFBFBD>I<EFBFBD>n<EFBFBD>u<EFBFBD>{<7B>{<7B>}<7D>-<2D>3<>3<>D<EFBFBD>9<>A<EFBFBD>=<3D>E<EFBFBD><16>)<29>)<29>L<EFBFBD>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>[<5B>)<29>/<2F>/<2F><04>5<><01>9<>C<EFBFBD> <10>N<EFBFBD>N<EFBFBD> '<27> '<27> .<2E> .<2E>z<EFBFBD> <20><1C>$<24><1D> <0B> <0B>A<EFBFBD><0E> 0<0E> <0F> <0F>8<><0E>!<21>"<22>+<2B>+<2B>n<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD>"H<>I<> <0F>H<EFBFBD>A<EFBFBD>u<EFBFBD><18>I<EFBFBD>I<EFBFBD>n<EFBFBD>u<EFBFBD>{<7B>{<7B>}<7D>-<2D>3<>3<>D<EFBFBD>9<>A<EFBFBD>=<3D>E<EFBFBD><17>C<EFBFBD> <10>N<EFBFBD>N<EFBFBD> '<27> '<27> .<2E> .<2E>z<EFBFBD> <20><1C>$<24><1D> <0B> <0B>A<EFBFBD><0E> 0<0E> <0F> rc<00><><00>d}tj||j<00>D]S}|jd<02>}|jd<03>}tjd|<04>}||j
j |<<00>Ud}tj||jtj<00>D]<5D>}|jd<02>}tjd|<07>}|D]t\}}tjd|<04>}||j
j vrg|j
j |<|j
j |j|<05><00>v<00><>y)u构建信号依赖图zassign\s+(\w+)\s*=\s*([^;]+);r"ruz\b([a-zA-Z_][a-zA-Z0-9_]*)\bz&always\s*@\s*\([^)]*\)\s*begin(.*?)endz(\w+)\s*(?:<=|=)\s*([^;]+);N) rnr<>r\rq<00>findallr_rTrp<00>extend) rar<>rs<00>target<65>source<63>depsr<73><00>block<63>assignss rrjz-RTLStructureParser._build_signal_dependencies<65>s<00><00>:<3A><0E><17>[<5B>[<5B><1E><14><19><19>;<3B> ><3E>E<EFBFBD><1A>[<5B>[<5B><11>^<5E>F<EFBFBD><1A>[<5B>[<5B><11>^<5E>F<EFBFBD><15>:<3A>:<3A>=<3D>v<EFBFBD>F<>D<EFBFBD>9=<3D>D<EFBFBD>N<EFBFBD>N<EFBFBD> .<2E> .<2E>v<EFBFBD> 6<>  ><3E>C<01><0E><17>[<5B>[<5B><1E><14><19><19>B<EFBFBD>I<EFBFBD>I<EFBFBD>F<> H<01>E<EFBFBD><19>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>E<EFBFBD><18>j<EFBFBD>j<EFBFBD>!?<3F><15>G<>G<EFBFBD>")<29> H<01><0E><06><06><19>z<EFBFBD>z<EFBFBD>"A<>6<EFBFBD>J<><04><19><14><1E><1E>!C<>!C<>C<>AC<41>D<EFBFBD>N<EFBFBD>N<EFBFBD>6<>6<>v<EFBFBD>><3E><14><0E><0E>2<>2<>6<EFBFBD>:<3A>A<>A<>$<24>G<>  H<01>  Hrc<00><><00>|jjD<00>cgc]}|jdk(s<01>|j<00><02> c}Scc}w)u获取输入端口名列表<E58897>input<75>r_rPr!r <00>rar|s r<00>get_input_portsz"RTLStructureParser.get_input_portss/<00><00> $<24><0E><0E> 4<> 4<>O<>1<EFBFBD><01> <0B> <0B>w<EFBFBD>8N<38><01><06><06>O<>O<><4F>O<><00>?<04>?c<00><><00>|jjD<00>cgc]}|jdk(s<01>|j<00><02> c}Scc}w)u获取输出端口名列表<E58897>outputr<74>r<>s r<00>get_output_portsz#RTLStructureParser.get_output_ports s/<00><00> $<24><0E><0E> 4<> 4<>P<>1<EFBFBD><01> <0B> <0B>x<EFBFBD>8O<38><01><06><06>P<>P<><50>Pr<50>N)rrrrr'rbrMrlrerfrgrhrirjrr<>r<>rrrrWrWksb<00><00><08>
(<28><13>(<28><1E>|<7C><1E>8<><17>4<17>0<0F>0<0F>4H<01>.P<01><14>c<EFBFBD><19>P<01>Q<01>$<24>s<EFBFBD>)<29>QrrWc <00>z<00>eZdZdZdedefd<04>Zdeefd<06>Z d<07>Z
ded eede eee ffd
<EFBFBD>Z d <0B>Z d <0C>Zd <0A>Zd<0E>Zy)<10>FunctionPointRecognizeruK
功能点识别器
自动识别RTL代码中的关键功能点
rXr_c<00>.<00>||_||_g|_y)uj
Args:
rtl_code: RTL源代码
structure: 已解析的结构信息
N)r\r_<00>function_points)rarXr_s rrbz FunctionPointRecognizer.__init__s<00><00> <1D><04> <09>"<22><04><0E>46<34><04>rrcc<00><><00>|j<00>|j<00>|j<00>|j<00>|j <00>|j
S)u执行完整识别)<06>_recognize_fsm<73>_recognize_counters<72>_recognize_conditions<6E>_recognize_protocols<6C>_recognize_exceptionsr<73>rks r<00> recognizez!FunctionPointRecognizer.recognize$sJ<00><00> <0C><1B><1B><1D> <0C> <20> <20>"<22> <0C>"<22>"<22>$<24> <0C>!<21>!<21>#<23> <0C>"<22>"<22>$<24><13>#<23>#<23>#rc <00>0<00>g}d}tj||j<00>D]N}|jd<02>}tjd|<04>}|s<01>-|j |D<00>cgc]}|d<00><02> c}<06><00>P|syd}tj||jtj <00>D]<5D>}|jd<02>}|jd<07>} |j| |<01>}
|jd|j<00>jd<08>dz} |jd|j<00>jd<08>dz} td |<08><00>tj| | f|jd<04>|||
d
<EFBFBD><03> <0B>} |jj| <0A><00><>ycc}w) u识别状态机z#(?:parameter|localparam)\s+([^;]+);r"z([A-Z][A-Z0-9_]*)\s*=\s*(\d+)rNz(case\s*\(\s*(\w+)\s*\)(.*?)(?:endcase|$)rur[<00>FSM_)<03>state_variable<6C>states<65> transitions<6E>r r:r;r<rB)rnr<>r\rqr<>r<>rp<00>_extract_fsm_transitionsr<73>r<>r<>r9r rr<>r<>)ra<00> state_paramsr<73>rs<00>
params_str<EFBFBD>
state_defsr<EFBFBD><00> case_pattern<72> state_var<61> case_bodyr<79>r4r5<00>fps rr<>z&FunctionPointRecognizer._recognize_fsm-ss<00><00><1A> <0C>><3E> <0A><17>[<5B>[<5B><1D><04> <09> <09>:<3A> @<01>E<EFBFBD><1E><1B><1B>Q<EFBFBD><1E>J<EFBFBD><1B><1A><1A>$D<>j<EFBFBD>Q<>J<EFBFBD><19><1C>#<23>#<23>:<3A>$><3E>a<EFBFBD>Q<EFBFBD>q<EFBFBD>T<EFBFBD>$><3E>?<3F>  @<01><1C> <12>C<01> <0C><17>[<5B>[<5B><1C>t<EFBFBD>y<EFBFBD>y<EFBFBD>"<22>)<29>)<29>D<> ,<2C>E<EFBFBD><1D> <0B> <0B>A<EFBFBD><0E>I<EFBFBD><1D> <0B> <0B>A<EFBFBD><0E>I<EFBFBD><1F>7<>7<> <09><<3C>P<>K<EFBFBD><1D><19><19>><3E>E<EFBFBD>K<EFBFBD>K<EFBFBD>M<EFBFBD>2<>8<>8<><14>><3E><11>B<>J<EFBFBD><1B>y<EFBFBD>y<EFBFBD><1C>%<25>)<29>)<29>+<2B>.<2E>4<>4<>T<EFBFBD>:<3A>Q<EFBFBD>><3E>H<EFBFBD><1E><1B>I<EFBFBD>;<3B>'<27>)<29>-<2D>-<2D>$<24>h<EFBFBD>/<2F>!<21>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>&/<2F>*<2A>#.<2E><12>
<0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B>+ ,<2C><>%?s<00>! F
r<EFBFBD>r<>c<00> <00>i}d}tj||tj<00>D]<5D>}|jd<02>}|jd<03>}||vr<01>*g||<d}tj||<07>D]W} | jd<02>j <00>}
| jd<03>j <00>} ||j |
| d<05><02><00>Yd} tj | |<07>} | s<01><>||j d| jd<02>d<05><02><00><>|S)u提取 FSM 状态转换信息zB([A-Z][A-Z0-9_]*)\s*:(.*?)(?=[A-Z][A-Z0-9_]*\s*:|endcase|default:)r"ruzA(?:if|else\s*if)\s*\(([^)]+)\)\s*(?:next\s*=?|state\s*<=)\s*(\w+))r<00>
next_statez'else\s*(?:next\s*=?|state\s*<=)\s*(\w+)<29>default)rnr<>rprqr<>r<>ro)rar<>r<>r<><00>branch_patternrs<00> current_state<74> branch_code<64> cond_pattern<72>
cond_matchrr<><00>default_pattern<72> default_matchs rr<>z0FunctionPointRecognizer._extract_fsm_transitionsUs<00><00><18> <0B>_<01><0E><17>[<5B>[<5B><1E><19>B<EFBFBD>I<EFBFBD>I<EFBFBD>F<> <13>E<EFBFBD>!<21>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>M<EFBFBD><1F>+<2B>+<2B>a<EFBFBD>.<2E>K<EFBFBD><1C>F<EFBFBD>*<2A><18>)+<2B>K<EFBFBD> <0A> &<26>`<01>L<EFBFBD> <20>k<EFBFBD>k<EFBFBD>,<2C> <0B>D<> <13>
<EFBFBD>&<26>,<2C>,<2C>Q<EFBFBD>/<2F>5<>5<>7<> <09>'<27>-<2D>-<2D>a<EFBFBD>0<>6<>6<>8<>
<EFBFBD><1B>M<EFBFBD>*<2A>1<>1<>!*<2A>",<2C>3<12><13> <13>I<01>O<EFBFBD><1E>I<EFBFBD>I<EFBFBD>o<EFBFBD>{<7B>C<>M<EFBFBD><1C><1B>M<EFBFBD>*<2A>1<>1<>!*<2A>"/<2F>"5<>"5<>a<EFBFBD>"8<>3<12><13>/ <13>8<1B>rc <00>T<00>gd<01>}t<00>}|D]G}tj||j<00>D]"}|j |j d<02><00><00>$<00>I|D<00>]H}|<05>d<03>}g}tj||j<00>D]A}|j d<02>}t |j d<04><00>} |j|| d<05><02><00>Cd}
|jjD]} | j|k(s<01>| j}
n|<05>d<06>}tj||j<00>}|r2|jd|j<00>jd<08>dz} | } nd \} } td
|<05><00>t j"| | fd ||
|d <0C><03> <0A>}|j$j|<0E><00><01>Ky)u识别计数器)z(\w+)\s*<=\s*\1\s*\+\s*1z(\w+)\s*<=\s*\1\s*-\s*1z(\w+)\s*=\s*\1\s*\+\s*1z(\w+)\s*=\s*\1\s*-\s*1r"z\s*(>=|<=|==|>|<)\s*(\d+)ru)<02>operatorr/z\s*<=Nr[<00>rr<00>Counter_rN)<03> counter_namer#<00>
boundariesr<EFBFBD>)<13>setrnr<>r\<00>addrqr)r<>r_rQr r#ror<>r<>r9r rr<>)ra<00>counter_patterns<6E>counter_candidatesrrrsr<><00>boundary_patternr<6E><00>opr/r#<00>signalr4r5r<>s rr<>z+FunctionPointRecognizer._recognize_countersys<><00><00>
<EFBFBD><18>!<21>U<EFBFBD><1A>'<27> 7<>G<EFBFBD><1B><1B><1B>W<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD>8<> 7<><05>"<22>&<26>&<26>u<EFBFBD>{<7B>{<7B>1<EFBFBD>~<7E>6<> 7<> 7<>/<2F>$ ,<2C>L<EFBFBD>#/<2F>.<2E>0I<30>J<> <1C><1B>J<EFBFBD><1B><1B><1B>%5<>t<EFBFBD>y<EFBFBD>y<EFBFBD>A<> D<01><05><1A>[<5B>[<5B><11>^<5E><02><1B>E<EFBFBD>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>+<2B><05><1A>!<21>!<21>r<EFBFBD>E<EFBFBD>"B<>C<> D<01> <16>E<EFBFBD><1E>.<2E>.<2E>0<>0<> <1A><06><19>;<3B>;<3B>,<2C>.<2E>"<22>L<EFBFBD>L<EFBFBD>E<EFBFBD><19> <1A> '<27><1E>u<EFBFBD>-<2D>G<EFBFBD><16>I<EFBFBD>I<EFBFBD>g<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>1<>E<EFBFBD><14>!<21>Y<EFBFBD>Y<EFBFBD>~<7E><05> <0B> <0B> <0A>6<><<3C><<3C>T<EFBFBD>B<>Q<EFBFBD>F<>
<EFBFBD>%<25><08>'+<2B>$<24>
<EFBFBD>H<EFBFBD><1E><1F> <0C>~<7E>.<2E>)<29>1<>1<>$<24>h<EFBFBD>/<2F><1E>$0<>"<22>",<2C><12>
<0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B>I$ ,rc
<00><><00>d}d}ttj||j<00><00>D]<5D>\}}|j d<03>j <00>}|jd|j <00>jd<05>dz}|}tjd|<05>}td|dz<00><00>tj||f|j d<08>||d <09><02>
<EFBFBD>} |jj| <09><00><>y) u识别条件分支zp(if\s*\([^)]+\)(?:\s*begin)?(?:[^;]*?)(?:end)?(?:\s*else\s*(?:if\s*\([^)]+\))?(?:\s*begin)?(?:[^;]*?)(?:end)?)*)zif\s*\(([^)]+)\)r"Nr[z(>=|<=|==|>|<)\s*(\d+)<29>
Condition_r)r<00>boundary_valuesr<73>)r<>rnr<>r\rqr<>r<>r<>r<>r9r rr<>r<>)
ra<00>
if_pattern<EFBFBD>simple_if_patternr<6E>rsrr4r5r<>r<>s
rr<>z-FunctionPointRecognizer._recognize_conditions<6E>s<><00><00>I<02>
<EFBFBD>0<><19>!<21>"<22>+<2B>+<2B>.?<3F><14><19><19>"K<>L<> ,<2C>H<EFBFBD>A<EFBFBD>u<EFBFBD><1D> <0B> <0B>A<EFBFBD><0E>,<2C>,<2C>.<2E>I<EFBFBD><1D><19><19>><3E>E<EFBFBD>K<EFBFBD>K<EFBFBD>M<EFBFBD>2<>8<>8<><14>><3E><11>B<>J<EFBFBD>!<21>H<EFBFBD>!<21>j<EFBFBD>j<EFBFBD>)B<>I<EFBFBD>N<>O<EFBFBD><1E>!<21>!<21>A<EFBFBD>#<23><15>'<27>)<29>3<>3<>$<24>h<EFBFBD>/<2F>!<21>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>!*<2A>'6<><12> <0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B>' ,rc <00>~<00>gd<01>}i}|D]g\}}tj||jtj<00>D]0}|j d<02>}||vrg||<||j |<06><00>2<00>it |<02>dk\r=tdtjddd|d<08><02> <09>}|jj |<07>y
y
) u识别协议接口))z\b(valid|vld)\b<>valid)z\b(ready|rdy)\b<>ready)z\b(ack|acknowledge)\b<>ackr"ru<00>Protocol_Handshaker<65>rN<00> handshake)<02> protocol_typerQr<>N) rnr<>r\<00>
IGNORECASErqr<><00>lenr9r rr<>)ra<00>handshake_patterns<6E>handshake_signalsrrr,rs<00> signal_namer<65>s rr<>z,FunctionPointRecognizer._recognize_protocols<6C>s<><00><00>
<EFBFBD><1A> <1F><19>$6<> C<01> <20>G<EFBFBD>[<5B><1B><1B><1B>W<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD><12><1D><1D>G<> C<01><05>#<23>k<EFBFBD>k<EFBFBD>!<21>n<EFBFBD> <0B><1E>&7<>7<>57<35>%<25>k<EFBFBD>2<>!<21>+<2B>.<2E>5<>5<>k<EFBFBD>B<>  C<01> C<01> <0F> <20> !<21>Q<EFBFBD> &<26><1E>)<29>)<29>2<>2<><1F><1E>%0<>0<><12> <0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B> 'rc <00><><00>d}tj||jtj<00>D]Q}|j d<02>}t d|<03><00>t jddd|i<01><07>}|jj|<04><00>Sd}tj||j<00>r<t d t jddd
d i<01><07>}|jj|<04>y y ) u识别异常处理z1(?:output|wire)\s+(?:\[[\d:]+\]\s+)?(\w*error\w*)r"<00>
Exception_r<EFBFBD>rN<00> error_signalr<6C>z default\s*:<3A>Exception_DefaultCase<73>type<70> default_caseN) rnr<>r\r<>rqr9r rr<>r<>ro)ra<00> error_patternrsr<>r<>r<>s rr<>z-FunctionPointRecognizer._recognize_exceptions<6E>s<><00><00>M<01> <0A><17>[<5B>[<5B><1D><04> <09> <09>2<EFBFBD>=<3D>=<3D>I<> ,<2C>E<EFBFBD> <20>;<3B>;<3B>q<EFBFBD>><3E>L<EFBFBD><1E>!<21>,<2C><1E>0<>)<29>3<>3<><1F><1E>"<22>L<EFBFBD><12> <0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B> ,<2C>)<29><0F> <0A>9<EFBFBD>9<EFBFBD>_<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD> 0<><1E>,<2C>)<29>3<>3<><1F><1E><1A>N<EFBFBD><12> <0E>B<EFBFBD> <11> <20> <20> '<27> '<27><02> +<2B> 1rN)rrrrr'rMrbrr9r<>r<>rr<>r<>r<>r<>r<>rrrr<>r<>sw<00><00><08>
7<><13>7<><1C>7<>$<24>4<EFBFBD> <0A>.<2E>$<24>&,<2C>P"<1B>#<23>"<1B>t<EFBFBD>C<EFBFBD>y<EFBFBD>"<1B>T<EFBFBD>RU<52>W[<5B>\`<60>Wa<57>Ra<52>Mb<4D>"<1B>H3,<2C>j,<2C>8,<2C><,rr<>c
<00><00>eZdZdZej
dej dejdejdejdiZ
de e de fd<07>Zde e fd <09>Zd
e defd <0B>Zd
e defd <0C>Zd
e defd <0A>Zd
e defd<0E>Zdededefd<11>Zd
e defd<12>Zy)<14>ImportanceScoreruN
重要性评分器
为每个功能点计算语义重要性评分
<20>333333<33>?皙<><E79A99><EFBFBD><EFBFBD><EFBFBD>?g333333<33>?r<>r_c<00> <00>||_||_y)uk
Args:
function_points: 功能点列表
structure: RTL结构信息
N)r<>r_)rar<>r_s rrbzImportanceScorer.__init__s<00><00> /<2F><04><1C>"<22><04>rrcc<00><><00>|jD]}|j|<01>|_<00>|jjd<01>d<02><03>|jS)u'计算所有功能点的重要性评分c<00><00>|jSry)r><00><01>xs r<00><lambda>z(ImportanceScorer.score.<locals>.<lambda>*s <00><00><01>0B<30>0B<30>rT<><02>key<65>reverse)r<><00>_calculate_scorer><00>sort)rar<>s r<00>scorezImportanceScorer.score$sR<00><00><16>&<26>&<26> <<3C>B<EFBFBD>"&<26>"7<>"7<><02>";<3B>B<EFBFBD> <1F> <<3C> <0A><1C><1C>!<21>!<21>&B<>D<EFBFBD>!<21>Q<><13>#<23>#<23>#rr<>c<00>"<00>|jj|jd<01>}|j|<01>}|j |<01>}|j |<01>}|j |<01>}|d|zzd|zzd|zzd|zz}td|<07>S)u计算单个功能点的评分皙<E58886><E79A99><EFBFBD><EFBFBD><EFBFBD>?r<>g<00>?r<><00><00>?)<08> TYPE_WEIGHTS<54>getr:<00>_get_boundary_score<72>_get_exception_score<72>_get_dependency_score<72>_get_complexity_score<72>min)rar<><00>
base_score<EFBFBD>boundary_score<72>exception_score<72>dependency_score<72>complexity_score<72> total_scores rr<>z!ImportanceScorer._calculate_score-s<><00><00><1A>&<26>&<26>*<2A>*<2A>2<EFBFBD>:<3A>:<3A>t<EFBFBD><<3C>
<EFBFBD><1E>1<>1<>"<22>5<><0E><1F>3<>3<>B<EFBFBD>7<><0F> <20>5<>5<>b<EFBFBD>9<><18> <20>5<>5<>b<EFBFBD>9<><18> <17> <10>><3E> !<21> "<22> <10>?<3F> "<22> #<23> <11>#<23> #<23> $<24> <11>#<23> #<23>  $<24> <14><13>3<EFBFBD> <0B>$<24>$rc<00><><00>|jtjk(r6|jj dg<00>}|rt dt |<02>dz<00>S|jtjk(r6|jj dg<00>}|rt dt |<03>dz<00>S|jtjk(r4|jj dg<00>}t dt |<04>dz<00>Sy) u获取边界条件得分r<E58886>rr<>r<>r<>r<>rr=) r:r rrBrr
r<>rr)rar<>r<>r<>r<>s rrz$ImportanceScorer._get_boundary_scoreIs<><00><00> <0A>:<3A>:<3A>*<2A>2<>2<> 2<><1B><1D><1D>*<2A>*<2A><<3C><12><<3C>J<EFBFBD><19><1A>3<EFBFBD><03>J<EFBFBD><0F>#<23> 5<>6<>6<> <0A>:<3A>:<3A>*<2A>4<>4<> 4<> <20>m<EFBFBD>m<EFBFBD>/<2F>/<2F>0A<30>2<EFBFBD>F<>O<EFBFBD><1E><1A>3<EFBFBD><03>O<EFBFBD> 4<>s<EFBFBD> :<3A>;<3B>;<3B> <0A>:<3A>:<3A>*<2A>.<2E>.<2E> .<2E><17>]<5D>]<5D>&<26>&<26>x<EFBFBD><12>4<>F<EFBFBD><16>s<EFBFBD>C<EFBFBD><06>K<EFBFBD>#<23>-<2D>.<2E> .<2E>rc<00>:<00>|jtjk(ry|jtjk(r`|jj di<00>}|j <00>D]1\}}|D]'}d|j dd<05>j<00>vs<01>&y<00>3y)u获取异常路径得分rr<><00>errorr<72>rNg<00>?r=)r:r rrrBr<00>items<6D>lower)rar<>r<><00>state<74>
trans_list<EFBFBD>transs rrz%ImportanceScorer._get_exception_score]s<><00><00> <0A>:<3A>:<3A>*<2A>4<>4<> 4<><16> <0A>:<3A>:<3A>*<2A>.<2E>.<2E> .<2E><1C>-<2D>-<2D>+<2B>+<2B>M<EFBFBD>2<EFBFBD>><3E>K<EFBFBD>%0<>%6<>%6<>%8<> #<23>!<21><05>z<EFBFBD>'<27>#<23>E<EFBFBD><1E>%<25>)<29>)<29>L<EFBFBD>"<22>"=<3D>"C<>"C<>"E<>E<>"<22>#<23> #<23>
rc<00><><00>|jtjk(r]|jj dd<02>}||j
j vr)|j|t<00><00>}td|dz<00>Sy)u获取依赖深度得分r<E58886>rNrrr=)
r:r rrBrr_rT<00>_calculate_dependency_depthr<68>r
)rar<>r<><00>depths rrz&ImportanceScorer._get_dependency_scorelsh<00><00> <0E>:<3A>:<3A>*<2A>.<2E>.<2E> .<2E><1A> <0A> <0A>)<29>)<29>*:<3A>B<EFBFBD>?<3F>I<EFBFBD><18>D<EFBFBD>N<EFBFBD>N<EFBFBD>><3E>><3E>><3E><1C>8<>8<><19>C<EFBFBD>E<EFBFBD>J<><05><1A>3<EFBFBD><05><03> <0B>,<2C>,<2C>rr<><00>visitedc<00><><00>||vry|j|<01>|jjj|g<00>}|syd}|D] }|j ||<02>}t ||<06>}<04>"|dzS)u递归计算依赖深度rr")r<>r_rTrr<00>max)rar<>rr<><00> max_depth<74>deprs rrz,ImportanceScorer._calculate_dependency_depthwsy<00><00> <11>W<EFBFBD> <1C><14><0F> <0B> <0B>F<EFBFBD><1B><13>~<7E>~<7E>1<>1<>5<>5<>f<EFBFBD>b<EFBFBD>A<><04><13><14><15> <09><17> .<2E>C<EFBFBD><18>4<>4<>S<EFBFBD>'<27>B<>E<EFBFBD><1B>I<EFBFBD>u<EFBFBD>-<2D>I<EFBFBD> .<2E><19>1<EFBFBD>}<7D>rc<00><><00>|jtjk(rK|jj di<00>}t d<02>|j <00>D<00><00>}td|dz<00>S|jtjk(rJ|jj dd<06>}ttjd|<04><00>}td|dz<00>Sy )
u获取复杂度得分r<E58886>c3<00>2K<00>|]}t|<01><00><01><00>y<00>wry<00>r<><00>r{<00>ts rr}z9ImportanceScorer._get_complexity_score.<locals>.<genexpr><3E>s<00><00><><00>#I<>q<EFBFBD>C<EFBFBD><01>F<EFBFBD>#I<><49><00>rg<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rrNz (&&|\|\|)r<>r=) r:r rrBr<00>sum<75>valuesr
rr<>rnr<>)rar<>r<><00>total_transitionsr<00> operatorss rr z&ImportanceScorer._get_complexity_score<72>s<><00><00> <0A>:<3A>:<3A>*<2A>.<2E>.<2E> .<2E><1C>-<2D>-<2D>+<2B>+<2B>M<EFBFBD>2<EFBFBD>><3E>K<EFBFBD> #<23>#I<>K<EFBFBD>4F<34>4F<34>4H<34>#I<> I<> <1D><16>s<EFBFBD>-<2D><04>4<>5<> 5<> <0A>:<3A>:<3A>*<2A>4<>4<> 4<><1A> <0A> <0A>)<29>)<29>+<2B>r<EFBFBD>:<3A>I<EFBFBD><1B>B<EFBFBD>J<EFBFBD>J<EFBFBD>|<7C>Y<EFBFBD>?<3F>@<40>I<EFBFBD><16>s<EFBFBD>I<EFBFBD><03>O<EFBFBD>,<2C> ,<2C>rN)rrrrr rrrrrrrr9rMrbrrCr<>rrrr'r<>r)rr rrrr<>r<> s<><00><00><08> <1A><1D><1D>t<EFBFBD><19>!<21>!<21>4<EFBFBD><19>"<22>"<22>D<EFBFBD><19>#<23>#<23>T<EFBFBD><19>#<23>#<23>T<EFBFBD> <06>L<EFBFBD>#<23><04>]<5D>(;<3B>#<23> <0C>#<23>$<24>t<EFBFBD>M<EFBFBD>*<2A>$<24>%<25>=<3D>%<25>U<EFBFBD>%<25>8<13>m<EFBFBD><13><05><13>( <13>}<7D> <13><15> <13> <13> <0A> <13>%<25> <13><1D>#<23><1D><03><1D><03><1D>"<13> <0A><13>%<25>rr<>c <00><><00>eZdZdZej
gd<02>ej gd<03>ejgd<04>ejgd<05>ejgd<06>iZ
de e fd<08>Z d e efd
<EFBFBD>Zd e d ed ed efd<0E>Zy)<10>TestScenarioGeneratoruT
测试场景生成器
基于识别的功能点生成测试场景建议
))<02>state_transitionu测试所有状态转换路径)<02>illegal_transitionu测试非法状态转换)<02>
state_loopu测试状态循环))<02> boundary_zerou测试计数器归零)<02> boundary_maxu测试计数器最大值)<02>overflowu测试计数器溢出))<02> branch_pathu测试各分支路径)<02>boundary_conditionu测试边界条件)<02> combinationu测试组合条件))<02>handshake_timingu测试握手时序)<02>
concurrentu测试并发操作)<02>timeoutu测试协议超时))<02>triggeru测试异常触发)<02>recoveryu测试异常恢复)<02>fault_toleranceu测试容错处理r<E79086>c<00><00>||_y)uP
Args:
function_points: 带评分的功能点列表
N)r<>)rar<>s rrbzTestScenarioGenerator.__init__<5F>s <00><00>
/<2F><04>rrcc <00>f<00>g}|jD]<5D>}|jj|jg<00>}|D]^\}}|j}|j |||<05>}t |j<00>d|<04><00>|j|||<04><02>}|j|<08><00>`<00><>|jd<03>d<04><05>|S)u生成测试场景建议<E5BBBA>_)r rHrIrJrKc<00><00>|jSry)rJr<>s rr<>z0TestScenarioGenerator.generate.<locals>.<lambda><3E>s
<00><00>Q<EFBFBD>Z<EFBFBD>Z<EFBFBD>rTr<54>)
r<EFBFBD><00>SCENARIO_TEMPLATESrr:r><00>_customize_descriptionrGr r<>r<>) ra<00> scenariosr<73><00> templates<65> template_namerIrJ<00> specific_desc<73>scenarios r<00>generatezTestScenarioGenerator.generate<74>s<><00><00><16> <09><16>&<26>&<26> +<2B>B<EFBFBD><1C>/<2F>/<2F>3<>3<>B<EFBFBD>J<EFBFBD>J<EFBFBD><02>C<>I<EFBFBD>.7<EFBFBD> +<2B>*<2A> <0A>{<7B><1D>.<2E>.<2E><08>!%<25> ;<3B> ;<3B>B<EFBFBD> <0A>{<7B> [<5B> <0A>'<27><1E>G<EFBFBD>G<EFBFBD>9<EFBFBD>A<EFBFBD>m<EFBFBD>_<EFBFBD>5<>$&<26>G<EFBFBD>G<EFBFBD> -<2D>%<25>"/<2F> <12><08><1A> <20> <20><18>*<2A> +<2B> +<2B>& <12><0E><0E>/<2F><14><0E>><3E><18>rr<>rD<00> base_descc
<00><><00>|jtjk(r<>|jj dg<00>}|jj di<00>}|dk(r=d|j
<00>dt |<04><00>dtd<07>|j<00>D<00><00><00>d<08>S|d k(rd|j
<00>d
<EFBFBD>S|d k(rd|j
<00>d <0C>S|S|jtjk(r{|jj d d<0E>}|jj dg<00>}|dk(rd|<06>d<12>S|dk(r&td<14>|D<00>d<15>}|r d|<06>d|d<00><00>Sd|<06>d<18>S|dk(rd|<06>d<1A>S|S|jtjk(r||jj dd<0E>} |dk(rd| <09><00>S|dk(rQ|jj dg<00>}
|
r.d j|
D<00> cgc]} | d!<00>| d"<00><00><02><02>c} <0B>} d#| <0C><00>Sd$| <09><00>S|Scc} w)%u!根据功能点属性定制描述r<E8BFB0>r<>r-u测试 u 的所有状态转换(共 u 个状态c3<00>2K<00>|]}t|<01><00><01><00>y<00>wryr#r$s rr}z?TestScenarioGenerator._customize_description.<locals>.<genexpr><3E>s <00><00><><00>eK<02>pq<70>eh<65>ij<69>ek<65>eK<02>r&u 个转换r.u 的非法状态转换处理r/u 的状态循环场景r<E699AF>rNr<>r0u测试计数器 u 归零场景r1c3<00>0K<00>|]}|ddvs<01> |<01><01><00>y<02>w)r<>)z>=<3D>>Nr)r{<00>bs rr}z?TestScenarioGenerator._customize_description.<locals>.<genexpr><3E>s<00><00><><00>$[<5B>1<EFBFBD>a<EFBFBD>
<EFBFBD>m<EFBFBD>{<7B>>Z<>Q<EFBFBD>$[<5B>s<00> <01>Nu 达到最大值 r/u 最大值边界r2u 溢出场景rr3u测试条件分支: r4r<><00>, rr"u测试边界条件: u测试条件边界: ) r:r rrBrr r<>r'r(r<00>nextr<00>join) rar<>rDrHr<>r<>r<>r<><00> max_boundaryrr<>rM<00>
values_strs rrAz,TestScenarioGenerator._customize_description<6F>sd<00><00> <0A>:<3A>:<3A>*<2A>.<2E>.<2E> .<2E><17>]<5D>]<5D>&<26>&<26>x<EFBFBD><12>4<>F<EFBFBD><1C>-<2D>-<2D>+<2B>+<2B>M<EFBFBD>2<EFBFBD>><3E>K<EFBFBD><1C> 2<>2<> <20><12><17><17> <09>)F<>s<EFBFBD>6<EFBFBD>{<7B>m<EFBFBD>S`<60>ad<61>eK<02>vA<02>vH<02>vH<02>vJ<02>eK<02>bK<02>aL<02>LY<02>Z<02>Z<02><1E>"6<>6<> <20><12><17><17> <09>)E<>F<>F<><1E>,<2C>.<2E> <20><12><17><17> <09>)?<3F>@<40>@<40>8<19><18>5<10>Z<EFBFBD>Z<EFBFBD>,<2C>4<>4<> 4<><1D>=<3D>=<3D>,<2C>,<2C>^<5E>R<EFBFBD>@<40>L<EFBFBD><1B><1D><1D>*<2A>*<2A><<3C><12><<3C>J<EFBFBD><1C><0F>/<2F>)<29>,<2C><1E>}<7D>E<>E<><1E>.<2E>0<>#<23>$[<5B>
<EFBFBD>$[<5B>]a<>b<> <0C><1F>-<2D>l<EFBFBD>^<5E>;L<>\<5C>Za<5A>Mb<4D>Lc<4C>d<>d<>)<29>,<2C><1E>7G<37>H<>H<><1E>*<2A>,<2C>)<29>,<2C><1E>}<7D>E<>E<><19><18><10>Z<EFBFBD>Z<EFBFBD>,<2C>6<>6<> 6<><1A> <0A> <0A>)<29>)<29>+<2B>r<EFBFBD>:<3A>I<EFBFBD><1C> <0A>-<2D>-<2D>i<EFBFBD>[<5B>9<>9<><1E>"6<>6<>"$<24>-<2D>-<2D>"3<>"3<>4E<34>r<EFBFBD>"J<><0F>"<22>!%<25><19><19>_<EFBFBD>+U<><01>q<EFBFBD><11>t<EFBFBD>f<EFBFBD>Q<EFBFBD>q<EFBFBD>T<EFBFBD>F<EFBFBD>O<EFBFBD>+U<>!V<>J<EFBFBD>1<>*<2A><1C>><3E>><3E>-<2D>i<EFBFBD>[<5B>9<>9<><18><18><> ,Vs<00>G7N)rrrrr rrrrrr@rr9rbrGrGr'rArrrr,r,<00>s<><00><00><08> <1A><1D><1D>
<EFBFBD>
<1A>!<21>!<21>$
<EFBFBD>
<1A>#<23>#<23>&
<EFBFBD>
<1A>"<22>"<22>%
<EFBFBD>
<1A>#<23>#<23>&
<EFBFBD>+<06><16>8/<2F><04>]<5D>(;<3B>/<2F><19>$<24>|<7C>,<2C><19>4'<19><1D>'<19>s<EFBFBD>'<19>WZ<57>'<19>_b<5F>'rr,c<00><><00>eZdZdZdefd<03>Zdeeeffd<05>Zdeeeffd<06>Z de
de e fd<08>Z dd ede efd
<EFBFBD>Zdeeeeffd <0B>Zdefd <0C>Zy )<0F>SemanticAnalyzeruj
语义分析器 - 第0层主入口
整合所有子模块,提供统一的语义分析接口
rXc<00><<00>||_d|_g|_g|_y)rZN)rXr_r<><00>test_scenariosr`s rrbzSemanticAnalyzer.__init__s"<00><00>
!<21><04> <0A>15<31><04><0E>46<34><04><1C>24<32><04>rrcc<00><><00>t|j<00>}|j<00>|_t |j|j<00>}|j <00>|_t|j |j<00>}|j<00>|_t|j <00>}|j<00>|_ |j<00>S)uu
执行完整的语义分析
Returns:
包含所有分析结果的字典
) rWrXrlr_r<>r<>r<>r<>rr,rGrV<00>get_analysis_result)ra<00>parser<65>
recognizer<EFBFBD>scorer<65> generators r<00>analyzezSemanticAnalyzer.analyzes<><00><00>$<24>D<EFBFBD>M<EFBFBD>M<EFBFBD>2<><06><1F><1C><1C><1E><04><0E>-<2D>T<EFBFBD>]<5D>]<5D>D<EFBFBD>N<EFBFBD>N<EFBFBD>K<>
<EFBFBD>)<29>3<>3<>5<><04><1C>"<22>$<24>"6<>"6<><04><0E><0E>G<><06>%<25>|<7C>|<7C>~<7E><04><1C>*<2A>$<24>*><3E>*><3E>?<3F> <09>'<27>0<>0<>2<><04><1B><13>'<27>'<27>)<29>)rc<00><00>|jr>|jjD<00>cgc]}|jdk(s<01>|j<00><02> c}ng}|jr>|jjD<00>cgc]}|jdk(s<01>|j<00><02> c}ng}|jr|jjnd|||jr\|jjD<00>cgc]<}|j|j|j
|j |jd<04><05><02>>c}ng|jD<00>cgc]d}|j|jj|j|j|jd|jdd<07>|jd<08><06><02>fc}|jD<00>cgc]1}|j|j |j"|j$d <09><04><02>3c}d
<EFBFBD>Scc}wcc}wcc}wcc}wcc}w) u获取分析结果r<E69E9C>r<>rNrrr")r4r5)r r<><00>
importancer?r;rB)r r<>rIrJ)rO<00>inputs<74>outputsrPr<>rV)r_rPr!r rOr#r$r%r<>r:r/r>r?r;rBrVrHrIrJ)rar|r`ra<00>portr<74><00>tss rrXz$SemanticAnalyzer.get_analysis_resultRs<><00><00>VZ<01>Uc<55>Uc<55>$<24>.<2E>.<2E>"6<>"6<>Q<>Q<EFBFBD>!<21>+<2B>+<2B><17>:P<>!<21>&<26>&<26>Q<>ik<69><06>W[<5B>We<57>We<57>4<EFBFBD>><3E>><3E>#7<>#7<>S<>a<EFBFBD>1<EFBFBD>;<3B>;<3B>(<28>;R<>1<EFBFBD>6<EFBFBD>6<EFBFBD>S<>km<6B><07>:><3E><1E><1E>4<EFBFBD>><3E>><3E>5<>5<>R<EFBFBD><1C><1E><16><1E><1E>!<21>N<EFBFBD>N<EFBFBD>0<>0<> <0E><19> !<21>I<EFBFBD>I<EFBFBD>!%<25><1E><1E>!<21>Z<EFBFBD>Z<EFBFBD><1F>8<EFBFBD>8<EFBFBD><1F>8<EFBFBD>8<EFBFBD> <12> <0E>&(<28><1F>.<2E>.<2E> <0E><17><1F>G<EFBFBD>G<EFBFBD><1E>J<EFBFBD>J<EFBFBD>,<2C>,<2C>"$<24>"5<>"5<>!<21>z<EFBFBD>z<EFBFBD>&(<28>k<EFBFBD>k<EFBFBD>!<21>n<EFBFBD>$&<26>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>!<16>#%<25>-<2D>-<2D>
<12> <0E>*<1F>-<2D>-<2D><0E><17> <1F>G<EFBFBD>G<EFBFBD> <20>0<>0<>#%<25>><3E>><3E> "<22> <0B> <0B> <12><0E>9%
<EFBFBD>%
<EFBFBD><EFBFBD>R<01><>S<><53> <0E><> <0E><>s*<00>G)<04>G)<04>1G.<04>G.<04>"AG3
<EFBFBD>5A)G8 <0C>.6G=r:c<00>`<00>|jD<00>cgc]}|j|k(s<01>|<02><02>c}Scc}w)u按类型获取功能点)r<>r:)rar:r<>s r<00>get_function_points_by_typez,SemanticAnalyzer.get_function_points_by_types'<00><00>!<21>1<>1<>K<>r<EFBFBD>R<EFBFBD>Z<EFBFBD>Z<EFBFBD>7<EFBFBD>5J<35><02>K<>K<><4B>Ks<00>+<04>+<04>nc<00> <00>|jd|S)u(获取优先级最高的N个测试场景N)rV)rarfs r<00>get_top_priority_scenariosz+SemanticAnalyzer.get_top_priority_scenarios<6F>s<00><00><13>"<22>"<22>2<EFBFBD>A<EFBFBD>&<26>&rc<00><00>|jtj<00>}|rd|d}|j|jj dd<03>|jj dg<00>|jj di<00>d<06>Sy)u$获取FSM相关信息如果有rr<>rNr<>r<>)r r<>r<>r<>N)rer rr rBr)ra<00>fsm_fpsr<73>s r<00> get_fsm_infozSemanticAnalyzer.get_fsm_info<66>sx<00><00><16>2<>2<>3D<33>3H<33>3H<33>I<><07> <12><18><11><1A>B<EFBFBD><1A><07><07>"$<24>-<2D>-<2D>"3<>"3<>4D<34>b<EFBFBD>"I<><1C>-<2D>-<2D>+<2B>+<2B>H<EFBFBD>b<EFBFBD>9<>!<21>}<7D>}<7D>0<>0<><1D><02>C<> <0E> <0E> rc <00><00>g}|j<00>r
|jjD<00>cgc]}|jdk(s<01>|j<00><02> }}|jjD<00>cgc]}|jdk(s<01>|j<00><02> }}|j d<03>|j d|jj
<00><00><02>|j ddj |<03><00><00><02>|j ddj |<04><00><00><02>|j d<08>|jr<>|j d <09>t|jd
d <00>D]M\}}|j |d z<00>d |j<00>d|jj<00>d|jd<10><04><07><00>O|j d<08>|j<00>}|r<>|j d<11>|j d|d<00><00><02>|j ddj |d<00><00><00><02>|j d<16>|dj<00>D],\}} | D]"}
|j d|<08>d|
d<00>d|
d<00><00><06><00>$<00>.|j d<08>|jrp|j d<1D>t|jd
d<00>D]D\}} |j |d z<00>d | j<00>d| j<00>d | j d<10>d!<21><08><00>Fd"j |<01>Scc}wcc}w)#u&生成用于 Prompt 的上下文信息r<E681AF>r<>z [MODULE INFO]zModule: zInputs: rNz Outputs: rNz([FUNCTION POINTS - Ranked by Importance]N<>
r"z. z (z): importance=z.2fz [FSM DETAILS]zState Variable: r<>zStates: r<>z Transitions:r<>z z --[rz]--> r<>z[RECOMMENDED TEST SCENARIOS]<5D>z: z (priority=<3D>)r[)r_rPr!r r<>rOrPr<>r<>r:r/r>rkrrVrIrJ) ra<00>contextr|r`rar<>r<><00>fsm_inforrrrcs r<00>generate_prompt_contextz(SemanticAnalyzer.generate_prompt_context<78>s<><00><00><14><07> <10>><3E>><3E>&*<2A>n<EFBFBD>n<EFBFBD>&:<3A>&:<3A>U<><11>a<EFBFBD>k<EFBFBD>k<EFBFBD>W<EFBFBD>>T<>a<EFBFBD>f<EFBFBD>f<EFBFBD>U<>F<EFBFBD>U<>'+<2B>~<7E>~<7E>';<3B>';<3B>W<>!<21>q<EFBFBD>{<7B>{<7B>h<EFBFBD>?V<>q<EFBFBD>v<EFBFBD>v<EFBFBD>W<>G<EFBFBD>W<> <13>N<EFBFBD>N<EFBFBD>?<3F> +<2B> <13>N<EFBFBD>N<EFBFBD>X<EFBFBD>d<EFBFBD>n<EFBFBD>n<EFBFBD>&@<40>&@<40>%A<>B<> C<> <13>N<EFBFBD>N<EFBFBD>X<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD><06>&7<>%8<>9<> :<3A> <13>N<EFBFBD>N<EFBFBD>Y<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD><17>'9<>&:<3A>;<3B> <<3C> <13>N<EFBFBD>N<EFBFBD>2<EFBFBD> <1E> <10> <1F> <1F> <13>N<EFBFBD>N<EFBFBD>E<> F<>"<22>4<EFBFBD>#7<>#7<><03><12>#<<3C>=<3D> o<01><05><01>2<EFBFBD><17><0E><0E>!<21>A<EFBFBD>#<23><15>b<EFBFBD><12><17><17> <09><12>B<EFBFBD>J<EFBFBD>J<EFBFBD>4D<34>4D<34>3E<33>^<5E>TV<54>Tg<54>Tg<54>hk<68>Sl<53>m<>n<> o<01> <13>N<EFBFBD>N<EFBFBD>2<EFBFBD> <1E><18>$<24>$<24>&<26><08> <13> <13>N<EFBFBD>N<EFBFBD>?<3F> +<2B> <13>N<EFBFBD>N<EFBFBD>-<2D>h<EFBFBD>7G<37>.H<>-I<>J<> K<> <13>N<EFBFBD>N<EFBFBD>X<EFBFBD>d<EFBFBD>i<EFBFBD>i<EFBFBD><08><18>0B<30>&C<>%D<>E<> F<> <13>N<EFBFBD>N<EFBFBD>><3E> *<2A>%-<2D>m<EFBFBD>%<<3C>%B<>%B<>%D<> c<01>!<21><05>z<EFBFBD>'<27>c<01>E<EFBFBD><1B>N<EFBFBD>N<EFBFBD>R<EFBFBD><05>w<EFBFBD>d<EFBFBD>5<EFBFBD><1B>3E<33>2F<32>e<EFBFBD>E<EFBFBD>R^<5E>L_<4C>K`<60>#a<>b<>c<01> c<01> <14>N<EFBFBD>N<EFBFBD>2<EFBFBD> <1E> <10> <1E> <1E> <13>N<EFBFBD>N<EFBFBD>9<> :<3A>"<22>4<EFBFBD>#6<>#6<>r<EFBFBD><01>#:<3A>;<3B> c<01><05><01>2<EFBFBD><17><0E><0E>!<21>A<EFBFBD>#<23><15>b<EFBFBD><12><17><17> <09><12>B<EFBFBD>N<EFBFBD>N<EFBFBD>3C<33>;<3B>r<EFBFBD>{<7B>{<7B>[^<5E>N_<4E>_`<60>a<>b<> c<01><14>y<EFBFBD>y<EFBFBD><17>!<21>!<21><>CV<01><>Ws<00>L<04>L<04>%L<04>:LN)rn)rrrrr'rbrrr]rXr rr9rer)rGrhrrkrrrrrrTrTs<><00><00><08>
5<><13>5<>*<2A><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>*<2A>h+
<EFBFBD>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>+
<EFBFBD>ZL<01>3D<33>L<01><14>m<EFBFBD>I\<5C>L<01>'<27>C<EFBFBD>'<27><04>\<5C>8J<38>'<27> <14>h<EFBFBD>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>6<> <14>l'"<22><13>'"rrTrXrcc<00>8<00>t|<00>}|j<00>S)u<>
便捷函数:分析 RTL 代码
Args:
rtl_code: RTL源代码字符串
Returns:
分析结果字典
)rTr])rX<00>analyzers r<00> analyze_rtlru<00>s<00><00> <20><08>)<29>H<EFBFBD> <13> <1B> <1B> <1D>rc<00>j<00>t|<00>}|j<00>|j<00>}|r|dSgS)u<>
便捷函数:获取 FSM 状态列表
Args:
rtl_code: RTL源代码字符串
Returns:
状态名列表
r<>)rTr]rk)rXrtrqs r<00>get_fsm_statesrw<00>s:<00><00> <20><08>)<29>H<EFBFBD> <0C><14><14><16><17>$<24>$<24>&<26>H<EFBFBD>!)<29>8<EFBFBD>H<EFBFBD> <1D>1<>r<EFBFBD>1r)!rrn<00>logging<6E>typingrrrrr<00> dataclassesrr <00>enumr
<00> getLoggerr<00>loggerr rr+r.r3r9rGrMrWr<>r<>r,rTr'rurwrrr<00><module>r~sc<00><01><04>
<EFBFBD><0E>3<>3<>(<28><15> <1A><17> <1A> <1A>8<EFBFBD> $<24><06><1C><04><1C> <0B><11><11> <0B><11> <0B><11><11> <0B><11> <0B>"<22>"<22> <0B>"<22> <0B><11><11> <0B><11> <0B>=<3D>=<3D> <0B>=<3D> <0B><17><17> <0B><17> <0B>L<01>L<01> <0B>L<01>bQ<01>bQ<01>Rq,<2C>q,<2C>pJ<13>J<13>bj<19>j<19>bV"<22>V"<22>x <1E>#<23> <1E>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E> <1E> 2<>S<EFBFBD> 2<>T<EFBFBD>#<23>Y<EFBFBD> 2r