(* Generated by coq-of-rust *)
Require Import CoqOfRust.CoqOfRust.

Module specification.
  (*
  Enum SpecId
  {
    const_params := [];
    ty_params := [];
    variants :=
      [
        {
          name := "FRONTIER";
          item := StructTuple [];
          discriminant := Some 0;
        };
        {
          name := "FRONTIER_THAWING";
          item := StructTuple [];
          discriminant := Some 1;
        };
        {
          name := "HOMESTEAD";
          item := StructTuple [];
          discriminant := Some 2;
        };
        {
          name := "DAO_FORK";
          item := StructTuple [];
          discriminant := Some 3;
        };
        {
          name := "TANGERINE";
          item := StructTuple [];
          discriminant := Some 4;
        };
        {
          name := "SPURIOUS_DRAGON";
          item := StructTuple [];
          discriminant := Some 5;
        };
        {
          name := "BYZANTIUM";
          item := StructTuple [];
          discriminant := Some 6;
        };
        {
          name := "CONSTANTINOPLE";
          item := StructTuple [];
          discriminant := Some 7;
        };
        {
          name := "PETERSBURG";
          item := StructTuple [];
          discriminant := Some 8;
        };
        {
          name := "ISTANBUL";
          item := StructTuple [];
          discriminant := Some 9;
        };
        {
          name := "MUIR_GLACIER";
          item := StructTuple [];
          discriminant := Some 10;
        };
        {
          name := "BERLIN";
          item := StructTuple [];
          discriminant := Some 11;
        };
        {
          name := "LONDON";
          item := StructTuple [];
          discriminant := Some 12;
        };
        {
          name := "ARROW_GLACIER";
          item := StructTuple [];
          discriminant := Some 13;
        };
        {
          name := "GRAY_GLACIER";
          item := StructTuple [];
          discriminant := Some 14;
        };
        {
          name := "MERGE";
          item := StructTuple [];
          discriminant := Some 15;
        };
        {
          name := "SHANGHAI";
          item := StructTuple [];
          discriminant := Some 16;
        };
        {
          name := "CANCUN";
          item := StructTuple [];
          discriminant := Some 17;
        };
        {
          name := "PRAGUE";
          item := StructTuple [];
          discriminant := Some 18;
        };
        {
          name := "LATEST";
          item := StructTuple [];
          discriminant := None;
        }
      ];
  }
  *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [
              M.read (| f |);
              M.read (|
                M.match_operator (|
                  self,
                  [
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::FRONTIER"
                          |) in
                        M.alloc (| M.read (| Value.String "FRONTIER" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::FRONTIER_THAWING"
                          |) in
                        M.alloc (| M.read (| Value.String "FRONTIER_THAWING" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::HOMESTEAD"
                          |) in
                        M.alloc (| M.read (| Value.String "HOMESTEAD" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::DAO_FORK"
                          |) in
                        M.alloc (| M.read (| Value.String "DAO_FORK" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::TANGERINE"
                          |) in
                        M.alloc (| M.read (| Value.String "TANGERINE" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::SPURIOUS_DRAGON"
                          |) in
                        M.alloc (| M.read (| Value.String "SPURIOUS_DRAGON" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::BYZANTIUM"
                          |) in
                        M.alloc (| M.read (| Value.String "BYZANTIUM" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::CONSTANTINOPLE"
                          |) in
                        M.alloc (| M.read (| Value.String "CONSTANTINOPLE" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::PETERSBURG"
                          |) in
                        M.alloc (| M.read (| Value.String "PETERSBURG" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::ISTANBUL"
                          |) in
                        M.alloc (| M.read (| Value.String "ISTANBUL" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::MUIR_GLACIER"
                          |) in
                        M.alloc (| M.read (| Value.String "MUIR_GLACIER" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::BERLIN"
                          |) in
                        M.alloc (| M.read (| Value.String "BERLIN" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::LONDON"
                          |) in
                        M.alloc (| M.read (| Value.String "LONDON" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::ARROW_GLACIER"
                          |) in
                        M.alloc (| M.read (| Value.String "ARROW_GLACIER" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::GRAY_GLACIER"
                          |) in
                        M.alloc (| M.read (| Value.String "GRAY_GLACIER" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::MERGE"
                          |) in
                        M.alloc (| M.read (| Value.String "MERGE" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::SHANGHAI"
                          |) in
                        M.alloc (| M.read (| Value.String "SHANGHAI" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::CANCUN"
                          |) in
                        M.alloc (| M.read (| Value.String "CANCUN" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::PRAGUE"
                          |) in
                        M.alloc (| M.read (| Value.String "PRAGUE" |) |)));
                    fun γ =>
                      ltac:(M.monadic
                        (let γ := M.read (| γ |) in
                        let _ :=
                          M.is_struct_tuple (|
                            γ,
                            "revm_primitives::specification::SpecId::LATEST"
                          |) in
                        M.alloc (| M.read (| Value.String "LATEST" |) |)))
                  ]
                |)
              |)
            ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::SpecId::LATEST" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          M.read (|
            let~ __self_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| self |) ]
                |)
              |) in
            let~ __arg1_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| other |) ]
                |)
              |) in
            M.alloc (| BinOp.eq (| M.read (| __self_discr |), M.read (| __arg1_discr |) |) |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          M.read (|
            let~ __self_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| self |) ]
                |)
              |) in
            let~ __arg1_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| other |) ]
                |)
              |) in
            M.alloc (|
              M.call_closure (|
                M.get_trait_method (|
                  "core::cmp::PartialOrd",
                  Ty.path "u8",
                  [ Ty.path "u8" ],
                  "partial_cmp",
                  []
                |),
                [ __self_discr; __arg1_discr ]
              |)
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          M.read (|
            let~ __self_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| self |) ]
                |)
              |) in
            let~ __arg1_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| other |) ]
                |)
              |) in
            M.alloc (|
              M.call_closure (|
                M.get_trait_method (| "core::cmp::Ord", Ty.path "u8", [], "cmp", [] |),
                [ __self_discr; __arg1_discr ]
              |)
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          M.read (|
            let~ __self_discr :=
              M.alloc (|
                M.call_closure (|
                  M.get_function (|
                    "core::intrinsics::discriminant_value",
                    [ Ty.path "revm_primitives::specification::SpecId" ]
                  |),
                  [ M.read (| self |) ]
                |)
              |) in
            M.alloc (|
              M.call_closure (|
                M.get_trait_method (| "core::hash::Hash", Ty.path "u8", [], "hash", [ __H ] |),
                [ __self_discr; M.read (| state |) ]
              |)
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_SpecId.
  
  Module Impl_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (* enumn::N *)
    Definition n (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ value ] =>
        ltac:(M.monadic
          (let value := M.alloc (| value |) in
          M.read (|
            M.match_operator (|
              value,
              [
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 0
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::FRONTIER" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 1
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::FRONTIER_THAWING"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 2
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::HOMESTEAD" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 3
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::DAO_FORK" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 4
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::TANGERINE" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 5
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::SPURIOUS_DRAGON"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 6
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::BYZANTIUM" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 7
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::CONSTANTINOPLE"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 8
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::PETERSBURG" []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 9
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::ISTANBUL" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 10
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::MUIR_GLACIER"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 11
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::BERLIN" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 12
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::LONDON" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 13
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::ARROW_GLACIER"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 14
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [
                          Value.StructTuple
                            "revm_primitives::specification::SpecId::GRAY_GLACIER"
                            []
                        ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 15
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::MERGE" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 16
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::SHANGHAI" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 17
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::CANCUN" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 18
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::PRAGUE" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.Integer IntegerKind.U8 255
                      |) in
                    M.alloc (|
                      Value.StructTuple
                        "core::option::Option::Some"
                        [ Value.StructTuple "revm_primitives::specification::SpecId::LATEST" [] ]
                    |)));
                fun γ =>
                  ltac:(M.monadic (M.alloc (| Value.StructTuple "core::option::Option::None" [] |)))
              ]
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom AssociatedFunction_n : M.IsAssociatedFunction Self "n" n.
    (*
        pub fn try_from_u8(spec_id: u8) -> Option<Self> {
            Self::n(spec_id)
        }
    *)
    Definition try_from_u8 (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ spec_id ] =>
        ltac:(M.monadic
          (let spec_id := M.alloc (| spec_id |) in
          M.call_closure (|
            M.get_associated_function (|
              Ty.path "revm_primitives::specification::SpecId",
              "n",
              []
            |),
            [ M.read (| spec_id |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom AssociatedFunction_try_from_u8 : M.IsAssociatedFunction Self "try_from_u8" try_from_u8.
    
    (*
        pub const fn is_enabled_in(self, other: Self) -> bool {
            Self::enabled(self, other)
        }
    *)
    Definition is_enabled_in (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          M.call_closure (|
            M.get_associated_function (|
              Ty.path "revm_primitives::specification::SpecId",
              "enabled",
              []
            |),
            [ M.read (| self |); M.read (| other |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom AssociatedFunction_is_enabled_in :
      M.IsAssociatedFunction Self "is_enabled_in" is_enabled_in.
    
    (*
        pub const fn enabled(our: SpecId, other: SpecId) -> bool {
            our as u8 >= other as u8
        }
    *)
    Definition enabled (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ our; other ] =>
        ltac:(M.monadic
          (let our := M.alloc (| our |) in
          let other := M.alloc (| other |) in
          BinOp.ge (| M.rust_cast (M.read (| our |)), M.rust_cast (M.read (| other |)) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom AssociatedFunction_enabled : M.IsAssociatedFunction Self "enabled" enabled.
  End Impl_revm_primitives_specification_SpecId.
  
  
  Module Impl_core_convert_From_ref__str_for_revm_primitives_specification_SpecId.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpecId".
    
    (*
        fn from(name: &str) -> Self {
            match name {
                "Frontier" => Self::FRONTIER,
                "Homestead" => Self::HOMESTEAD,
                "Tangerine" => Self::TANGERINE,
                "Spurious" => Self::SPURIOUS_DRAGON,
                "Byzantium" => Self::BYZANTIUM,
                "Constantinople" => Self::CONSTANTINOPLE,
                "Petersburg" => Self::PETERSBURG,
                "Istanbul" => Self::ISTANBUL,
                "MuirGlacier" => Self::MUIR_GLACIER,
                "Berlin" => Self::BERLIN,
                "London" => Self::LONDON,
                "Merge" => Self::MERGE,
                "Shanghai" => Self::SHANGHAI,
                "Cancun" => Self::CANCUN,
                "Prague" => Self::PRAGUE,
                #[cfg(feature = "optimism")]
                "Bedrock" => SpecId::BEDROCK,
                #[cfg(feature = "optimism")]
                "Regolith" => SpecId::REGOLITH,
                #[cfg(feature = "optimism")]
                "Canyon" => SpecId::CANYON,
                #[cfg(feature = "optimism")]
                "Ecotone" => SpecId::ECOTONE,
                _ => Self::LATEST,
            }
        }
    *)
    Definition from (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ name ] =>
        ltac:(M.monadic
          (let name := M.alloc (| name |) in
          M.read (|
            M.match_operator (|
              name,
              [
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Frontier" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::FRONTIER" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Homestead" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::HOMESTEAD" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Tangerine" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::TANGERINE" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Spurious" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::SPURIOUS_DRAGON" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Byzantium" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::BYZANTIUM" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.String "Constantinople"
                      |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::CONSTANTINOPLE" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.String "Petersburg"
                      |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::PETERSBURG" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Istanbul" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::ISTANBUL" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (|
                        M.read (| γ |),
                        Value.String "MuirGlacier"
                      |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::MUIR_GLACIER" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Berlin" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::BERLIN" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "London" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::LONDON" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Merge" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::MERGE" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Shanghai" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::SHANGHAI" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Cancun" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::CANCUN" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_constant_or_break_match (| M.read (| γ |), Value.String "Prague" |) in
                    M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::PRAGUE" []
                    |)));
                fun γ =>
                  ltac:(M.monadic
                    (M.alloc (|
                      Value.StructTuple "revm_primitives::specification::SpecId::LATEST" []
                    |)))
              ]
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::convert::From"
        Self
        (* Trait polymorphic types *) [ (* T *) Ty.apply (Ty.path "&") [] [ Ty.path "str" ] ]
        (* Instance *) [ ("from", InstanceField.Method from) ].
  End Impl_core_convert_From_ref__str_for_revm_primitives_specification_SpecId.
  
  Module Impl_core_convert_From_revm_primitives_specification_SpecId_for_ref__str.
    Definition Self : Ty.t := Ty.apply (Ty.path "&") [] [ Ty.path "str" ].
    
    (*
        fn from(spec_id: SpecId) -> Self {
            match spec_id {
                SpecId::FRONTIER => "Frontier",
                SpecId::FRONTIER_THAWING => "Frontier Thawing",
                SpecId::HOMESTEAD => "Homestead",
                SpecId::DAO_FORK => "DAO Fork",
                SpecId::TANGERINE => "Tangerine",
                SpecId::SPURIOUS_DRAGON => "Spurious",
                SpecId::BYZANTIUM => "Byzantium",
                SpecId::CONSTANTINOPLE => "Constantinople",
                SpecId::PETERSBURG => "Petersburg",
                SpecId::ISTANBUL => "Istanbul",
                SpecId::MUIR_GLACIER => "MuirGlacier",
                SpecId::BERLIN => "Berlin",
                SpecId::LONDON => "London",
                SpecId::ARROW_GLACIER => "Arrow Glacier",
                SpecId::GRAY_GLACIER => "Gray Glacier",
                SpecId::MERGE => "Merge",
                SpecId::SHANGHAI => "Shanghai",
                SpecId::CANCUN => "Cancun",
                SpecId::PRAGUE => "Prague",
                #[cfg(feature = "optimism")]
                SpecId::BEDROCK => "Bedrock",
                #[cfg(feature = "optimism")]
                SpecId::REGOLITH => "Regolith",
                #[cfg(feature = "optimism")]
                SpecId::CANYON => "Canyon",
                #[cfg(feature = "optimism")]
                SpecId::ECOTONE => "Ecotone",
                SpecId::LATEST => "Latest",
            }
        }
    *)
    Definition from (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ spec_id ] =>
        ltac:(M.monadic
          (let spec_id := M.alloc (| spec_id |) in
          M.read (|
            M.match_operator (|
              spec_id,
              [
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::FRONTIER"
                      |) in
                    Value.String "Frontier"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::FRONTIER_THAWING"
                      |) in
                    Value.String "Frontier Thawing"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::HOMESTEAD"
                      |) in
                    Value.String "Homestead"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::DAO_FORK"
                      |) in
                    Value.String "DAO Fork"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::TANGERINE"
                      |) in
                    Value.String "Tangerine"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::SPURIOUS_DRAGON"
                      |) in
                    Value.String "Spurious"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::BYZANTIUM"
                      |) in
                    Value.String "Byzantium"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::CONSTANTINOPLE"
                      |) in
                    Value.String "Constantinople"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::PETERSBURG"
                      |) in
                    Value.String "Petersburg"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::ISTANBUL"
                      |) in
                    Value.String "Istanbul"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::MUIR_GLACIER"
                      |) in
                    Value.String "MuirGlacier"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::BERLIN" |) in
                    Value.String "Berlin"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::LONDON" |) in
                    Value.String "London"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::ARROW_GLACIER"
                      |) in
                    Value.String "Arrow Glacier"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::GRAY_GLACIER"
                      |) in
                    Value.String "Gray Glacier"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::MERGE" |) in
                    Value.String "Merge"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (|
                        γ,
                        "revm_primitives::specification::SpecId::SHANGHAI"
                      |) in
                    Value.String "Shanghai"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::CANCUN" |) in
                    Value.String "Cancun"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::PRAGUE" |) in
                    Value.String "Prague"));
                fun γ =>
                  ltac:(M.monadic
                    (let _ :=
                      M.is_struct_tuple (| γ, "revm_primitives::specification::SpecId::LATEST" |) in
                    Value.String "Latest"))
              ]
            |)
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::convert::From"
        Self
        (* Trait polymorphic types *) [ (* T *) Ty.path "revm_primitives::specification::SpecId" ]
        (* Instance *) [ ("from", InstanceField.Method from) ].
  End Impl_core_convert_From_revm_primitives_specification_SpecId_for_ref__str.
  
  (* Trait *)
  Module Spec.
    Definition enabled (Self : Ty.t) (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ spec_id ] =>
        ltac:(M.monadic
          (let spec_id := M.alloc (| spec_id |) in
          M.call_closure (|
            M.get_associated_function (|
              Ty.path "revm_primitives::specification::SpecId",
              "enabled",
              []
            |),
            [
              M.read (| M.get_constant (| "revm_primitives::specification::Spec::SPEC_ID" |) |);
              M.read (| spec_id |)
            ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom ProvidedMethod_enabled :
      M.IsProvidedMethod "revm_primitives::specification::Spec" "enabled" enabled.
  End Spec.
  
  (* StructTuple
    {
      name := "FrontierSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "FrontierSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::FrontierSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_FrontierSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_FrontierSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::FrontierSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::FRONTIER" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_FrontierSpec.
  
  (* StructTuple
    {
      name := "HomesteadSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "HomesteadSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::HomesteadSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_HomesteadSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_HomesteadSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::HomesteadSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::HOMESTEAD" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_HomesteadSpec.
  
  (* StructTuple
    {
      name := "TangerineSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "TangerineSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::TangerineSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_TangerineSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_TangerineSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::TangerineSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::TANGERINE" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_TangerineSpec.
  
  (* StructTuple
    {
      name := "SpuriousDragonSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "SpuriousDragonSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::SpuriousDragonSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_SpuriousDragonSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_SpuriousDragonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::SpuriousDragonSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (|
            Value.StructTuple "revm_primitives::specification::SpecId::SPURIOUS_DRAGON" []
          |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_SpuriousDragonSpec.
  
  (* StructTuple
    {
      name := "ByzantiumSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "ByzantiumSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::ByzantiumSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_ByzantiumSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_ByzantiumSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ByzantiumSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::BYZANTIUM" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_ByzantiumSpec.
  
  (* StructTuple
    {
      name := "PetersburgSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "PetersburgSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::PetersburgSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_PetersburgSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_PetersburgSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PetersburgSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (|
            Value.StructTuple "revm_primitives::specification::SpecId::PETERSBURG" []
          |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_PetersburgSpec.
  
  (* StructTuple
    {
      name := "IstanbulSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "IstanbulSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::IstanbulSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_IstanbulSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_IstanbulSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::IstanbulSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::ISTANBUL" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_IstanbulSpec.
  
  (* StructTuple
    {
      name := "BerlinSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "BerlinSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::BerlinSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_BerlinSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_BerlinSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::BerlinSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::BERLIN" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_BerlinSpec.
  
  (* StructTuple
    {
      name := "LondonSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "LondonSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::LondonSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_LondonSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_LondonSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LondonSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::LONDON" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_LondonSpec.
  
  (* StructTuple
    {
      name := "MergeSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "MergeSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::MergeSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_MergeSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_MergeSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::MergeSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::MERGE" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_MergeSpec.
  
  (* StructTuple
    {
      name := "ShanghaiSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "ShanghaiSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::ShanghaiSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_ShanghaiSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_ShanghaiSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::ShanghaiSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::SHANGHAI" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_ShanghaiSpec.
  
  (* StructTuple
    {
      name := "CancunSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "CancunSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::CancunSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_CancunSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_CancunSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::CancunSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::CANCUN" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_CancunSpec.
  
  (* StructTuple
    {
      name := "PragueSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "PragueSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::PragueSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_PragueSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_PragueSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::PragueSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::PRAGUE" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_PragueSpec.
  
  (* StructTuple
    {
      name := "LatestSpec";
      const_params := [];
      ty_params := [];
      fields := [];
    } *)
  
  Module Impl_core_clone_Clone_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Clone *)
    Definition clone (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          M.read (| M.read (| self |) |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::clone::Clone"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("clone", InstanceField.Method clone) ].
  End Impl_core_clone_Clone_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_marker_Copy_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::Copy"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_Copy_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_fmt_Debug_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Debug *)
    Definition fmt (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; f ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let f := M.alloc (| f |) in
          M.call_closure (|
            M.get_associated_function (| Ty.path "core::fmt::Formatter", "write_str", [] |),
            [ M.read (| f |); M.read (| Value.String "LatestSpec" |) ]
          |)))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::fmt::Debug"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("fmt", InstanceField.Method fmt) ].
  End Impl_core_fmt_Debug_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_default_Default_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Default *)
    Definition default (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [] =>
        ltac:(M.monadic (Value.StructTuple "revm_primitives::specification::LatestSpec" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::default::Default"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("default", InstanceField.Method default) ].
  End Impl_core_default_Default_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    Axiom Implements :
      M.IsTraitInstance
        "core::marker::StructuralPartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [].
  End Impl_core_marker_StructuralPartialEq_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_cmp_PartialEq_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         PartialEq *)
    Definition eq (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.Bool true))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialEq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("eq", InstanceField.Method eq) ].
  End Impl_core_cmp_PartialEq_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_cmp_Eq_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Eq *)
    Definition assert_receiver_is_total_eq
        (ε : list Value.t)
        (τ : list Ty.t)
        (α : list Value.t)
        : M :=
      match ε, τ, α with
      | [], [], [ self ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Eq"
        Self
        (* Trait polymorphic types *) []
        (* Instance *)
        [ ("assert_receiver_is_total_eq", InstanceField.Method assert_receiver_is_total_eq) ].
  End Impl_core_cmp_Eq_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_cmp_PartialOrd_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         PartialOrd *)
    Definition partial_cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple
            "core::option::Option::Some"
            [ Value.StructTuple "core::cmp::Ordering::Equal" [] ]))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::PartialOrd"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("partial_cmp", InstanceField.Method partial_cmp) ].
  End Impl_core_cmp_PartialOrd_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_cmp_Ord_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Ord *)
    Definition cmp (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [], [ self; other ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let other := M.alloc (| other |) in
          Value.StructTuple "core::cmp::Ordering::Equal" []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::cmp::Ord"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("cmp", InstanceField.Method cmp) ].
  End Impl_core_cmp_Ord_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_core_hash_Hash_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*         Hash *)
    Definition hash (ε : list Value.t) (τ : list Ty.t) (α : list Value.t) : M :=
      match ε, τ, α with
      | [], [ __H ], [ self; state ] =>
        ltac:(M.monadic
          (let self := M.alloc (| self |) in
          let state := M.alloc (| state |) in
          Value.Tuple []))
      | _, _, _ => M.impossible "wrong number of arguments"
      end.
    
    Axiom Implements :
      M.IsTraitInstance
        "core::hash::Hash"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("hash", InstanceField.Method hash) ].
  End Impl_core_hash_Hash_for_revm_primitives_specification_LatestSpec.
  
  Module Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_LatestSpec.
    Definition Self : Ty.t := Ty.path "revm_primitives::specification::LatestSpec".
    
    (*             const SPEC_ID: SpecId = $spec_id; *)
    (* Ty.path "revm_primitives::specification::SpecId" *)
    Definition value_SPEC_ID : Value.t :=
      M.run
        ltac:(M.monadic
          (M.alloc (| Value.StructTuple "revm_primitives::specification::SpecId::LATEST" [] |))).
    
    Axiom Implements :
      M.IsTraitInstance
        "revm_primitives::specification::Spec"
        Self
        (* Trait polymorphic types *) []
        (* Instance *) [ ("value_SPEC_ID", InstanceField.Constant value_SPEC_ID) ].
  End Impl_revm_primitives_specification_Spec_for_revm_primitives_specification_LatestSpec.
End specification.
