• 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-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-gen-expr-struct-read-array
                  • Atc-gen-expr-pure/bool
                  • Atc-gen-expr-integer-read
                  • Atc-gen-expr-cond
                  • Atc-gen-expr-binary
                  • Atc-gen-expr-or
                  • Atc-gen-expr-array-read
                  • Expr-gin
                  • Exprs-gin
                  • Atc-gen-expr-and
                  • Atc-gen-expr-struct-read-scalar
                    • Exprs-gout
                    • Atc-gen-expr-unary
                    • Atc-gen-expr-conv
                    • Expr-gout
                    • Atc-gen-expr-bool-from-type
                    • Atc-gen-expr-sint-from-bool
                    • Atc-gen-expr-const
                    • Atc-gen-expr-var
                    • Atc-gen-expr-pure-list
                    • Irr-exprs-gout
                    • Irr-expr-gout
                  • 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-expression-generation

    Atc-gen-expr-struct-read-scalar

    Generate a C expression from an ACL2 term that represents a structure scalar read.

    Signature
    (atc-gen-expr-struct-read-scalar 
         fn arg-term arg-expr arg-type arg-events 
         arg-thm tag member mem-type gin state) 
     
      → 
    (mv erp gout)
    Arguments
    fn — Guard (symbolp fn).
    arg-term — Guard (pseudo-termp arg-term).
    arg-expr — Guard (exprp arg-expr).
    arg-type — Guard (typep arg-type).
    arg-events — Guard (pseudo-event-form-listp arg-events).
    arg-thm — Guard (symbolp arg-thm).
    tag — Guard (identp tag).
    member — Guard (identp member).
    mem-type — Guard (typep mem-type).
    gin — Guard (expr-ginp gin).
    Returns
    gout — Type (expr-goutp gout).

    Definitions and Theorems

    Function: atc-gen-expr-struct-read-scalar

    (defun atc-gen-expr-struct-read-scalar
           (fn arg-term arg-expr arg-type arg-events
               arg-thm tag member mem-type gin state)
     (declare (xargs :stobjs (state)))
     (declare (xargs :guard (and (symbolp fn)
                                 (pseudo-termp arg-term)
                                 (exprp arg-expr)
                                 (typep arg-type)
                                 (pseudo-event-form-listp arg-events)
                                 (symbolp arg-thm)
                                 (identp tag)
                                 (identp member)
                                 (typep mem-type)
                                 (expr-ginp gin))))
     (declare (xargs :guard (type-nonchar-integerp mem-type)))
     (let ((__function__ 'atc-gen-expr-struct-read-scalar))
      (declare (ignorable __function__))
      (b*
       (((reterr) (irr-expr-gout))
        ((expr-gin gin) gin)
        (term (cons fn (cons arg-term 'nil)))
        ((unless (symbolp arg-term))
         (reterr
          (raise
           "Internal error: ~
                            structure read ~x0 applied to non-variable ~x1."
           fn arg-term))))
       (cond
        ((equal arg-type (type-struct tag))
         (b*
          ((expr (make-expr-member :target arg-expr
                                   :name member))
           ((when (not gin.proofs))
            (retok (make-expr-gout :expr expr
                                   :type mem-type
                                   :term term
                                   :events arg-events
                                   :thm-name nil
                                   :thm-index gin.thm-index
                                   :names-to-avoid gin.names-to-avoid)))
           (recognizer (atc-type-to-recognizer arg-type gin.prec-tags))
           (exec-member-read-when-struct-tag-p-and-member
                (pack 'exec-member-read-when-
                      recognizer '-and-
                      (ident->name member)))
           (info (atc-get-var arg-term gin.inscope))
           ((unless info)
            (reterr (raise "Internal error: variable ~x0 not found."
                           arg-term)))
           (var-thm (atc-var-info->thm info))
           (mem-typep (atc-type-to-recognizer mem-type gin.prec-tags))
           (mem-typep-of-fn (packn-pos (list mem-typep '-of- fn)
                                       fn))
           (hints
            (cons
             (cons
              '"Goal"
              (cons
               ':in-theory
               (cons
                (cons
                 'quote
                 (cons
                  (cons
                   'exec-expr-pure-when-member
                   (cons
                    '(:e expr-kind)
                    (cons
                     '(:e expr-member->target)
                     (cons
                      '(:e expr-member->name)
                      (cons
                       arg-thm
                       (cons
                        'expr-valuep-of-expr-value
                        (cons
                         exec-member-read-when-struct-tag-p-and-member
                         (cons
                          'exec-member-of-const-identifier
                          (cons
                           '(:e identp)
                           (cons
                            '(:e ident->name)
                            (cons
                             'objdesign-option-fix-when-objdesign-optionp
                             (cons
                              'objdesign-optionp-of-objdesign-of-var
                              (cons
                                var-thm
                                (cons mem-typep-of-fn 'nil))))))))))))))
                  'nil))
                'nil)))
             'nil))
           (objdes
            (cons
             'objdesign-member
             (cons
              (cons
               'objdesign-of-var
               (cons
                   (cons 'ident
                         (cons (cons 'quote
                                     (cons (symbol-name arg-term) 'nil))
                               'nil))
                   (cons gin.compst-var 'nil)))
              (cons (cons 'ident
                          (cons (cons 'quote
                                      (cons (ident->name member) 'nil))
                                'nil))
                    'nil))))
           ((mv thm-event
                thm-name thm-index names-to-avoid)
            (atc-gen-expr-pure-correct-thm
                 gin.fn gin.fn-guard gin.context expr
                 mem-type term term objdes gin.compst-var
                 hints nil gin.prec-tags gin.thm-index
                 gin.names-to-avoid state)))
          (retok
            (make-expr-gout :expr expr
                            :type mem-type
                            :term term
                            :events (append arg-events (list thm-event))
                            :thm-name thm-name
                            :thm-index thm-index
                            :names-to-avoid names-to-avoid))))
        ((equal arg-type
                (type-pointer (type-struct tag)))
         (b*
          ((expr (make-expr-memberp :target arg-expr
                                    :name member))
           ((when (not gin.proofs))
            (retok (make-expr-gout :expr expr
                                   :type mem-type
                                   :term term
                                   :events arg-events
                                   :thm-name nil
                                   :thm-index gin.thm-index
                                   :names-to-avoid gin.names-to-avoid)))
           (arg-type (type-pointer->to arg-type))
           (recognizer (atc-type-to-recognizer arg-type gin.prec-tags))
           (exec-memberp-read-when-struct-point-p-and-x
                (pack 'exec-memberp-read-when-
                      recognizer '-and-
                      (ident->name member)))
           (mem-typep (atc-type-to-recognizer mem-type gin.prec-tags))
           (mem-typep-of-fn (packn-pos (list mem-typep '-of- fn)
                                       fn))
           (hints
            (cons
             (cons
              '"Goal"
              (cons
               ':in-theory
               (cons
                (cons
                 'quote
                 (cons
                  (cons
                   'exec-expr-pure-when-memberp
                   (cons
                    '(:e expr-kind)
                    (cons
                     '(:e expr-memberp->target)
                     (cons
                      '(:e expr-memberp->name)
                      (cons
                       arg-thm
                       (cons
                        'expr-valuep-of-expr-value
                        (cons
                         exec-memberp-read-when-struct-point-p-and-x
                         (cons
                          'exec-memberp-of-const-identifier
                          (cons
                           '(:e identp)
                           (cons
                            '(:e ident->name)
                            (cons
                             'read-object-of-add-var
                             (cons
                              'read-object-of-add-frame
                              (cons
                               'read-object-of-update-object-same
                               (cons
                                'read-object-of-update-object-disjoint
                                (cons
                                 'object-disjointp-commutative
                                 (cons
                                    mem-typep-of-fn 'nil))))))))))))))))
                  'nil))
                'nil)))
             'nil))
           (objdes
            (cons
             'objdesign-member
             (cons
               (add-suffix-to-fn arg-term "-OBJDES")
               (cons (cons 'ident
                           (cons (cons 'quote
                                       (cons (ident->name member) 'nil))
                                 'nil))
                     'nil))))
           ((mv thm-event
                thm-name thm-index names-to-avoid)
            (atc-gen-expr-pure-correct-thm
                 gin.fn gin.fn-guard gin.context expr
                 mem-type term term objdes gin.compst-var
                 hints nil gin.prec-tags gin.thm-index
                 gin.names-to-avoid state)))
          (retok
            (make-expr-gout :expr expr
                            :type mem-type
                            :term term
                            :events (append arg-events (list thm-event))
                            :thm-name thm-name
                            :thm-index thm-index
                            :names-to-avoid names-to-avoid))))
        (t
         (reterr
          (msg
           "The reading of a ~x0 structure with member ~x1 ~
                        is applied to ~
                        an expression term ~x2 returning ~x3, ~
                        but a an operand of type ~x4 or ~x5 ~
                        is expected. ~
                        This is indicative of provably dead code, ~
                        given that the code is guard-verified."
           tag member
           arg-term arg-type (type-struct tag)
           (type-pointer (type-struct tag)))))))))

    Theorem: expr-goutp-of-atc-gen-expr-struct-read-scalar.gout

    (defthm expr-goutp-of-atc-gen-expr-struct-read-scalar.gout
      (b* (((mv acl2::?erp ?gout)
            (atc-gen-expr-struct-read-scalar
                 fn arg-term arg-expr arg-type arg-events
                 arg-thm tag member mem-type gin state)))
        (expr-goutp gout))
      :rule-classes :rewrite)