• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • C
          • Syntax-for-tools
          • Atc
            • Atc-implementation
              • Atc-abstract-syntax
              • Atc-pretty-printer
              • Atc-event-and-code-generation
                • Atc-symbolic-computation-states
                • Atc-symbolic-execution-rules
                  • Atc-exec-expr-pure-rules
                  • Atc-exec-expr-when-asg-arrsub-rules-generation
                  • Integer-value-disjoint-rules
                  • Atc-uaconvert-values-rules
                  • Atc-exec-unary-nonpointer-rules-generation
                  • Atc-exec-unary-nonpointer-rules
                  • Atc-exec-expr-when-asg-indir-rules
                  • Atc-exec-expr-when-asg-arrsub-rules
                  • Atc-exec-cast-rules-generation
                    • Atc-exec-cast-rules
                    • Atc-exec-binary-strict-pure-rules-generation
                    • Atc-convert-integer-value-rules
                    • Atc-array-read-rules
                    • Array-value-disjoint-rules
                    • Atc-exec-expr-when-asg-indir-rule-generation
                    • Atc-identifier-rules
                    • Atc-object-designator-rules
                    • Atc-flexible-array-member-rules
                    • Atc-exec-stmt-rules
                    • Atc-exec-indir-rules
                    • Atc-uaconvert-values-rules-generation
                    • Atc-exec-arrsub-rules
                    • Value-bridge-theorems
                    • Atc-test-value-rules
                    • Atc-exec-const-rules
                    • *atc-integer-ops-2-return-rewrite-rules*
                    • *atc-integer-ops-2-type-prescription-rules*
                    • Atc-apconvert-rules
                    • Atc-integer-conv-rules
                    • Atc-adjust-type-rules
                    • Atc-exec-block-item-list-rules
                    • Atc-exec-arrsub-rules-generation
                    • Atc-exec-fun-rules
                    • Atc-static-variable-pointer-rules
                    • Atc-exec-indir-rules-generation
                    • Atc-exec-binary-strict-pure-rules
                    • Atc-array-write-rules
                    • Array-value-rules
                    • Atc-pointed-integer-rules
                    • Atc-array-length-rules
                    • *atc-exec-cast-rules*
                    • Atc-value-array->elemtype-rules
                    • Atc-limit-rules
                    • Type-of-value-under-array-predicates
                    • Atc-value-integer->get-rules
                    • Atc-distributivity-over-if-rewrite-rules
                    • *atc-integer-convs-type-prescription-rules*
                    • Atc-value-array->elements-rules
                    • Atc-syntaxp-hyp-for-expr-pure
                    • *atc-uaconvert-values-rules*
                    • *atc-integer-ops-1-return-rewrite-rules*
                    • *atc-integer-convs-return-rewrite-rules*
                    • Valuepred-when-value-kind
                    • Valuepred-to-type-of-value-equalities
                    • Atc-promote-value-rules
                    • *atc-integer-ops-1-type-prescription-rules*
                    • *atc-all-rules*
                    • Atc-integer-ifix-rules
                    • Atc-exec-expr-when-asg-ident-rules
                    • *atc-type-prescription-rules*
                    • Atc-hide-rules
                    • Type-of-value-when-valuepred
                    • Atc-value-integerp-rules
                    • Atc-not-error-rules
                    • Value-listp-when-valuepred-listp
                    • Value-kind-when-valuepred
                    • Atc-value-arithmeticp-rules
                    • Atc-type-kind-rules
                    • *atc-compound-recognizer-rules*
                    • Atc-value-pointer-rules
                    • Atc-boolean-equality-rules
                    • Atc-tyname-to-type-rules
                    • Atc-integer-size-rules
                    • Atc-init-scope-rules
                    • Atc-boolean-from-sint
                    • Valuep-when-valuepred
                    • Atc-if*-rules
                    • Atc-exec-ident-rules
                    • Atc-integer-const-rules
                    • Atc-sint-get-rules
                    • Atc-exec-expr-when-call-rules
                    • Atc-type-of-value-option-rules
                    • Atc-identifier-other-rules
                    • Atc-boolean-from-integer-return-rules
                    • *atc-exec-unary-nonpointer-rules*
                    • *atc-convert-integer-value-rules*
                    • Atc-lognot-sint-rules
                    • Atc-sint-from-boolean-rules
                    • Atc-value-optionp-rules
                    • Atc-type-of-value-rules
                    • Atc-exec-obj-declon-rules
                    • Atc-compustatep-rules
                    • Value-tau-rules
                    • Atc-valuep-rules
                    • Atc-exec-expr-pure-list-rules
                    • Atc-exec-block-item-rules
                    • Atc-boolean-fron/to-sint-rules
                    • *atc-other-executable-counterpart-rules*
                    • Value-promoted-arithmeticp-alt-def
                    • Atc-exec-initer-rules
                    • *atc-type-of-value-rules*
                    • *atc-identifier-rules*
                    • *atc-flexible-array-member-rules*
                    • *atc-exec-expr-pure-rules*
                    • *atc-boolean-from-integer-return-rules*
                    • *atc-array-read-rules*
                    • Valuep-possibilities
                    • Value-unsigned-integerp-alt-def
                    • Value-signed-integerp-alt-def
                    • Atc-value-listp-rules
                    • *atc-pointed-integers-type-prescription-rules*
                    • *atc-pointed-integer-rules*
                    • *atc-array-write-return-rewrite-rules*
                    • *atc-array-read-return-rewrite-rules*
                    • Atc-exec-expr-when-pure-rules
                    • Array-tau-rules
                    • *atc-not-error-rules*
                    • *atc-integer-conv-rules*
                    • *atc-exec-expr-when-asg-arrsub-rules*
                    • *atc-array-write-type-prescription-rules*
                    • *atc-array-read-type-prescription-rules*
                    • *atc-array-length-rules*
                    • *atc-adjust-type-rules*
                    • Atc-sint-from-boolean
                    • Atc-init-value-to-value-rules
                    • *atc-value-integer->get-rules*
                    • *atc-static-variable-pointer-rules*
                    • *atc-integer-size-rules*
                    • *atc-integer-constructors-return-rules*
                    • *atc-exec-stmt-rules*
                    • *atc-exec-expr-when-asg-indir-rules*
                    • *atc-exec-const-rules*
                    • *atc-distributivity-over-if-rewrite-rules*
                    • Atc-wrapper-rules
                    • Atc-value-result-fix-rules
                    • Atc-value-kind-rules
                    • Atc-array-length-write-rules
                    • *atc-value-kind-rules*
                    • *atc-value-array->elemtype-rules*
                    • *atc-type-kind-rules*
                    • *atc-test-value-rules*
                    • *atc-promote-value-rules*
                    • *atc-integer-ifix-rules*
                    • *atc-integer-fix-rules*
                    • *atc-integer-const-rules*
                    • *atc-exec-indir-rules*
                    • *atc-exec-arrsub-rules*
                    • *atc-computation-state-return-rules*
                    • *atc-array-length-write-rules*
                    • *atc-apconvert-rules*
                    • Atc-misc-rewrite-rules
                    • *atc-valuep-rules*
                    • *atc-tyname-to-type-rules*
                    • *atc-object-designator-rules*
                    • *atc-init-scope-rules*
                    • *atc-exec-expr-when-call-rules*
                    • *atc-exec-expr-when-asg-rules*
                    • *atc-exec-expr-when-asg-ident-rules*
                    • *atc-exec-block-item-rules*
                    • Atc-computation-state-return-rules
                    • *atc-wrapper-rules*
                    • *atc-value-result-fix-rules*
                    • *atc-value-optionp-rules*
                    • *atc-value-listp-rules*
                    • *atc-value-fix-rules*
                    • *atc-type-of-value-option-rules*
                    • *atc-sint-get-rules*
                    • *atc-sint-from-boolean*
                    • *atc-misc-rewrite-rules*
                    • *atc-lognot-sint-rules*
                    • *atc-limit-rules*
                    • *atc-init-value-to-value-rules*
                    • *atc-exec-obj-declon-rules*
                    • *atc-exec-initer-rules*
                    • *atc-exec-ident-rules*
                    • *atc-exec-fun-rules*
                    • *atc-exec-expr-when-pure-rules*
                    • *atc-exec-expr-pure-list-rules*
                    • *atc-exec-block-item-list-rules*
                    • *atc-boolean-from-sint*
                    • Atc-value-fix-rules
                    • Atc-integer-fix-rules
                    • Atc-integer-constructors-return-rules
                    • Atc-exec-expr-when-asg-rules
                  • Atc-gen-ext-declon-lists
                  • Atc-function-and-loop-generation
                  • Atc-statement-generation
                  • Atc-gen-fileset
                  • Atc-gen-everything
                  • Atc-gen-obj-declon
                  • Atc-gen-fileset-event
                  • Atc-tag-tables
                  • Atc-expression-generation
                  • Atc-generation-contexts
                  • Atc-gen-wf-thm
                  • Term-checkers-atc
                  • Atc-variable-tables
                  • Term-checkers-common
                  • Atc-gen-init-fun-env-thm
                  • Atc-gen-appconds
                  • Read-write-variables
                  • Atc-gen-thm-assert-events
                  • Test*
                  • Atc-gen-prog-const
                  • Atc-gen-expr-bool
                  • Atc-theorem-generation
                  • Atc-tag-generation
                  • Atc-gen-expr-pure
                  • Atc-function-tables
                  • Atc-object-tables
                • Fty-pseudo-term-utilities
                • Atc-term-recognizers
                • Atc-input-processing
                • Atc-shallow-embedding
                • Atc-process-inputs-and-gen-everything
                • Atc-table
                • Atc-fn
                • Atc-pretty-printing-options
                • Atc-types
                • Atc-macro-definition
              • Atc-tutorial
              • Pure-expression-execution
            • Transformation-tools
            • Language
            • Representation
            • Insertion-sort
            • Pack
          • Soft
          • Bv
          • Imp-language
          • Ethereum
          • Event-macros
          • Java
          • Riscv
          • Bitcoin
          • Zcash
          • Yul
          • ACL2-programming-language
          • Prime-fields
          • Json
          • Syntheto
          • File-io-light
          • Cryptography
          • Number-theory
          • Axe
          • Lists-light
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Atc-symbolic-execution-rules

    Atc-exec-cast-rules-generation

    Code to generate the rules for executing cast operations.

    The hints expand exec-cast, convert-integer-value, value-integer, and value-integer->get, which produces something like (value-<dst> (value-<src>->get ...)), where <src> is the source type and <dst> is the destination type, with an intervening mod when the destination type is unsigned. We use the bridge rules to turn those constructor and destructors into the shallowly embedded ones (i.e. (<dst> (integer-from-<src> ...)), which are the ones used in the definitions of the shallowly embedded conversion functions, which we also open (unless source and destination types are equal), along with the okp predicates if applicable. We also need open u...-from-integer-mod to expose the mod in the shallowly embedded conversions to unsigned type, thus matching the mod in convert-integer-value. We open the <dst>-integerp functions to show that the ACL2 integer is in range, i.e. that convert-integer-value does not return an error; for this, we also need (locally included) rules about mod, to show that it is never negative as required for an unsigned range.

    Definitions and Theorems

    Function: atc-exec-cast-rules-gen

    (defun atc-exec-cast-rules-gen (dtype stype)
     (declare (xargs :guard (and (typep dtype) (typep stype))))
     (declare (xargs :guard (and (type-nonchar-integerp dtype)
                                 (type-nonchar-integerp stype))))
     (let ((__function__ 'atc-exec-cast-rules-gen))
      (declare (ignorable __function__))
      (b*
       ((dfixtype (integer-type-to-fixtype dtype))
        (sfixtype (integer-type-to-fixtype stype))
        (spred (pack sfixtype 'p))
        (name (pack 'exec-cast-of-
                    dfixtype '-when-
                    spred))
        (dtyname (type-to-tyname dtype))
        (dtype-from-stype (pack dfixtype '-from- sfixtype))
        (dtype-from-stype-okp (pack dtype-from-stype '-okp))
        (guardp
         (and
           (not (equal dtype stype))
           (or (type-case dtype :schar)
               (and (type-case dtype :sshort)
                    (not (member-eq (type-kind stype)
                                    '(:schar))))
               (and (type-case dtype :sint)
                    (not (member-eq (type-kind stype)
                                    '(:schar :sshort))))
               (and (type-case dtype :slong)
                    (not (member-eq (type-kind stype)
                                    '(:schar :sshort :sint))))
               (and (type-case dtype :sllong)
                    (not (member-eq (type-kind stype)
                                    '(:schar :sshort :sint :slong)))))))
        (hyps
           (cons 'and
                 (cons (atc-syntaxp-hyp-for-expr-pure 'x)
                       (cons (cons spred '(x))
                             (and guardp
                                  (cons (cons dtype-from-stype-okp '(x))
                                        'nil))))))
        (rhs (if (equal dtype stype)
                 'x
               (cons dtype-from-stype '(x))))
        (formula
         (cons
          'implies
          (cons
           hyps
           (cons
               (cons 'equal
                     (cons (cons 'exec-cast
                                 (cons (cons 'quote (cons dtyname 'nil))
                                       '((expr-value x objdes))))
                           (cons (cons 'expr-value (cons rhs '(nil)))
                                 'nil)))
               'nil))))
        (hints
         (cons
          ':enable
          (cons
           (cons
            'exec-cast
            (cons
             'eval-cast
             (cons
              'convert-integer-value
              (cons
               'value-integer
               (append
                *atc-value-integer->get-rules*
                (cons
                 'integer-type-rangep
                 (cons
                  'integer-type-min
                  (cons
                   'integer-type-max
                   (cons
                    'value-schar-to-schar-from-integer
                    (cons
                     'value-uchar-to-uchar-from-integer
                     (cons
                      'value-sshort-to-sshort-from-integer
                      (cons
                       'value-ushort-to-ushort-from-integer
                       (cons
                        'value-sint-to-sint-from-integer
                        (cons
                         'value-uint-to-uint-from-integer
                         (cons
                          'value-slong-to-slong-from-integer
                          (cons
                           'value-ulong-to-ulong-from-integer
                           (cons
                            'value-sllong-to-sllong-from-integer
                            (cons
                             'value-ullong-to-ullong-from-integer
                             (cons
                              'uchar-from-integer-mod
                              (cons
                               'ushort-from-integer-mod
                               (cons
                                'uint-from-integer-mod
                                (cons
                                 'ulong-from-integer-mod
                                 (cons
                                  'ullong-from-integer-mod
                                  (cons
                                   'schar-integerp-alt-def
                                   (cons
                                    'uchar-integerp-alt-def
                                    (cons
                                     'sshort-integerp-alt-def
                                     (cons
                                      'ushort-integerp-alt-def
                                      (cons
                                       'sint-integerp-alt-def
                                       (cons
                                        'uint-integerp-alt-def
                                        (cons
                                         'slong-integerp-alt-def
                                         (cons
                                          'ulong-integerp-alt-def
                                          (cons
                                           'sllong-integerp-alt-def
                                           (cons
                                            'ullong-integerp-alt-def
                                            (append
                                             (and
                                               (not (equal dtype stype))
                                               (list dtype-from-stype))
                                             (append
                                              (and
                                               guardp
                                               (list
                                                  dtype-from-stype-okp))
                                              '(apconvert-expr-value-when-not-value-array
                                                value-kind-when-ucharp
                                                value-kind-when-scharp
                                                value-kind-when-ushortp
                                                value-kind-when-sshortp
                                                value-kind-when-uintp
                                                value-kind-when-sintp
                                                value-kind-when-ulongp
                                                value-kind-when-slongp
                                                value-kind-when-ullongp
                                                value-kind-when-sllongp
                                                ifix
                                                not-errorp-when-expr-valuep
                                                not-errorp-when-valuep
                                                valuep-when-ucharp
                                                valuep-when-scharp
                                                valuep-when-ushortp
                                                valuep-when-sshortp
                                                valuep-when-uintp
                                                valuep-when-sintp
                                                valuep-when-ulongp
                                                valuep-when-slongp
                                                valuep-when-ullongp
                                                valuep-when-sllongp
                                                value-integerp
                                                value-unsigned-integerp
                                                value-signed-integerp))))))))))))))))))))))))))))))))))))
           '(:disable ((:e tau-system)
                       (:e integer-type-max)
                       (:e integer-type-min))))))
        (event (cons 'defruled
                     (cons name (cons formula hints)))))
       (mv name event))))

    Theorem: symbolp-of-atc-exec-cast-rules-gen.name

    (defthm symbolp-of-atc-exec-cast-rules-gen.name
      (b* (((mv ?name acl2::?event)
            (atc-exec-cast-rules-gen dtype stype)))
        (symbolp name))
      :rule-classes :rewrite)

    Theorem: pseudo-event-formp-of-atc-exec-cast-rules-gen.event

    (defthm pseudo-event-formp-of-atc-exec-cast-rules-gen.event
      (b* (((mv ?name acl2::?event)
            (atc-exec-cast-rules-gen dtype stype)))
        (pseudo-event-formp event))
      :rule-classes :rewrite)

    Function: atc-exec-cast-rules-gen-loop-stypes

    (defun atc-exec-cast-rules-gen-loop-stypes (dtype stypes)
      (declare (xargs :guard (and (typep dtype)
                                  (type-listp stypes))))
      (declare (xargs :guard (and (type-nonchar-integerp dtype)
                                  (type-nonchar-integer-listp stypes))))
      (let ((__function__ 'atc-exec-cast-rules-gen-loop-stypes))
        (declare (ignorable __function__))
        (b* (((when (endp stypes)) (mv nil nil))
             ((mv name event)
              (atc-exec-cast-rules-gen dtype (car stypes)))
             ((mv names events)
              (atc-exec-cast-rules-gen-loop-stypes dtype (cdr stypes))))
          (mv (cons name names)
              (cons event events)))))

    Theorem: symbol-listp-of-atc-exec-cast-rules-gen-loop-stypes.names

    (defthm symbol-listp-of-atc-exec-cast-rules-gen-loop-stypes.names
      (b* (((mv ?names ?events)
            (atc-exec-cast-rules-gen-loop-stypes dtype stypes)))
        (symbol-listp names))
      :rule-classes :rewrite)

    Theorem: pseudo-event-form-listp-of-atc-exec-cast-rules-gen-loop-stypes.events

    (defthm
     pseudo-event-form-listp-of-atc-exec-cast-rules-gen-loop-stypes.events
     (b* (((mv ?names ?events)
           (atc-exec-cast-rules-gen-loop-stypes dtype stypes)))
       (pseudo-event-form-listp events))
     :rule-classes :rewrite)

    Function: atc-exec-cast-rules-gen-loop-dtypes

    (defun atc-exec-cast-rules-gen-loop-dtypes (dtypes stypes)
      (declare (xargs :guard (and (type-listp dtypes)
                                  (type-listp stypes))))
      (declare (xargs :guard (and (type-nonchar-integer-listp dtypes)
                                  (type-nonchar-integer-listp stypes))))
      (let ((__function__ 'atc-exec-cast-rules-gen-loop-dtypes))
        (declare (ignorable __function__))
        (b* (((when (endp dtypes)) (mv nil nil))
             ((mv names events)
              (atc-exec-cast-rules-gen-loop-stypes (car dtypes)
                                                   stypes))
             ((mv names1 events1)
              (atc-exec-cast-rules-gen-loop-dtypes (cdr dtypes)
                                                   stypes)))
          (mv (append names names1)
              (append events events1)))))

    Theorem: symbol-listp-of-atc-exec-cast-rules-gen-loop-dtypes.names

    (defthm symbol-listp-of-atc-exec-cast-rules-gen-loop-dtypes.names
      (b* (((mv ?names ?events)
            (atc-exec-cast-rules-gen-loop-dtypes dtypes stypes)))
        (symbol-listp names))
      :rule-classes :rewrite)

    Theorem: pseudo-event-form-listp-of-atc-exec-cast-rules-gen-loop-dtypes.events

    (defthm
     pseudo-event-form-listp-of-atc-exec-cast-rules-gen-loop-dtypes.events
     (b* (((mv ?names ?events)
           (atc-exec-cast-rules-gen-loop-dtypes dtypes stypes)))
       (pseudo-event-form-listp events))
     :rule-classes :rewrite)

    Function: atc-exec-cast-rules-gen-all

    (defun atc-exec-cast-rules-gen-all nil
     (declare (xargs :guard t))
     (let ((__function__ 'atc-exec-cast-rules-gen-all))
      (declare (ignorable __function__))
      (b*
       (((mv names events)
         (atc-exec-cast-rules-gen-loop-dtypes *nonchar-integer-types*
                                              *nonchar-integer-types*)))
       (cons
        'progn
        (cons
         (cons
          'defsection
          (cons
           'atc-exec-cast-rules
           (cons
            ':short
            (cons
             '"Rules for executing casts."
             (append
                 events
                 (cons (cons 'defval
                             (cons '*atc-exec-cast-rules*
                                   (cons (cons 'quote (cons names 'nil))
                                         'nil)))
                       'nil))))))
         'nil)))))

    Theorem: pseudo-event-formp-of-atc-exec-cast-rules-gen-all

    (defthm pseudo-event-formp-of-atc-exec-cast-rules-gen-all
      (b* ((event (atc-exec-cast-rules-gen-all)))
        (pseudo-event-formp event))
      :rule-classes :rewrite)