### boolean value and edge literal semantics ### sub ALF_GetBitLiterals { local($edge_literal) = @_; local $initial,$final; if ($edge_literal =~ /$ALF_bit_edge_literal/) { $initial = substr($edge_literal,0,1); $final = substr($edge_literal,1,1); #print("bit_edge_literal $edge_literal: initial=$initial final=$final\n"); } elsif ($edge_literal =~ /$ALF_symbolic_edge_literal/) { $initial = substr($edge_literal,0,1); $final = substr($edge_literal,1,1); #print("symbolic_edge_literal $edge_literal: initial=$initial final=$final\n"); } elsif ($edge_literal =~ /$ALF_based_edge_literal/ && (length($edge_literal)==6)) { $initial = substr($edge_literal,2,1); $final = substr($edge_literal,5,1); #print("based_edge_literal $edge_literal: initial=$initial final=$final\n"); } ($initial,$final); } sub ALF_LogicalValue { local($symbol) = @_; &StringMatch($symbol,'1','H')? 'true' : &StringMatch($symbol,'0','L')? 'false' : &StringMatch($symbol,'X','W')? 'unknown' : &StringMatch($symbol,'?')? 'arbitrary' : &StringMatch($symbol,'*')? 'random' : &StringMatch($symbol,'!')? 'changed' : &StringMatch($symbol,'~')? 'allchanged' : &StringMatch($symbol,'-')? 'unchanged' : undef; } sub ALF_DriveStrength { local($symbol) = @_; &StringMatch($symbol,'1','0','X')? 'strong' : &StringMatch($symbol,'H','L','W')? 'weak' : &StringMatch($symbol,'Z')? 'zero' : undef; } sub ALF_Inverted { local($symbol) = @_; local ($first,@symbol) = split(/\s+/,$symbol); &StringMatch($symbol,'1',"\47b1")? '0' : &StringMatch($symbol,'0',"\47b0")? '1' : &StringMatch($symbol,"\47bH")? "\47bL" : &StringMatch($symbol,"\47bh")? "\47bl" : &StringMatch($symbol,"\47bL")? "\47bH" : &StringMatch($symbol,"\47bl")? "\47bh" : &StringMatch($symbol,"\47bX")? "\47bX" : &StringMatch($symbol,"\47bx")? "\47bx" : &StringMatch($symbol,"\47bW")? "\47bW" : &StringMatch($symbol,"\47bw")? "\47bw" : &ALF_LexicalMatch('identifier',$symbol)? "! $symbol" : &StringMatch($first,'+')? join(' ','-',@symbol) : &StringMatch($first,'-')? join(' ','+',@symbol) : &StringMatch($first,'!','~')? join(' ',@symbol) : &ALF_LexicalMatch('edge_literal',$first)? join(' ',&ALF_InvertedEdge($first),@symbol) : defined($symbol)? "! ( $symbol )" : undef; } sub ALF_InvertedEdge { local($edge_literal) = @_; local ($initial,$final) = &ALF_GetBitLiterals($edge_literal); join('',$final,$initial); } ### boolean and vector expression semantics ### sub ALF_Boolean2Edge { local($expression) = @_; local ($expr0,$expr1,@expr2) = split(/\s/,$expression); ($expr0 eq '!') && defined($expr1) && !defined(@expr2)? "10 $expr1" : ($expr0 eq '!') && defined($expr1) && defined(@expr2)? "10 ( $expr1 @expr2 )" : defined($expr0) && !defined($expr1) && !defined(@expr2)? "01 $expr0" : defined($expr0) && defined($expr1) && !defined(@expr2)? "01 ( $expr0 $expr1 )" : defined($expr0) && defined($expr1) && defined(@expr2)? "01 ( $expr0 $expr1 @expr2 )" : undef; } sub ALF_Edge2Boolean { local($expression) = @_; local ($expr0,$expr1,@expr2) = split(/\s/,$expression); &ALF_IsRisingEdge ($expr0) && defined($expr1) && !defined(@expr2)? $expr1 : &ALF_IsFallingEdge($expr0) && defined($expr1) && !defined(@expr2)? "! $expr1" : &ALF_IsRisingEdge ($expr0) && defined($expr1) && defined(@expr2)? "$expr1 @expr2" : &ALF_IsFallingEdge($expr0) && defined($expr1) && defined(@expr2)? "! ($expr1 @expr2)" : undef; } sub ALF_SingleEvent { local(*expression) = @_; local ($d0,$r0) = &ALF_ExpressionData($expression[0]); local ($d1,$r1) = &ALF_ExpressionData($expression[1]); ($d0,$d1) if (($#expression == 1) && &StringMatch($r0,'single_event') && &StringMatch($r1,'identifier')); } sub ALF_BooleanExpression { local(*expression) = @_; local $match; foreach $item (@expression) { local ($data,$rule) = &ALF_ExpressionData($item); $match = &StringMatch($rule,&Array($ALF_ExpressionRuleSet{'boolean_expression'})); last unless $match; } $match; } sub ALF_FindEdgeLiteral { local(*expression,$pin,$edge_number) = @_; local $count = 0; local $edge_literal; foreach $item (@expression) { local ($data,$rule) = &ALF_ExpressionData($item); if ($edge_literal && &StringMatch($data,$pin)) { last if ($count==$edge_number); $count += 1; } $edge_literal = &StringMatch($rule,'single_event')? $data : undef; } $edge_literal; } sub ALF_FindBooleanExpression { local(*expression) = @_; local $boolean = &CreateArray(); local $vector_expression; local $boolean_expression; local $leftover; foreach $item (@expression) { local ($data,$rule) = &ALF_ExpressionData($item); local $start = &StringMatch($rule,'single_event'); local $continue = &StringMatch($rule,'control_and vector_expression'); local $finish = &StringMatch($rule,'control_and boolean_expression'); $boolean_expression = &StringMatch($rule,&Array($ALF_ExpressionRuleSet{'boolean_expression'})); &AppendArray($boolean,$data) if ($boolean_expression && !$start && !$vector_expression || $continue); $vector_expression = ($start || $vector_expression) && !$finish; $leftover = !$finish && ($leftover || $continue); } !&ArraySize($boolean)? undef : $leftover? join(' ',&GetSubArray($boolean,0,&ArraySize($boolean)-2)) : join(' ',&Array($boolean)); } 1;