@@ -2993,6 +2993,123 @@ def type_check(_symtab)
29932993 end
29942994 end
29952995
2996+ class ImplicationExpressionSyntaxNode < SyntaxNode
2997+ sig { override . returns ( ImplicationExpressionAst ) }
2998+ def to_ast
2999+ ImplicationExpressionAst . new (
3000+ input , interval ,
3001+ antecedent . to_ast , consequent . to_ast
3002+ )
3003+ end
3004+ end
3005+
3006+ class ImplicationExpressionAst < AstNode
3007+ sig {
3008+ params (
3009+ input : String ,
3010+ interval : T ::Range [ Integer ] ,
3011+ antecedent : RvalueAst ,
3012+ consequent : RvalueAst
3013+ ) . void
3014+ }
3015+ def initialize ( input , interval , antecedent , consequent )
3016+ super ( input , interval , [ antecedent , consequent ] )
3017+ end
3018+
3019+ sig { returns ( RvalueAst ) }
3020+ def antecedent = @children [ 0 ]
3021+
3022+ sig { returns ( RvalueAst ) }
3023+ def consequent = @children [ 1 ]
3024+
3025+ sig { override . params ( symtab : SymbolTable ) . void }
3026+ def type_check ( symtab )
3027+ antecedent . type_error "Antecedent must a boolean" unless antecedent . type ( symtab ) . kind == :boolean
3028+ consequent . type_error "Consequent must a boolean" unless consequent . type ( symtab ) . kind == :boolean
3029+ end
3030+
3031+ sig { params ( symtab : SymbolTable ) . returns ( T ::Boolean ) }
3032+ def satisfied? ( symtab )
3033+ return true if antecedent . value ( symtab ) == false
3034+ consequent . value ( symtab )
3035+ end
3036+
3037+ end
3038+
3039+ class ImplicationStatementSyntaxNode < SyntaxNode
3040+ sig { override . returns ( ImplicationStatementAst ) }
3041+ def to_ast
3042+ ImplicationStatementAst . new ( input , interval , implication_expression . to_ast )
3043+ end
3044+ end
3045+
3046+ class ImplicationStatementAst < AstNode
3047+ sig {
3048+ params (
3049+ input : String ,
3050+ interval : T ::Range [ Integer ] ,
3051+ implication_expression : ImplicationExpressionAst
3052+ ) . void
3053+ }
3054+ def initialize ( input , interval , implication_expression )
3055+ super ( input , interval , [ implication_expression ] )
3056+ end
3057+
3058+ sig { returns ( ImplicationExpressionAst ) }
3059+ def expression = @children [ 0 ]
3060+
3061+ sig { override . params ( symtab : SymbolTable ) . void }
3062+ def type_check ( symtab )
3063+ expression . type_check ( symtab )
3064+ end
3065+
3066+ sig { params ( symtab : SymbolTable ) . returns ( T ::Boolean ) }
3067+ def satisfied? ( symtab )
3068+ expression . satisfied? ( symtab )
3069+ end
3070+ end
3071+
3072+ class ConstraintBodySyntaxNode < SyntaxNode
3073+ sig { override . returns ( ConstraintBodyAst ) }
3074+ def to_ast
3075+ stmts = [ ]
3076+ elements . each do |e |
3077+ stmts << e . i . to_ast
3078+ end
3079+ ConstraintBodyAst . new ( input , interval , stmts )
3080+ end
3081+ end
3082+
3083+ class ConstraintBodyAst < AstNode
3084+ sig {
3085+ params (
3086+ input : String ,
3087+ interval : T ::Range [ Integer ] ,
3088+ stmts : T ::Array [ T . any ( ImplicationStatementAst , ForLoopAst ) ]
3089+ ) . void
3090+ }
3091+ def initialize ( input , interval , stmts )
3092+ super ( input , interval , stmts )
3093+ end
3094+
3095+ sig { returns ( T ::Array [ T . any ( ImplicationStatementAst , ForLoopAst ) ] ) }
3096+ def stmts = T . cast ( @children , T ::Array [ T . any ( ImplicationStatementAst , ForLoopAst ) ] )
3097+
3098+ sig { override . params ( symtab : SymbolTable ) . void }
3099+ def type_check ( symtab )
3100+ stmts . each do |stmt |
3101+ stmt . type_check ( symtab )
3102+ end
3103+ end
3104+
3105+ sig { params ( symtab : SymbolTable ) . returns ( T ::Boolean ) }
3106+ def satisfied? ( symtab )
3107+ stmts . all? do |stmt |
3108+ stmt . satisfied? ( symtab )
3109+ end
3110+ end
3111+ end
3112+
29963113 class WidthRevealSyntaxNode < SyntaxNode
29973114 def to_ast
29983115 WidthRevealAst . new ( input , interval , send ( :expression ) . to_ast )
@@ -6429,6 +6546,23 @@ def type_check(symtab)
64296546 symtab . pop
64306547 end
64316548
6549+ sig { params ( symtab : SymbolTable ) . returns ( T ::Boolean ) }
6550+ def satisfied? ( symtab )
6551+ symtab . push ( self )
6552+ begin
6553+ init . execute ( symtab )
6554+ while condition . value ( symtab )
6555+ stmts . each do |s |
6556+ return false unless s . satisfied? ( symtab )
6557+ end
6558+ update . execute ( symtab )
6559+ end
6560+ return true
6561+ ensure
6562+ symtab . pop
6563+ end
6564+ end
6565+
64326566 # @!macro return_value
64336567 def return_value ( symtab )
64346568 symtab . push ( self )
0 commit comments