From ab79fe9e1c87c1178f88fd7f1d57c4ee31c71a1e Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 24 May 2022 22:22:42 -0400 Subject: [PATCH 01/30] type well formed done --- docs/petr4spec/Petr4-spec.mdk | 117 +++++++++++++++++++++------------- docs/petr4spec/ops.tex | 35 +++++++--- lib/checker.ml | 49 ++++++++------ 3 files changed, 128 insertions(+), 73 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index ded629735..183a25ee6 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -271,7 +271,7 @@ explicit cast ok checks whether typ1 can be converted to typ2 under e based on P \pprim l \leq \pprim h < \width \\ \expenv \bitString {\prim \bitString} \typ \dir \\ \typ = \intWidthTyp \width \textOr \bitWidthTyp \width} - {\expenv {\bitStringAccess \bitString \low \high} {\bitStringAccess \bitString {\pprim \low} {\pprim \high}} {\bitStringTyp {\pprim \low} {\pprim \high}} \dir } + {\expenv {\bitStringAccess \bitString \low \high} {\bitStringAccess \bitString {\pprim \low} {\pprim \high}} {\bitStringTyp {\pprim \high - \pprim \low}} \dir } \inferrule[List] {1 \leq i \leq n; \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} @@ -290,8 +290,8 @@ explicit cast ok checks whether typ1 can be converted to typ2 under e based on P { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\bitWidthTyp \width} \dir } \inferrule[UnaryMinusCTK] - { \expenv \exp {\prim \exp} \intTyp \dir } - { \expenv {-\exp} {-\prim \exp} \intTyp \dir } + { \expenv \exp {\prim \exp} \integerTyp \dir } + { \expenv {-\exp} {-\prim \exp} \integerTyp \dir } \inferrule[UnaryMinus] { \expenv \exp {\prim \exp} {\intWidthTyp \width} \dir } @@ -376,7 +376,7 @@ explicit cast ok checks whether typ1 can be converted to typ2 under e based on P ~ ### Coerce Binary Operation Arguments Auxiliary Judgment -Let implicitCast typ1 typ2 be defined as follows to describe P4's implicit +Let implicitCast typ typ be defined as follows to describe P4's implicit casting behavior on operands in binary expressions: cast typ exp produces a cast expression if the type of exp is different from the @@ -505,8 +505,13 @@ compile time known determinez if the value of an expression can be known at comp ### Type Well-Formed Auxiliary Judgment it saturates all types first and then checks well-formedness. for breviety, we don't include the saturation in rules. -is valid nested type outer inner checks whether the nested type is taking valid types in its inner and outer type based on P4's description of type nesting rules section 7.2.7 (provide link). -no duplicate determines if there are duplicate fields in a structure/type. +is valid nested type outer inner checks whether the nested type is taking valid types in its inner and outer type based on P4's description of type nesting rules section 7.2.7 (provide link). +insert type var adds a type variable to the env. +lookup extern in env returns an externMethods type which includes a list of strings as +type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. +getTypeParams get type parameters from types that have type parameters including package, control, parser, function, and it's equivalent to look up for extern. + +names to type env. ~ Center {padding:1ex} ~~ Snippet \begin{mathpar} @@ -520,19 +525,19 @@ no duplicate determines if there are duplicate fields in a structure/type. { } { \typWellFormed \stringTyp } - \inferrule[Integer] + \inferrule[(InfinitPrecision)Integer] { } { \typWellFormed \integerTyp } - \inferrule[Int] - { } + \inferrule[SignedInteger] + { 1 < \width} { \typWellFormed {\intWidthTyp \width} } - \inferrule[Bit] - { } + \inferrule[BitString(UnsignedInteger)] + { 0 \leq \width} { \typWellFormed {\bitWidthTyp \width} } - \inferrule[VarBit] + \inferrule[VarBit(DynamicallySizedBitString)] { } { \typWellFormed {\varBitTyp \width} } @@ -576,75 +581,95 @@ no duplicate determines if there are duplicate fields in a structure/type. { \typWellFormed \enumTypNoTyp } \inferrule[Record] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp \recordTyp {\typ_i} \\ - \noDup {\field_1, \ldots, \field_n}} + { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \recordTyp {\typ_i} \\ + 1 \leq i < j \leq n; \field_i \neq \field_j} { \typWellFormed \recordTyp } \inferrule[HeaderUnion] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp \headerUnionTyp {\typ_i} \\ - \noDup {\field_1, \ldots, \field_n}} + { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \headerUnionTyp {\typ_i} \\ + % \noDup {\field_1, \ldots, \field_n}\\ + 1 \leq i < j \leq n; \field_i \neq \field_j} { \typWellFormed \headerUnionTyp } \inferrule[Struct] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp \structTyp {\typ_i} \\ - \noDup {\field_1, \ldots, \field_n}} + { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \structTyp {\typ_i} \\ + 1 \leq i < j \leq n; \field_i \neq \field_j} { \typWellFormed \structTyp } \inferrule[Header] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp \headerTyp {\typ_i} \\ - \noDup {\field_1, \ldots, \field_n}} + { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \headerTyp {\typ_i} \\ + 1 \leq i < j \leq n; \field_i \neq \field_j} { \typWellFormed \headerTyp } - \inferrule[NewType] + \inferrule[NewType(typedef)] { \typWellFormed \typ } { \typWellFormed {\newTypeTyp \typ \name} } - \inferrule[Specialized] - { blah } - { blah } + \inferrule[SpecializedType] + { \prim \typ = \sat \typ \\ + \{\param_1, \ldots, \param_m \} = \getTypeParams {\prim \typ} \\ + % \prim \typ = \externTyp \name \\ + % ([\param_1, \ldots, \param_m], _)= \lookup \name \\ + 1 \leq i \leq n; \typWellFormed {\typ_i} \\ + n = m} + { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } \inferrule[Package] - { blah } - { blah } + { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + 1 \leq i \leq n; \dir_i = \less \\ + 1 \leq i \leq n; \typWellFormed {\typ_i}} + { \typWellFormed {\packageTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} {\wildcardParam_1, \ldots, \wildcardParam_p}} } \inferrule[Control] - { blah } - { blah } + { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} + { \typWellFormed {\controlTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} } } \inferrule[Parser] - { blah } - { blah } + { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} + { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} } } \inferrule[Extern] - { blah } - { blah } + { ([], {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n}} ) =\lookupEnv \name } + { \typWellFormed {\externTyp \name} } \inferrule[Function] - { blah } - { blah } + { \typWellFormed \typ \\ + \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } + % (x1,...,xn) {...} + { \typWellFormed {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n}} } \inferrule[Action] - { blah } - { blah } + { i < j \\ + 1 \leq k \leq n; \typWellFormed {\typ_k} \\ + j \leq k \leq n; \dir_k = \less } + { \typWellFormed {\actionTyp {\parDef 1, \ldots, \parDef i} {\parDef j, \ldots, \parDef n}} } \inferrule[Constructor] - { blah } - { blah } + { \typWellFormed \typ \\ + \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ + 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } + { \typWellFormed {\constructorTyp \typ \name {\parDef 1, \ldots, \parDef n}} } \inferrule[Table] - { blah } - { blah } + { \typ = \lookupEnv \name } + { \typWellFormed {\tableTyp \name} } \inferrule[TypeName] - { blah } - { blah } + { \typ = \lookupEnv \name } + { \typWellFormed {\typNameTyp \name} } % is_well_formed_type \end{mathpar} ~~ ~ +## Statement's Typing Rules + +## Declaration's Typing Rules diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 7b825ef06..b3c85a6a2 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -27,6 +27,8 @@ \newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}; {#3})} \newcommand{\binOpEnv}[4]{\env \vdash {#1} \hookrightarrow {#2}, {#3}, {#4}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} +\newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} + %contexts: \newcommand{\cte}{\mathit{CONSTANT}} @@ -51,6 +53,7 @@ \newcommand{\bitComplement}{\sim} \renewcommand{\div}{/} \renewcommand{\mod}{\%} +\newcommand{\funcCall}[]{} %metavariables: \newcommand{\env}{e} @@ -75,7 +78,10 @@ \newcommand{\bitStringAccess}[3]{{#1}[{#2}:{#3}]} \renewcommand{\exp}{\mathit{exp}} \newcommand{\field}{f} -\renewcommand{\arg}{\mathit{arg}} +\newcommand{\param}{x} +\newcommand{\parDef}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} +\newcommand{\typParam}{X} +\newcommand{\wildcardParam}{w} %function helpers @@ -96,30 +102,41 @@ %{#1} is outer, 2 is inner \newcommand{\noDup}[1]{\mathit{no\_duplicate}({#1})} \newcommand{\explicitCastOK}[2]{\mathit{explicit\_cast\_ok} ({#1}, {#2})_\env} +\newcommand{\insertTypVars}[1]{\mathit{insert\_type\_vars}({#1}, \env)} +\newcommand{\getTypeParams}[1]{\mathit{get\_type\_params}({#1})} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} \newcommand{\intWidthTyp}[1]{\mathit{int}<\!{#1}\!>} \newcommand{\boolTyp}{\mathit{bool}} \newcommand{\stringTyp}{\mathit{string}} -\newcommand{\integerTyp}{\mathit{integer}} -\newcommand{\bitStringTyp}[2]{\mathit{bit[{#1}-{#2}]}} -\newcommand{\intTyp}{\mathit{int}} +\newcommand{\integerTyp}{\mathit{int}} +\newcommand{\bitStringTyp}[1]{\mathit{bit}<{#1}>} \newcommand{\setTyp}[1]{\mathit{set}<\!{#1}\!>} \newcommand{\errTyp}{\mathit{error}} \newcommand{\varBitTyp}[1]{\mathit{varbit}<{#1}>} \newcommand{\matchKindTyp}{\mathit{match\_kind}} \newcommand{\voidTyp}{\mathit{void}} \newcommand{\arrayTyp}[2]{{#1}[{#2}]} -\newcommand{\tupleTyp}[2]{<{#1},\ldots,{#2}>} +\newcommand{\tupleTyp}[2]{\mathit{tuple}<{#1},\ldots,{#2}>} \newcommand{\listTyp}[2]{[{#1},\ldots,{#2}]} \newcommand{\enumTyp}{\mathit{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\enumTypNoTyp}{\mathit{enum} \ {\name}\{\name_1,\ldots,\name_n\}} -\newcommand{\recordTyp}{\mathit{record}\{\field_1:\typ_1,\ldots,\field_n:\typ_n \}} -\newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1,\ldots,\field_n:\typ_n \}} -\newcommand{\headerTyp}{\mathit{header}\{\field_1:\typ_1,\ldots,\field_n:\typ_n \}} -\newcommand{\structTyp}{\mathit{struct}\{\field_1:\typ_1,\ldots,\field_n:\typ_n \}} +\newcommand{\recordTyp}{\mathit{record}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +\newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +\newcommand{\headerTyp}{\mathit{header}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +\newcommand{\structTyp}{\mathit{struct}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} \newcommand{\newTypeTyp}[2]{\mathit{type}\ {#1}\ {#2}} +\newcommand{\funcTyp}[3]{\mathit{function}\ {#1}<{#2}> ({#3})} +\newcommand{\constructorTyp}[3]{{#1}\ {#2}\ ({#3}, \_)} +\newcommand{\externTyp}[1]{\mathit{extern} \ {#1}} +\newcommand{\spcTyp}[2]{{#1}<{#2}>} +\newcommand{\parserTyp}[2]{\mathit{parser}<{#1}>({#2})} +\newcommand{\controlTyp}[2]{\mathit{control}<{#1}>({#2})} +\newcommand{\packageTyp}[3]{\mathit{package}<{#1}>({#2},{#3})} +\newcommand{\actionTyp}[2]{\mathit{action}(\mathit{data:}{#1},\mathit{control:}{#2})} +\newcommand{\tableTyp}[1]{\mathit{table}\ {#1}} +\newcommand{\typNameTyp}[1]{\mathit{type\_name}\ {#1}} %directions: \newcommand{\less}{\mathit{directionless}} diff --git a/lib/checker.ml b/lib/checker.ml index 2a0257782..0448caafe 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -1235,13 +1235,13 @@ and field_cmp (f1: RecordType.field) (f2: RecordType.field) : int = * Tuple type: 1 <= i <= n; e |- ti - 1 <= i <= n; ??? + 1 <= i <= n; is_valid_nested_type(, ti)_e ---------------------------------- - e |- (t1, ..., tn) + e |- tuple * List type 1 <= i <= n; e |- ti - 1 <= i <= n; ??? + 1 <= i <= n; is_valid_nested_type([t1,...,tn], ti)_e ---------------------------------- e |- [t1, ..., tn] @@ -1252,56 +1252,65 @@ and field_cmp (f1: RecordType.field) (f2: RecordType.field) : int = * Enum type: ** the case where typ is Some typ. + * X is the name of the enum. + * li is the name of the field. e |- t ----------------------------------- - e |- X : t {l1, ..., ln} + e |- enum t X {l1, ..., ln} ** the case where type is None. - e |- X {l1, ..., ln} + e |- enum X {l1, ..., ln} * Record and struct and header union ({l1:h1, ..., ln:hn}) type: 1 <= i <= n; e |- ti - 1 <= i <= n; ??? - 1 <= i < j <= n; li != lj + 1 <= i <= n; is_valid_nested_type(record {f1 : t1, ..., fn : tn}, ti)_e + 1 <= i < j <= n; fi != fj ------------------------------------ - e |- {l1 : t1, ..., ln : tn} + e |- record {f1 : t1, ..., fn : tn} * header: 1 <= i <= n; e |- ti - 1 <= i <= n; ??? - 1 <= i < j <= n; li != lj + 1 <= i <= n; is_valid_nested_type(header {f1 : t1, ..., fn : tn}, ti)_e + 1 <= i < j <= n; fi != fj ------------------------------------ - e |- {l1 : t1, ..., ln : tn} + e |- header {l1 : t1, ..., ln : tn} - TODO: complete! * new type (name = typ): e |- t ---------------------------------- - e |- n = t + e |- type t n * specialized type: + look at spec * package type: + look at spec * control type: + look at spec * parser type: + look at spec * extern type: + look at spec * function type ( (x1, ..., xn) {...}): - ---------------------------------------------------- - e |- + look at spec * action type: - -------------------------------------------- - e |- + look at spec * constructor type: + look at spec * table type: + look at spec + +* type name: + look at spec *) (* Returns true if type typ is a well-formed type *) and is_well_formed_type env (typ: Typed.Type.t) : bool = @@ -1351,7 +1360,6 @@ and is_well_formed_type env (typ: Typed.Type.t) : bool = let res1 : bool = (are_param_types_well_formed env data_params) in let res2 : bool = (are_construct_params_types_well_formed env ctrl_params) in res1 && res2 - (* Type names *) | TypeName name -> CheckerEnv.resolve_type_name_opt name env <> None | Table {result_typ_name=name} -> @@ -1371,6 +1379,9 @@ and is_well_formed_type env (typ: Typed.Type.t) : bool = | Some {type_params = []; _} -> true | _ -> false end + (*TODO: discuss! according to p4 spec parser, control, and package cannot be + type args to methods, parsers, controls, tables, and actions. + but we're not checking this.*) | Parser {type_params=tps; parameters=ps;_} | Control {type_params=tps; parameters=ps;_} -> let env = CheckerEnv.insert_type_vars tps env in @@ -1468,6 +1479,8 @@ and is_valid_param_type_kind env (kind: FunctionType.kind) (typ: Typed.Type.t) = | Function -> is_valid_param_type env (Runtime Function) typ | Builtin -> is_valid_param_type env (Runtime Method) typ +(* TODO: discuss with Ryan. doesn't match p4 spec for outer header. + also, role of in_header. *) and is_valid_nested_type ?(in_header=false) (env: CheckerEnv.t) (outer_type: Typed.Type.t) (inner_type: Typed.Type.t) = let inner_type = reduce_to_underlying_type env inner_type in match reduce_to_underlying_type env outer_type with From 26156b8a9190da600af6ae7d34094f1c268c86d5 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 31 May 2022 12:27:48 -0400 Subject: [PATCH 02/30] stmt typing done..decl to go --- docs/petr4spec/Petr4-spec.mdk | 119 ++++++++++++++++++++++++++++++++-- docs/petr4spec/ops.tex | 38 ++++++++++- lib/checker.ml | 39 ++++++----- 3 files changed, 169 insertions(+), 27 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 183a25ee6..d1c9a8c66 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -222,7 +222,14 @@ e(name) looks up name in the environment and returns its type and direction. is array determines whether a type is an array type. is numberic determines whether a type is numeric. compile time evaluation evaluates the expression expr at compile time. -explicit cast ok checks whether typ1 can be converted to typ2 under e based on P4's specification of 8.9.1. Explicit casts. +explicit cast ok checks whether typ1 can be converted to typ2 under e based on P4's specification of 8.9.1. Explicit casts. +reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match.. +fieldOrMethodTyp checks if the type is +1) header, headerunion, or struct. if so checks the name of each field with the name of exprmem and if they're the same returns the field's type. if no field matches (passes to type_expression_member_builtin) takes the type, name, context. if type is an array and name is either size or lastindex it returns the type Bit<32>. if type is an array and name is next or last and context is parser state it returns the initial type passed in. ow. error. +2) if type is specialized with base as an extern, checks the env for the extern name, if it exists, finds the extern method with the name same as expmem name and returns a reduced type of function with that method type. if it doesn't find a method with the same name as expmem uses type_expression_member_builtin. +3) if type is an extern, converts it to specialized with base as extern and empty args. +4) any other type uses type_epxression_member_builtin. +arg can be exp, key value, or missing. ~ Center {padding:1ex} ~~ Snippet @@ -329,8 +336,10 @@ explicit cast ok checks whether typ1 can be converted to typ2 under e based on P {\expenv {\errMem \name} {\errMem \name} \errTyp \less } \inferrule[ExpressionMember] - { blah } - { blah} + { \expenv \exp {\prim \exp} \typ \dir \\ + \prim \typ = \reduce \typ \\ + \pprim \typ = \fieldOrMethodTyp {\prim \typ}} + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } \inferrule[Ternary] {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ @@ -347,9 +356,13 @@ explicit cast ok checks whether typ1 can be converted to typ2 under e based on P % function type: (x1,...,xn) {...} - \inferrule[NamelessIinstantiation] - { blah } - { blah } + \inferrule[AnonymousInstantiation] + { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } + { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} + + \inferrule[AnonymousInstatnt2] + { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} + { \expenv {\instantiation {\name} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir } \inferrule[Mask] {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ @@ -397,7 +410,7 @@ The restJ rule stands for all other binary operations. \inferrule[ShiftLeft] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } + { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } \inferrule[BitConcatenation] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ @@ -671,5 +684,97 @@ names to type env. ~ ## Statement's Typing Rules +this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. +is_lvalue checks if an IR expression is lvalue. +cast_expr takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. +if void type returns a void type if a (or two) type is (are) void and otherwise returns a unit type. + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[Assignment] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \isLval {{\prim {\exp_1}}, {\typ_1}, {\dir_1}} \\ + ({\prim {\exp_2}}, {\typ_2}, {\dir_2}) = \castExpression {\typ_1} {\exp_2}\\ + % \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + % \typ_1 = \typ_2 \\ + } + { \stmtenv {\assign {\exp_1} {\exp_2}} {\assign {\prim {\exp_1}} {\prim {\exp_2}}} {\unitTyp} } + + + \inferrule[Empty] + { } + { \stmtenv {\noop} {\noop} {\unitTyp}} + + \inferrule[Block] + { \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 \\ + \prim \typ = \ifVoidTyp {\typ_1} \\ + \stmtenvv 2 {\stmts} {\prim \stmts} {\prim \typ} 3 } + { \stmtenvv 1 {\block {\stmt_1; \stmts} } {\block {\prim {\stmt_1}; {\prim \stmts}} } {\prim \typ} 3 } + + \inferrule[Return(inApplyBlockOrAction)] + { + % \expenv \exp {\prim \exp} \typ \dir \\ + \ctxt = \applyBlockCtxt \textOr \actionCtxt \\ + ({\prim {\exp}}, {\typ}, {\dir}) = \castExpression {\voidTyp} {\exp}\\ + } + { \stmtenv {\return \exp} {\return {({\prim {\exp}}, {\typ}, {\dir})}} \voidTyp } + + \inferrule[ReturnEmpty] + { + % \expenv \exp {\prim \exp} \typ \dir \\ + \ctxt = \applyBlockCtxt \textOr \actionCtxt \textOr \funcCtxt \typ \\ + } + { \stmtenv {\return {}} {\return {}} \voidTyp } + + \inferrule[Return(inFunction)] + { + % \expenv \exp {\prim \exp} \typ \dir \\ + \ctxt = \funcCtxt \typ \\ + ({\prim {\exp}}, {\prim \typ}, {\dir}) = \castExpression {\typ} {\exp}\\ + } + { \stmtenv {\return \exp} {\return {({\prim {\exp}}, {\prim \typ}, {\dir})}} \voidTyp } + + \inferrule[Exit] + { \ctxt \neq \parserCtxt } + { \stmtenv \exit \exit \voidTyp} + + \inferrule[IfThen] + { \ctxt \neq \parserCtxt \\ + (\prim \exp, \boolTyp, \dir) = \castExpression \boolTyp \exp \\ + \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 } + { \stmtenvv 1 {\ifthen \exp {\stmt}} {\ifthen {\prim \exp} {\prim \stmt} } {\unitTyp} 1 } + + \inferrule[IfThenElse] + { \ctxt \neq \parserCtxt \\ + (\prim \exp, \boolTyp, \dir) = \castExpression \boolTyp \exp \\ + \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 \\ + \stmtenvv 1 {\stmt_2} {\prim {\stmt_2}} {\typ_2} 3 \\ + \prim \typ = \ifVoidTyp {\typ_1, \typ_2}} + { \stmtenvv 1 {\ifthenelse \exp {\stmt_1} {\stmt_2}} {\ifthenelse {\prim \exp} {\prim {\stmt_1}} {\prim {\stmt_2}} } {\prim \typ} 1 } + + \inferrule[Switch] + { \ctxt_0 = \applyBlockCtxt \\ + \expenvv \exp {\prim \exp} \typ \dir 0 \\ + \prim \typ = \reduce \typ \\ + \name_1, \ldots, \name_m = \getEnum {\prim \typ} \\ + \lbl \notin \overline \lbl \\ + \lbl \in \{\name_1, \ldots, \name_m \}\\ + \stmtenvv 0 {\block {\stmts}} {\block {\prim {\stmts}}} {\typ_0} 1 \\ + \stmtenvv 1 {\switch \exp {\overline {\actionCase \stmt}}} {\switch {\prim \exp} {\overline {\actionCase {\pprim \stmt} }}} \unitTyp 2 + } + { \stmtenvv 0 {\switch \exp {\actionCase \stmts, \overline {\actionCase \stmt}} } {\switch {\prim \exp} {\actionCase {\prim \stmts}, {\overline {\actionCase {\pprim \stmt} }} } } \unitTyp 2 } + + \inferrule[Declaration] + { \isConstant \dcl \textOr \isInstantiation \dcl \textOr \isVariable \dcl \\ + \dclenvv 0 \dcl {\prim \dcl} 1} + { \stmtenvv 0 \dcl {\prim \dcl} \unitTyp 1 } + +\end{mathpar} +~~ +~ + ## Declaration's Typing Rules diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index b3c85a6a2..33b084f4b 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -23,15 +23,24 @@ %typing judgments: \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} \newcommand{\expenv}[4]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3}, {#4}} +\newcommand{\expenvv}[5]{\env_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} \newcommand{\expenvWithCtxt}[5]{\env, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} \newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}; {#3})} \newcommand{\binOpEnv}[4]{\env \vdash {#1} \hookrightarrow {#2}, {#3}, {#4}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} +\newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} +\newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} +\newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} +\newcommand{\dclenvv}[4]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3} \dashv \env_{#4}} %contexts: \newcommand{\cte}{\mathit{CONSTANT}} +\newcommand{\applyBlockCtxt}{\mathit{APPLYBLOCK}} +\newcommand{\actionCtxt}{\mathit{ACTION}} +\newcommand{\funcCtxt}[1]{\mathit{FUNCTION}\ {#1}} +\newcommand{\parserCtxt}{\mathit{PARSER}} %operators: \newcommand{\mask}[2]{{#1} \&\&\& {#2}} @@ -53,7 +62,16 @@ \newcommand{\bitComplement}{\sim} \renewcommand{\div}{/} \renewcommand{\mod}{\%} -\newcommand{\funcCall}[]{} +%% \newcommand{\funcCall}[]{} +\newcommand{\expMem}[2]{{#1}.{#2}} +\newcommand{\instantiation}[2]{{#1}({#2})} +\newcommand{\assign}[2]{{#1}={#2}} +\newcommand{\noop}{;} +\newcommand{\return}[1]{\mathit{return}\ {#1}} +\newcommand{\exit}{\mathit{exit}} +\newcommand{\switch}[2]{\mathit{switch}\ ({#1}) \{{#2}\}} +\newcommand{\lbl}{l} +\newcommand{\actionCase}[1]{\lbl : \block {#1}} %metavariables: \newcommand{\env}{e} @@ -82,11 +100,21 @@ \newcommand{\parDef}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} \newcommand{\typParam}{X} \newcommand{\wildcardParam}{w} - +\renewcommand{\arg}{\mathit{arg}} +\newcommand{\stmt}{\mathit{stmt}} +\newcommand{\stmts}{\overline \stmt} +\newcommand{\block}[1]{\{ {#1} \}} +\newcommand{\ifthen}[2]{\mathit{if}\ {#1} \mathit{then}\ {#2}} +\newcommand{\ifthenelse}[3]{\mathit{if}\ {#1} \mathit{then}\ {#2} \mathit{else}\ {#3}} +\newcommand{\dcl}{\mathit{dcl}} %function helpers \newcommand{\isNumeric}[1]{\mathit{is\_numeric}({#1})} \newcommand{\isArray}[1]{\mathit{is\_array}({#1})} +\newcommand{\getEnum}[1]{\mathit{get\_enum}({#1})} +\newcommand{\isConstant}[1]{\mathit{is\_constant} ({#1})} +\newcommand{\isInstantiation}[1]{\mathit{is\_instantiation} ({#1})} +\newcommand{\isVariable}[1]{\mathit{is\_variable} ({#1})} \newcommand{\compileTimeEval}[1]{\llbracket{#1}\rrbracket_\env} \newcommand{\implicitCast}[2]{\mathit{implicit\_cast}({#1},{#2})_\env} \newcommand{\reduceEnums}[1]{\mathit{reduce\_enums}({#1}.\typ)_\env} @@ -104,6 +132,11 @@ \newcommand{\explicitCastOK}[2]{\mathit{explicit\_cast\_ok} ({#1}, {#2})_\env} \newcommand{\insertTypVars}[1]{\mathit{insert\_type\_vars}({#1}, \env)} \newcommand{\getTypeParams}[1]{\mathit{get\_type\_params}({#1})} +\newcommand{\reduce}[1]{\mathit{reduce}({#1})} +\newcommand{\fieldOrMethodTyp}[1]{\mathit{field\_or\_method\_type}({#1})} +\newcommand{\isLval}[1]{\mathit{is\_lvalue}({#1})} +\newcommand{\castExpression}[2]{\mathit{cast\_expression}({#1},{#2})} +\newcommand{\ifVoidTyp}[1]{\mathit{if\_void\_type}({#1})} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} @@ -137,6 +170,7 @@ \newcommand{\actionTyp}[2]{\mathit{action}(\mathit{data:}{#1},\mathit{control:}{#2})} \newcommand{\tableTyp}[1]{\mathit{table}\ {#1}} \newcommand{\typNameTyp}[1]{\mathit{type\_name}\ {#1}} +\newcommand{\unitTyp}{()} %directions: \newcommand{\less}{\mathit{directionless}} diff --git a/lib/checker.ml b/lib/checker.ml index 0448caafe..6d3f9ea33 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -632,7 +632,8 @@ and type_vars_equal_under equiv_vars tv1 tv2 = else type_vars_equal_under rest tv1 tv2 | [] -> tv1 = tv2 - +(* saturates the type first and returns the base of a specialized type by removing all + its type parameters as long as the number of type params and type args match. *) and reduce_type : CheckerEnv.t -> Typed.Type.t -> Typed.Type.t = fun env typ -> let typ = saturate_type env typ in @@ -907,14 +908,12 @@ and type_expression (env: CheckerEnv.t) (ctx: Typed.ExprContext.t) (exp: Express type_unary_op env ctx op arg | BinaryOp { op; args; tags } -> type_binary_op env ctx op args - (* *) | Cast { typ; expr; tags } -> type_cast env ctx typ expr | TypeMember { typ; name; tags } -> type_type_member env ctx typ name | ErrorMember {tags; err} -> type_error_member env ctx err - (* *) | ExpressionMember { expr; name; tags } -> type_expression_member env ctx expr name | Ternary { cond; tru; fls; tags } -> @@ -963,6 +962,7 @@ and cast_to_same_type (env: CheckerEnv.t) (ctx: Typed.ExprContext.t) (exp1: Expr then exp1, add_cast env exp2 typ1 else failwith "cannot cast types so that they agree" +(* takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. *) and cast_expression (env: CheckerEnv.t) ctx (typ: Typed.Type.t) (exp: Expression.t) = let module E = Prog.Expression in let typ = reduce_type env typ in @@ -2385,6 +2385,8 @@ and type_error_member env ctx (name: P4String.t) : Prog.Expression.t = dir = Directionless; tags = Info.dummy } +(* takes a type and if it's a header it returns a list of record type that has + isValid as a built in function. ow. returns an empty list.*) and header_methods typ = let fake_fields: RecordType.field list = [{name = "isValid"; @@ -2394,6 +2396,9 @@ and header_methods typ = | Type.Header { fields; _ } -> fake_fields | _ -> [] +(* takes a type, name, context. if type is an array and name is either size or lastindex + it returns the type Bit<32>. if type is an array and name is next or last and + context is parser state it returns the initial type passed in. ow. error.*) and type_expression_member_builtin env (ctx: Typed.ExprContext.t) tags typ (name: P4String.t) : Typed.Type.t = let open Typed.Type in let fail () = @@ -2498,11 +2503,7 @@ and type_expression_member_function_builtin env typ (name: P4String.t) : Typed.T | _ -> None (* Sections 6.6, 8.14 *) -(* - - ---------------------------------------------------------------- - -*) +(* look at spec. it uses a helper with a whole bunch of explanation. Disuss: any ideas to improve it. TODO*) and type_expression_member env ctx expr (name: P4String.t) : Prog.Expression.t = let typed_expr = type_expression env ctx expr in let expr_typ = reduce_type env typed_expr.typ in @@ -2745,7 +2746,7 @@ and call_ok (ctx: ExprContext.t) (fn_kind: Typed.FunctionType.kind) : bool = | _, Builtin -> true end -(* +(* TODO -------------------------------------------------------- e, c |- exp (t1 a1, ..., tn an) ~~> @@ -2990,6 +2991,8 @@ and resolve_function_overload env ctx type_name args = | None -> resolve_function_overload_by ~f:(overload_param_count_ok args) env ctx type_name +(*TODO + *) and type_constructor_invocation env ctx tags decl_name type_args args : Prog.Expression.t list * Typed.Type.t = let open Typed.ConstructorType in let type_args = List.map ~f:(translate_type_opt env []) type_args in(* determines if type is dontcare.*) @@ -3019,15 +3022,7 @@ and type_constructor_invocation env ctx tags decl_name type_args args : Prog.Exp (* Section 14.1 *) (* - - base ?= TypeName t - ---------------------------------------- - e, c |- SpecializedType {base, args} @ [arg1, .., argn] ~~> { @ [], Directionless} - - typ = SpecializedType {t, []} - e, c |- typ @ [arg1, .., argn] ~~> {e, t, d} - -------------------------------------------------------- - e, c |- TypeName t @ [arg1, .., argn] ~~> {e, t, d} + look at spec *) and type_nameless_instantiation env ctx tags (typ : Types.Type.t) args = let open Prog.Expression in @@ -3137,26 +3132,34 @@ and type_statement (env: CheckerEnv.t) (ctx: StmtContext.t) (stm: Statement.t) : match stm with | MethodCall { func; type_args; args; tags } -> type_method_call env ctx tags func type_args args + (*10.1 ipad version.*) | Assignment { lhs; rhs; tags } -> type_assignment env ctx lhs rhs | DirectApplication { typ; args; tags } -> type_direct_application env ctx typ args + (* 10.6 *) | Conditional { cond; tru; fls; tags } -> type_conditional env ctx cond tru fls + (* 10.3 *) | BlockStatement { block; tags } -> type_block env ctx block + (* 10.5*) | Exit {tags} -> { stmt = Exit {tags}; typ = StmType.Void }, env + (* 10.2 *) | EmptyStatement {tags} -> { stmt = EmptyStatement {tags}; typ = StmType.Unit }, env + (* 10.4 *) | Return { expr; tags } -> type_return env ctx tags expr + (* 10.7 *) | Switch { expr; cases; tags } -> type_switch env ctx tags expr cases + (* 9 *) | DeclarationStatement { decl; tags } -> type_declaration_statement env ctx decl in From 72576043e17983ada6ff297ddf0230de80c6f0cf Mon Sep 17 00:00:00 2001 From: pataei Date: Sat, 4 Jun 2022 23:40:31 -0400 Subject: [PATCH 03/30] revision and comparison with spec for expressions --- docs/petr4spec/Petr4-spec.mdk | 240 ++++++++++++++++++++++++++++++---- docs/petr4spec/ops.tex | 48 +++++-- lib/checker.ml | 10 +- 3 files changed, 264 insertions(+), 34 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index d1c9a8c66..dc84e915f 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -293,15 +293,13 @@ arg can be exp, key value, or missing. { \expenv {!\exp} {!\prim \exp} \boolTyp \dir } \inferrule[BitwiseComplement] - { \expenv \exp {\prim \exp} {\bitWidthTyp \width} \dir } - { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\bitWidthTyp \width} \dir } - - \inferrule[UnaryMinusCTK] - { \expenv \exp {\prim \exp} \integerTyp \dir } - { \expenv {-\exp} {-\prim \exp} \integerTyp \dir } + { \expenv \exp {\prim \exp} \typ \dir \\ + \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} + { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\typ} \dir } \inferrule[UnaryMinus] - { \expenv \exp {\prim \exp} {\intWidthTyp \width} \dir } + { \expenv \exp {\prim \exp} \typ \dir \\ + \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp} { \expenv {-\exp} {-\prim \exp} {\intWidthTyp \width} \dir } \inferrule[BinaryOps] @@ -349,10 +347,31 @@ arg can be exp, key value, or missing. \typ_1 \neq \integerTyp} {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } - \inferrule[FunctionCall] - { blah } + \inferrule[Ternary(AllowedInP4ButNotePetr4)] + {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\integerTyp} {\dir_2} \\ + \expenv {\exp_3} {\prim {\exp_3}} {\integerTyp} {\dir_3}\\ + % \typ_1 = \typ_2 \\ + % \typ_1 \eq \integerTyp \\ + \compTimeKnown {\exp_1}} + {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + + + \inferrule[FunctionCall-Function] + { \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}} \dir\\ + % (\exp', \funcType \kind {\typVars} \params {\prim \typ}, \dir) = \resolveFuncOverload \exp \args \\ + % 1 \leq i \leq n; \prim {\typ_i} = \trans {\typ_i} \emp\\ + \prim \typs = \trans \typs \emp \\ + % \match \params \args\\ + |\typs| = |\typVars| \\ + \prim \typ = \sat {\typ_\ret}\\ + infer + } + { \expenv {\funcCall \exp \typs {\argkvss 1, \ldots, \argkvss n}} {} {\prim \typ} \less } + + \inferrule[FunctionCall-Action] + { } { blah } - % { \expenv {\exp (\typ_1 \arg_1, \ldots, \typ_n \arg_n)} } % function type: (x1,...,xn) {...} @@ -388,6 +407,12 @@ arg can be exp, key value, or missing. ~~ ~ +### Petr4 Restrictions Compared to P4 Spec +conditional operatior (ternary exp). petr4 doesn't support the case where both tru and fls expression have the infinite precision integer type when the condition can be evaluated at compilation time. This is allowed by P4 spec. + +### Petr4 Discrepencies with P4 Spec + + ### Coerce Binary Operation Arguments Auxiliary Judgment Let implicitCast typ typ be defined as follows to describe P4's implicit casting behavior on operands in binary expressions: @@ -420,10 +445,10 @@ The restJ rule stands for all other binary operations. \inferrule[Rest] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - t = \implicitCast {\typ_1} {\typ_2} \\ - {\pprim {\exp_1}} = \cast \typ {\prim {\exp_1}}, {\typ_1}, {\dir_1} \\ - {\pprim {\exp_2}} = \cast \typ {\prim {\exp_2}}, {\typ_2}, {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}} {\pprim {\exp_2}} } + \typ = \implicitCast {\typ_1} {\typ_2} \\ + \pprim {\exp_1} = \cast \typ {\prim {\exp_1}} \\ + \pprim {\exp_2} = \cast \typ {\prim {\exp_2}}} + { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}, {\typ_1}, {\dir_1}} {\pprim {\exp_2}, {\typ_2}, {\dir_2}} } \end{mathpar} ~~ @@ -442,7 +467,7 @@ compile time known determinez if the value of an expression can be known at comp \begin{mathpar} \small - \inferrule[LogicalOps($\ops=\&,\vert$)] + \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] { \typ_1 = \reduceEnums {\exp_1} \\ \typ_2 = \reduceEnums {\exp_2} \\ \dir = \inOrLess {\typ_1} {\typ_2} \\ @@ -635,20 +660,20 @@ names to type env. { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ 1 \leq i \leq n; \dir_i = \less \\ 1 \leq i \leq n; \typWellFormed {\typ_i}} - { \typWellFormed {\packageTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} {\wildcardParam_1, \ldots, \wildcardParam_p}} } + { \typWellFormed {\packageTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} {\wildcardParam_1, \ldots, \wildcardParam_p}} } \inferrule[Control] { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} - { \typWellFormed {\controlTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} } } + { \typWellFormed {\controlTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } \inferrule[Parser] { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} - { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n} } } + { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } \inferrule[Extern] - { ([], {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n}} ) =\lookupEnv \name } + { ([], {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n}} ) =\lookupEnv \name } { \typWellFormed {\externTyp \name} } \inferrule[Function] @@ -656,19 +681,19 @@ names to type env. \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } % (x1,...,xn) {...} - { \typWellFormed {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\parDef 1, \ldots, \parDef n}} } + { \typWellFormed {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n}} } \inferrule[Action] { i < j \\ 1 \leq k \leq n; \typWellFormed {\typ_k} \\ j \leq k \leq n; \dir_k = \less } - { \typWellFormed {\actionTyp {\parDef 1, \ldots, \parDef i} {\parDef j, \ldots, \parDef n}} } + { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm j, \ldots, \prm n}} } \inferrule[Constructor] { \typWellFormed \typ \\ \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } - { \typWellFormed {\constructorTyp \typ \name {\parDef 1, \ldots, \parDef n}} } + { \typWellFormed {\constructorTyp \typ \name {\prm 1, \ldots, \prm n}} } \inferrule[Table] { \typ = \lookupEnv \name } @@ -687,7 +712,8 @@ names to type env. this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. cast_expr takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. -if void type returns a void type if a (or two) type is (are) void and otherwise returns a unit type. +if void type returns a void type if a (or two) type is (are) void and otherwise returns a unit type. +get enum typ takes a type and checks if it's an enum. if so it returns the enums of it. ~ Center {padding:1ex} ~~ Snippet @@ -778,3 +804,171 @@ if void type returns a void type if a (or two) type is (are) void and otherwise ## Declaration's Typing Rules +is allowed type for variable checks if a type is allowed for declaring a variable. it includes all types after saturation except for string, integer, list, set, void, specialized type, package, control, parser, extern, function, action, constructor, and table. +check parameter shadowing takes two lists of paramets and checks if there is any duplicate in them. + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[Constant] + { \prim \typ = \trans \typ \emp \\ + (\prim \exp, \pprim \typ, \dir) = \castExpression \exp {\prim \typ}\\ + \val = \compileTimeEval {\prim \exp} } + { \dclenvvv {\const \typ \var \exp} {\const {\prim \typ} \var \val} {\addConstEnv \var \val} {\addTypeEnv \var {(\prim \typ, \less)}}} + + \inferrule[Instantiation] + { \expenv {\instantiation {\var} \args} {\instantiation {\var} {\prim \args}} {\prim \typ} \dir \\ + \ctxt \neq \toplevel \textOr \ctxt = \toplevel, ({\prim \typ} \neq \controlTyp {\_} {\_} \textOr \parserTyp {\_} {\_} )} + { \dclenvvv {\inst \typVar \args \var {\ } } {\inst \typVar \args \var {\ }} \constEnv {\addTypeEnv \var {(\prim \typ, \less)}} } + + \inferrule[Parser] + {} + {blah} + % { \checkParamShadow param constructorparam \\ + % } + % { \dclenvvv {} {} {} {} } + + \inferrule[Control] + { blah } + { blah } + + \inferrule[Function] + { blah } + { blah } + + \inferrule[Action] + { blah } + { blah } + + \inferrule[ExternFunction] + { blah } + { blah } + + \inferrule[Variable] + { \ctxt \neq \toplevel \\ + \prim \typ = \trans \typ \emp \\ + \allowedTypeForVar {\prim \typ} \\ + \typWellFormed {\prim \typ}} + { \dclenvvv {\varDecl \typ \var } {\varDecl {\prim \typ} \var} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + + \inferrule[VariableInit] + { \ctxt \neq \toplevel \\ + \prim \typ = \trans \typ \emp \\ + \allowedTypeForVar {\prim \typ} \\ + \typWellFormed {\prim \typ} \\ + (\prim \exp, \prim \typ, \dir) = \castExpression {\prim \typ} \exp} + { \dclenvvv {\varInit \typ \var \exp} {\varInit {\prim \typ} \var {(\prim \exp, \prim \typ, \dir)}} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + + \inferrule[ValueSet] + { blah } + { blah } + + \inferrule[Table] + { blah } + { blah } + +\end{mathpar} +~~ +~ + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[Header] + { blah } + { blah } + + \inferrule[HeaderUnion] + { blah } + { blah } + + \inferrule[Struct] + { blah } + { blah } + + \inferrule[Error] + { blah } + { blah } + + \inferrule[MatchKind] + { blah } + { blah } + + \inferrule[Enum] + { blah } + { blah } + + \inferrule[SerializableEnum] + { blah } + { blah } + + \inferrule[ExternObject] + { blah } + { blah } + + \inferrule[TypeDef] + { blah } + { blah } + + \inferrule[NewType] + { blah } + { blah } + +\end{mathpar} +~~ +~ + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[ControlType] + { blah } + { blah } + + \inferrule[ParserType] + { blah } + { blah } + + \inferrule[PackageType] + { blah } + { blah } + + % \inferrule[ ] + % { } + % { } + + % \inferrule[] + % { } + % { } + + % \inferrule[] + % { } + % { } + + % \inferrule[] + % { } + % { } + + % \inferrule[] + % { } + % { } + + % \inferrule[] + % { } + % { } + + % \inferrule[] + % { } + % { } + +\end{mathpar} +~~ +~ + + diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 33b084f4b..cb9ce237e 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -33,6 +33,7 @@ \newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} \newcommand{\dclenvv}[4]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3} \dashv \env_{#4}} +\newcommand{\dclenvvv}[4]{\constEnv, \typEnv \vdash {#1} \leadsto {#2} \dashv {#3}, {#4}} %contexts: @@ -41,6 +42,7 @@ \newcommand{\actionCtxt}{\mathit{ACTION}} \newcommand{\funcCtxt}[1]{\mathit{FUNCTION}\ {#1}} \newcommand{\parserCtxt}{\mathit{PARSER}} +\newcommand{\toplevel}{\mathit{TOPLEVEL}} %operators: \newcommand{\mask}[2]{{#1} \&\&\& {#2}} @@ -62,7 +64,7 @@ \newcommand{\bitComplement}{\sim} \renewcommand{\div}{/} \renewcommand{\mod}{\%} -%% \newcommand{\funcCall}[]{} +\newcommand{\funcCall}[3]{{#1}<{#2}>({#3})} \newcommand{\expMem}[2]{{#1}.{#2}} \newcommand{\instantiation}[2]{{#1}({#2})} \newcommand{\assign}[2]{{#1}={#2}} @@ -71,11 +73,20 @@ \newcommand{\exit}{\mathit{exit}} \newcommand{\switch}[2]{\mathit{switch}\ ({#1}) \{{#2}\}} \newcommand{\lbl}{l} -\newcommand{\actionCase}[1]{\lbl : \block {#1}} +\newcommand{\actionCase}[1]{\lbl : \block {#1}} +\newcommand{\const}[3]{\mathit{const}\ {#1}\ {#2} := {#3}} +\newcommand{\inst}[4]{{#1} ({#2}) {#3} \{{#4}\}} +\newcommand{\varDecl}[2]{{#1}\ {#2}} +\newcommand{\varInit}[3]{{#1}\ {#2} := {#3}} +%name. +%% \newcommand{\parserDecl}[]{\mathit{parser}\ {#1} (type_param param) {const_param locals states} %metavariables: -\newcommand{\env}{e} -\newcommand{\typ}{t} +\newcommand{\env}{\Gamma} +\newcommand{\typEnv}{\Gamma} +\newcommand{\constEnv}{\Sigma} +\newcommand{\typ}{\tau} +\newcommand{\typs}{\overline \typ} \newcommand{\ctxt}{c} \newcommand{\bool}{b} \newcommand{\str}{s} @@ -86,6 +97,9 @@ \newcommand{\bitWidth}[2]{{#1}_{#2}} \newcommand{\intWidth}[2]{{#1}_{#2}} \newcommand{\name}{\mathit{name}} +\newcommand{\var}{x} +\newcommand{\typVar}{X} +\newcommand{\typVars}{\overline \typVar} \renewcommand{\array}{a} \renewcommand{\index}{i} \newcommand{\arrayAccess}[2]{{#1}[{#2}]} @@ -97,18 +111,30 @@ \renewcommand{\exp}{\mathit{exp}} \newcommand{\field}{f} \newcommand{\param}{x} -\newcommand{\parDef}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} +\newcommand{\params}{\overline x} +\newcommand{\prm}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} \newcommand{\typParam}{X} \newcommand{\wildcardParam}{w} \renewcommand{\arg}{\mathit{arg}} +\newcommand{\args}{\overline \arg} \newcommand{\stmt}{\mathit{stmt}} \newcommand{\stmts}{\overline \stmt} \newcommand{\block}[1]{\{ {#1} \}} -\newcommand{\ifthen}[2]{\mathit{if}\ {#1} \mathit{then}\ {#2}} -\newcommand{\ifthenelse}[3]{\mathit{if}\ {#1} \mathit{then}\ {#2} \mathit{else}\ {#3}} +\newcommand{\ifthen}[2]{\mathit{if}\ {#1}\ \mathit{then}\ {#2}} +\newcommand{\ifthenelse}[3]{\mathit{if}\ {#1}\ \mathit{then}\ {#2}\ \mathit{else}\ {#3}} \newcommand{\dcl}{\mathit{dcl}} +\newcommand{\kind}{k} +\newcommand{\ret}{\mathit{return}} +\newcommand{\argexp}{\exp} +\newcommand{\argexps}{\overline \argexp} +\newcommand{\argexpss}[1]{\argexp_{#1}} +\newcommand{\argkv}{\var = \exp} +\newcommand{\argkvs}{\overline \argkv} +\newcommand{\argkvss}[1]{\var_{#1}=\exp_{#1}} %function helpers +\newcommand{\addTypeEnv}[2]{\typEnv[{#1}:{#2}]} +\newcommand{\addConstEnv}[2]{\constEnv[{#1}={#2}]} \newcommand{\isNumeric}[1]{\mathit{is\_numeric}({#1})} \newcommand{\isArray}[1]{\mathit{is\_array}({#1})} \newcommand{\getEnum}[1]{\mathit{get\_enum}({#1})} @@ -137,6 +163,10 @@ \newcommand{\isLval}[1]{\mathit{is\_lvalue}({#1})} \newcommand{\castExpression}[2]{\mathit{cast\_expression}({#1},{#2})} \newcommand{\ifVoidTyp}[1]{\mathit{if\_void\_type}({#1})} +\newcommand{\allowedTypeForVar}[1]{\mathit{is\_allowed\_type\_for\_variable}({#1})} +\newcommand{\checkParamShadow}[2]{\mathit{check\_parameter\_shadowing}({#1}, {#2})} +%% \newcommand{\resolveFuncOverload}[2]{\mathit{resolve\_function\_overload}({#1},{#2})} +\newcommand{\match}[2]{\mathit{match}({#1},{#2})} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} @@ -161,6 +191,8 @@ \newcommand{\structTyp}{\mathit{struct}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} \newcommand{\newTypeTyp}[2]{\mathit{type}\ {#1}\ {#2}} \newcommand{\funcTyp}[3]{\mathit{function}\ {#1}<{#2}> ({#3})} +%kind.type param. param. return type. +\newcommand{\funcType}[4]{\mathit{function}\ {#1}<{#2}> ({#3})\rightarrow {#4}} \newcommand{\constructorTyp}[3]{{#1}\ {#2}\ ({#3}, \_)} \newcommand{\externTyp}[1]{\mathit{extern} \ {#1}} \newcommand{\spcTyp}[2]{{#1}<{#2}>} @@ -177,4 +209,4 @@ \newcommand{\dir}{d} \renewcommand{\in}{\mathit{in}} \newcommand{\out}{\mathit{out}} - +\newcommand{\inout}{\mathit{in\_out}} diff --git a/lib/checker.ml b/lib/checker.ml index 6d3f9ea33..ca48e50eb 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2195,6 +2195,7 @@ and check_binary_op env (op: Op.bin) typed_l typed_r : Prog.Expression.t = raise_mismatch (tags) "Operand must have type int or bit" l end (* Bitwise operators are only defined on bitstrings of the same width *) + (* TODO: discuss with Ryan. discrepency with spec. *) | BitAnd {tags} | BitXor {tags} | BitOr {tags} -> begin match l_typ, r_typ with | Bit { width = l }, Bit { width = r } when l = r -> Bit { width = l } @@ -2203,6 +2204,7 @@ and check_binary_op env (op: Op.bin) typed_l typed_r : Prog.Expression.t = | _, _ -> raise_mismatch (typed_l.tags) "unsigned int" l_typ end (* Bitstring concatentation is defined on any two bitstrings *) + (* TODO: discuss with Ryan. discrepency with spec. *) | PlusPlus {tags} -> begin match l_typ, r_typ with | Bit { width = l }, Bit { width = r } @@ -2222,6 +2224,7 @@ and check_binary_op env (op: Op.bin) typed_l typed_r : Prog.Expression.t = | _, _ -> raise_type_error tags (Type_Difference (l_typ, r_typ)) end (* Division is only defined on compile-time known arbitrary-precision positive integers *) + (* TODO: discuss with Ryan. then why do we allow it for bit too?*) | Div {tags} | Mod {tags} -> begin match l_typ, r_typ with | Integer, Integer -> @@ -2233,6 +2236,7 @@ and check_binary_op env (op: Op.bin) typed_l typed_r : Prog.Expression.t = | Integer, _ -> raise_mismatch (typed_r.tags) "arbitrary precision integer" r_typ | _, _ -> raise_mismatch (typed_l.tags) "arbitrary precision integer" l_typ end + (* TODO: check this with Ryan. section 8.5 of spec. *) | Shl {tags} | Shr {tags} -> begin match l_typ, is_nonnegative_numeric env typed_r with | Bit _, true @@ -2748,8 +2752,6 @@ and call_ok (ctx: ExprContext.t) (fn_kind: Typed.FunctionType.kind) : bool = (* TODO - -------------------------------------------------------- - e, c |- exp (t1 a1, ..., tn an) ~~> *) and type_function_call env ctx call_tags func type_args (args: Argument.t list) : Prog.Expression.t = @@ -3746,7 +3748,6 @@ and is_variable_type env (typ: Typed.Type.t) = false (* Section 10.2 - * NOTE: refers to p4 spec * Δ, T, Γ |- e : t' = t * --------------------------------------------- * Δ, T, Γ |- t x = e : Δ, T, Γ[x -> t] @@ -4593,8 +4594,10 @@ and check_param_shadowing params constructor_params = and type_declaration (env: CheckerEnv.t) (ctx: DeclContext.t) (decl: Types.Declaration.t) : Prog.Declaration.t * CheckerEnv.t = match decl with + (* look into spec *) | Constant { annotations; typ; name; value; tags } -> type_constant env ctx tags annotations typ name value + (* look into spec *) | Instantiation { annotations; typ; args; name; init; tags } -> begin match init with | Some init -> failwith "initializer block in instantiation unsupported" @@ -4616,6 +4619,7 @@ and type_declaration (env: CheckerEnv.t) (ctx: DeclContext.t) (decl: Types.Decla | ExternFunction { annotations; return; name; type_params; params; tags } -> check_param_shadowing params []; type_extern_function env tags annotations return name type_params params + (* look into spec *) | Variable { annotations; typ; name; init; tags } -> type_variable env ctx tags annotations typ name init | ValueSet { annotations; typ; size; name; tags } -> From 51ca2fc3fa81dc93c362380d2af1bcdf723ba157 Mon Sep 17 00:00:00 2001 From: pataei Date: Sun, 5 Jun 2022 13:50:03 -0400 Subject: [PATCH 04/30] add cast judg --- docs/petr4spec/Petr4-spec.mdk | 90 +++++++++++++++++++++++++++++++++++ docs/petr4spec/ops.tex | 9 +++- lib/checker.ml | 9 ++++ 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index dc84e915f..2c3f53c2e 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -411,6 +411,96 @@ arg can be exp, key value, or missing. conditional operatior (ternary exp). petr4 doesn't support the case where both tru and fls expression have the infinite precision integer type when the condition can be evaluated at compilation time. This is allowed by P4 spec. ### Petr4 Discrepencies with P4 Spec +P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. +p4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. divops rule. section 8.7. check_binary_op impl. +p4 spec defines bitwise complement only for bit but petr4 also allows it for int. type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule. +p4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but petr4's type system doesn't check this. I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment. +p4 spec states that all expression of type int MUST be compile-time known values but petr4 doesn't always check this. section 8.7 spec. e.g., unaryminus or binaryops rules. + +### Cast Auxiliary Judgment +The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. +we use subscription of e or i to indicate if a rule only applies for explicit or implicit cast only, respecctively. o.w., the arrow doesn't have a subscription. + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[Bit<1>ToBool] + { } + { \explCast {\bitWidthTyp 1} \boolTyp } + + \inferrule[BoolToBit<1>] + { } + { \explCast \boolTyp {\bitWidthTyp 1} } + + \inferrule[UnsignedIntToSigned] + { \width_1 = \width_2 } + { \explCast {\bitWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + + \inferrule[SignedIntToUnsigned] + { \width_1 = \width_2 } + { \explCast {\intWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + + \inferrule[UnsignedIntToUnsignedInt-Explicit] + { } + { \explCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + + \inferrule[UnsignedIntToUnsignedInt-Implicit] + { \width_1 = \width_2} + { \implCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + + \inferrule[SignedIntToSignedInt-Explicit] + { } + { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + + \inferrule[SignedIntToSignedInt-Implicit] + { \width_1 = \width_2} + { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + + \inferrule[ArbitraryPrecisionIntToUnsignedInt] + {} + { \castenv \ \integerTyp {\bitWidthTyp \width}} + + \inferrule[ArbitraryPrecisionIntToSignedInt] + {} + { \castenv \ \integerTyp {\intWidthTyp \width}} + + \inferrule[TypeDefs] + { (\typEq \emp {\typ_1} {\newTypeTyp \name {\typ_2}}) \textOr (\typEq \emp {\typ_2} {\newTypeTyp \name {\typ_1}})} + { \castenv \ {\newTypeTyp \name {\typ_1}} {\newTypeTyp \name {\typ_2}}} + + \inferrule[TypeDefToType-Explicit] + { \explCast {\typ_1} {\typ_2}} + { \explCast {\newTypeTyp \name {\typ_1}} {\typ_2}} + + \inferrule[TypeDefToType-Implicit] + { \implCast {\typ_1} {\typ_2}} + { \implCast {\newTypeTyp \name {\typ_1}} {\typ_2}} + + \inferrule[TypeToTypeDef-Explicit] + { \explCast {\typ_1} {\typ_2}} + { \explCast {\typ_1} {\newTypeTyp \name {\typ_2}}} + + \inferrule[TypeToTypeDef-Implicit] + { \implCast {\typ_1} {\typ_2}} + { \implCast {\typ_1} {\newTypeTyp \name {\typ_2}}} + + \inferrule[Enums] + { \typEq \emp {\typ_1} {\typ_2}} + { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\enumTyp {\typ_2} {\name_2} {\names_2}}} + + \inferrule[EnumToUnderlyingType] + { \typEq \emp {\typ_1} {\typ_2}} + { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\typ_2}} + + \inferrule[TypeToEnumWithUndrlyingType] + { \typEq \emp {\typ_1} {\typ_2}} + { \castenv \ {\typ_1} {\enumTyp {\typ_2} {\name_2} {\names_2}}} + +\end{mathpar} +~~ +~ ### Coerce Binary Operation Arguments Auxiliary Judgment diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index cb9ce237e..69998cf9f 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -34,6 +34,10 @@ \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} \newcommand{\dclenvv}[4]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3} \dashv \env_{#4}} \newcommand{\dclenvvv}[4]{\constEnv, \typEnv \vdash {#1} \leadsto {#2} \dashv {#3}, {#4}} +\newcommand{\explCast}[2]{\castenv {e} {#1} {#2}} +\newcommand{\castenv}[3]{\env \vdash {#2} \rightarrow_{#1} {#3}} +\newcommand{\implCast}[2]{\castenv {i} {#1} {#2}} + %contexts: @@ -131,6 +135,7 @@ \newcommand{\argkv}{\var = \exp} \newcommand{\argkvs}{\overline \argkv} \newcommand{\argkvss}[1]{\var_{#1}=\exp_{#1}} +\newcommand{\names}{\overline \name} %function helpers \newcommand{\addTypeEnv}[2]{\typEnv[{#1}:{#2}]} @@ -142,7 +147,7 @@ \newcommand{\isInstantiation}[1]{\mathit{is\_instantiation} ({#1})} \newcommand{\isVariable}[1]{\mathit{is\_variable} ({#1})} \newcommand{\compileTimeEval}[1]{\llbracket{#1}\rrbracket_\env} -\newcommand{\implicitCast}[2]{\mathit{implicit\_cast}({#1},{#2})_\env} +\newcommand{\implicitCast}[2]{\implCast {#1} {#2}} \newcommand{\reduceEnums}[1]{\mathit{reduce\_enums}({#1}.\typ)_\env} \newcommand{\inOrLess}[2]{\mathit{in\_or\_directionless}({#1},{#2})} \newcommand{\typEq}[3]{{#2} ==_{\env,{#1}} {#3}} @@ -155,7 +160,7 @@ \newcommand{\isValidNestedTyp}[2]{\mathit{is\_valid\_nested\_type}({#1},{#2})_\env} %{#1} is outer, 2 is inner \newcommand{\noDup}[1]{\mathit{no\_duplicate}({#1})} -\newcommand{\explicitCastOK}[2]{\mathit{explicit\_cast\_ok} ({#1}, {#2})_\env} +\newcommand{\explicitCastOK}[2]{\explCast {#1} {#2}} \newcommand{\insertTypVars}[1]{\mathit{insert\_type\_vars}({#1}, \env)} \newcommand{\getTypeParams}[1]{\mathit{get\_type\_params}({#1})} \newcommand{\reduce}[1]{\mathit{reduce}({#1})} diff --git a/lib/checker.ml b/lib/checker.ml index ca48e50eb..519d1db16 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2265,28 +2265,37 @@ and cast_ok ?(explicit = false) env original_type new_type = | t1, Set t2 -> not explicit && type_equality env [] t1 t2 + (* done *) | Bit { width = 1 }, Bool | Bool, Bit { width = 1 } -> explicit + (* done *) | Int {width = width1}, Bit {width = width2} | Bit {width = width1}, Int {width = width2} -> explicit && width1 = width2 + (* done *) | Bit { width = width1 }, Bit { width = width2 } | Int { width = width1 }, Int { width = width2 } -> width1 = width2 || explicit + (* done *) | Integer, Bit { width = _ } | Integer, Int { width = _ } -> true + (* done *) | Enum { name; typ = Some t; members }, Enum {typ = Some t'; _} | Enum { name; typ = Some t; members }, t' + (* done *) | t', Enum { name; typ = Some t; members } -> type_equality env [] t t' + (* done *) | NewType { name = name1; typ = typ1 }, NewType { name = name2; typ = typ2 } -> type_equality env [] typ1 new_type || type_equality env [] original_type typ2 + (* done *) | NewType { name; typ }, t -> cast_ok ~explicit env typ t + (* done *) | t, NewType { name; typ } -> cast_ok ~explicit env t typ | List types1, Tuple types2 -> From 5def5564ba88bdcff6fb7b78d8b6e4d16991d6f1 Mon Sep 17 00:00:00 2001 From: pataei Date: Mon, 6 Jun 2022 11:48:42 -0400 Subject: [PATCH 05/30] casts done --- docs/petr4spec/Petr4-spec.mdk | 91 ++++++++++++++++++++++++++++++++--- docs/petr4spec/ops.tex | 14 ++++-- 2 files changed, 96 insertions(+), 9 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 2c3f53c2e..782997fdd 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -421,6 +421,9 @@ p4 spec states that all expression of type int MUST be compile-time known values The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. we use subscription of e or i to indicate if a rule only applies for explicit or implicit cast only, respecctively. o.w., the arrow doesn't have a subscription. + +P4 spec specifies casts up to Sets rule. The rest might be stated throughout the spec but I haven't found them yet. + ~ Center {padding:1ex} ~~ Snippet \begin{mathpar} @@ -498,6 +501,82 @@ we use subscription of e or i to indicate if a rule only applies for explicit or { \typEq \emp {\typ_1} {\typ_2}} { \castenv \ {\typ_1} {\enumTyp {\typ_2} {\name_2} {\names_2}}} + \inferrule[Sets] + { \typEq \emp {\typ_1} {\typ_2}} + { \castenv \ {\setTyp {\typ_1}} {\setTyp {\typ_2}} } + + \inferrule[TypeToSet] + { \typEq \emp {\typ_1} {\typ_2}} + { \implCast {\typ_1} {\setTyp {\typ_2}}} + + \inferrule[ListToTuple] + { \typEq \emp {\tupleTyps {\typs_1}} {\tupleTyps {\typs_2}}} + { \castenv \ {\listTyps {\typs_1} } {\tupleTyps {\typs_2}}} + + \inferrule[ListToHeader-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + {\explCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} + + \inferrule[ListToHeader-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + {\implCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} + + \inferrule[ListToStruct-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + {\explCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} + + \inferrule[ListToStruct-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + {\implCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} + + \inferrule[RecordToHeader-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + {\explCast {\recordTyp 1 n } {\headerTypp 1 n}} + + \inferrule[RecordToHeader-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + {\implCast {\recordTyp 1 n } {\headerTypp 1 n}} + + \inferrule[RecordToStruct-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + {\explCast {\recordTyp 1 n } {\structTypp 1 n}} + + \inferrule[RecordToStruct-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + {\implCast {\recordTyp 1 n } {\structTypp 1 n}} + + \inferrule[HeaderToHeader-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} + {\explCast {\headerTyp 1 n } {\headerTypp 1 n}} + + \inferrule[HeaderToHeader-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} + {\implCast {\headerTyp 1 n } {\headerTypp 1 n}} + + \inferrule[StructToStruct-Explicit] + {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} + {\explCast {\structTyp 1 n } {\structTypp 1 n}} + + \inferrule[StructToStruct-Implicit] + {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} + {\implCast {\structTyp 1 n } {\structTypp 1 n}} + + \inferrule[ID] + { \typ_1 == \typ_2} + {\implCast {\typ_1} {\typ_2}} + \end{mathpar} ~~ ~ @@ -710,9 +789,9 @@ names to type env. \inferrule[Record] { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \recordTyp {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \recordTypDef {\typ_i} \\ 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \recordTyp } + { \typWellFormed \recordTypDef } \inferrule[HeaderUnion] { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ @@ -723,15 +802,15 @@ names to type env. \inferrule[Struct] { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \structTyp {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \structTypDef {\typ_i} \\ 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \structTyp } + { \typWellFormed \structTypDef } \inferrule[Header] { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \headerTyp {\typ_i} \\ + 1 \leq i \leq n; \isValidNestedTyp \headerTypDef {\typ_i} \\ 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \headerTyp } + { \typWellFormed \headerTypDef } \inferrule[NewType(typedef)] { \typWellFormed \typ } diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 69998cf9f..ad1ef12b1 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -187,13 +187,21 @@ \newcommand{\voidTyp}{\mathit{void}} \newcommand{\arrayTyp}[2]{{#1}[{#2}]} \newcommand{\tupleTyp}[2]{\mathit{tuple}<{#1},\ldots,{#2}>} +\newcommand{\tupleTyps}[1]{\mathit{tuple}<{#1}>} \newcommand{\listTyp}[2]{[{#1},\ldots,{#2}]} +\newcommand{\listTyps}[1]{[{#1}]} \newcommand{\enumTyp}{\mathit{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\enumTypNoTyp}{\mathit{enum} \ {\name}\{\name_1,\ldots,\name_n\}} -\newcommand{\recordTyp}{\mathit{record}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +\newcommand{\recordTypDef}{\recordTyp 1 n} +\newcommand{\recordTyp}[2]{\mathit{record}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\recordTypp}[2]{\mathit{record}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} \newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} -\newcommand{\headerTyp}{\mathit{header}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} -\newcommand{\structTyp}{\mathit{struct}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +\newcommand{\headerTypDef}{\headerTyp 1 n} +\newcommand{\headerTyp}[2]{\mathit{header}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\headerTypp}[2]{\mathit{header}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +\newcommand{\structTypDef}{\structTyp 1 n} +\newcommand{\structTyp}[2]{\mathit{struct}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\structTypp}[2]{\mathit{struct}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} \newcommand{\newTypeTyp}[2]{\mathit{type}\ {#1}\ {#2}} \newcommand{\funcTyp}[3]{\mathit{function}\ {#1}<{#2}> ({#3})} %kind.type param. param. return type. From db92a57430a349f792975296f4ceb97241179841 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 7 Jun 2022 14:55:53 -0400 Subject: [PATCH 06/30] working on exp mem builtin --- docs/petr4spec/Petr4-spec.mdk | 339 ++++++++++++++++++++++------------ docs/petr4spec/ops.tex | 28 ++- lib/checker.ml | 12 +- 3 files changed, 247 insertions(+), 132 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 782997fdd..51c4b966f 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -229,7 +229,10 @@ fieldOrMethodTyp checks if the type is 2) if type is specialized with base as an extern, checks the env for the extern name, if it exists, finds the extern method with the name same as expmem name and returns a reduced type of function with that method type. if it doesn't find a method with the same name as expmem uses type_expression_member_builtin. 3) if type is an extern, converts it to specialized with base as extern and empty args. 4) any other type uses type_epxression_member_builtin. -arg can be exp, key value, or missing. +arg can be exp, key value, or missing. + +I couldn't find the followings in section 8 of p4 spec: +array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). ~ Center {padding:1ex} ~~ Snippet @@ -282,11 +285,11 @@ arg can be exp, key value, or missing. \inferrule[List] {1 \leq i \leq n; \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} - {\expenv {[\exp_1, \ldots, \exp_n]} {[\exp_1, \ldots, \exp_n]} {[\typ_1, \ldots, \typ_n]} \less } + {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\exp_1, \ldots, \exp_n}} {\listTyp {\typ_1} {\typ_n}} \less } \inferrule[Record] {1 \leq i \leq n; \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } - {\expenv {\{\field_1 = \exp_1, \ldots, \field_n = \exp_n \}} {\{\field_1 = \prim {\exp_1}, \ldots, \field_n = \prim {\exp_n} \}} {\{\field_1 : \typ_1, \ldots, \field_n : \typ_n \}} \less } + {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } \inferrule[LogicalNegation] { \expenv \exp {\prim \exp} \boolTyp \dir } @@ -333,12 +336,65 @@ arg can be exp, key value, or missing. {\lookupEnv {\errMem \name} = (\errTyp, \dir) } {\expenv {\errMem \name} {\errMem \name} \errTyp \less } - \inferrule[ExpressionMember] - { \expenv \exp {\prim \exp} \typ \dir \\ + \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \structTypDef = \reduce \typ \\ + % \structTypDef = \prim \typ\\ + \field_{n+1} = \isValid\\ + \exists 1 \leq i \leq n+1; \field_i = \name + } + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\typ_i} {\less} } + + \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-BuiltInMethods] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \structTypDef = \reduce \typ \\ + % = \prim \typ\\ + \field_{n+1} = \isValid\\ + \fieldAccessEnv {\structTypDef} \name {\prim \typ} + } + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} {\less} } + + \inferrule[ExpressionMember-Specialized] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % names in the following are actually methods. have to see what they contain. + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % \prim \env = \insertToEnv \typParams \typs \\ + \exists \name_i \in \names; \name_i = \name \\ + \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim {\typ_i}} \less} + + \inferrule[ExpressionMember-Specialized-BuiltInMethods] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % names in the following are actually methods. have to see what they contain. + % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \fieldAccessEnv {\spcTyp {\externTyp {\prim \name}} {\typs}} \name {\prim \typ}} + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} \less} + + \inferrule[ExpressionMember-Extern] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \externTyp {\prim \name} = \reduce \typ \\ + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % \prim \env = \insertToEnv \typParams \typs \\ + \exists \name_i \in \names; \name_i = \name \\ + \pprim {\typ_i} = \reduce {\prim {\typ_i}}} + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim {\typ_i}} \less} + + \inferrule[ExpressionMember-Extern-BuiltInMethods] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \externTyp {\prim \name} = \reduce \typ \\ + % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \fieldAccessEnv {\spcTyp {\externTyp {\prim \name}} {\ }} \name {\prim \typ}} + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} \less} + + \inferrule[ExpressionMember-Rest] + {\expenv \exp {\prim \exp} {\typ} \dir \\ \prim \typ = \reduce \typ \\ - \pprim \typ = \fieldOrMethodTyp {\prim \typ}} + \fieldAccessEnv {\prim \typ} \name {\pprim \typ}} { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } + \inferrule[Ternary] {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\ @@ -409,6 +465,9 @@ arg can be exp, key value, or missing. ### Petr4 Restrictions Compared to P4 Spec conditional operatior (ternary exp). petr4 doesn't support the case where both tru and fls expression have the infinite precision integer type when the condition can be evaluated at compilation time. This is allowed by P4 spec. +Petr4 doesn't have the product operation where multiple sets can be combined using cartesian product and the type of a product of sets is a set of tuples. section 8.12.5. (question) +Petr4 uses Ocaml's field access of records as its field access for structs. NO! field access is expression member. + ### Petr4 Discrepencies with P4 Spec P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. @@ -416,6 +475,135 @@ p4 spec defines division and modulo only for arbitrary-precision integers but pe p4 spec defines bitwise complement only for bit but petr4 also allows it for int. type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule. p4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but petr4's type system doesn't check this. I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment. p4 spec states that all expression of type int MUST be compile-time known values but petr4 doesn't always check this. section 8.7 spec. e.g., unaryminus or binaryops rules. +at first glance, it might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. + + +### Coerce Binary Operation Arguments Auxiliary Judgment +Let implicitCast typ typ be defined as follows to describe P4's implicit +casting behavior on operands in binary expressions: + +cast typ exp produces a cast expression if the type of exp is different from the +type typ. + +The restJ rule stands for all other binary operations. + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[ShiftRight] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} + { \coerceBinArgsEnv {\exp_1 \shiftR \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } + + \inferrule[ShiftLeft] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} + { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } + + \inferrule[BitConcatenation] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} + { \coerceBinArgsEnv {\exp_1 \concat \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } + + \inferrule[Rest] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + \typ = \implicitCast {\typ_1} {\typ_2} \\ + \pprim {\exp_1} = \cast \typ {\prim {\exp_1}} \\ + \pprim {\exp_2} = \cast \typ {\prim {\exp_2}}} + { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}, {\typ_1}, {\dir_1}} {\pprim {\exp_2}, {\typ_2}, {\dir_2}} } + +\end{mathpar} +~~ +~ + +### Check Binary Operation Auxiliary Judgment +reduce enums removes all the enums recursively after reducing a type. +in_or_dirless(typ1, typ2) retunrs direction of In if both typ1 and typ2 have In direction, o.w., it returns a directionless direction. +is true if and only if expression type t1 is equivalent to expression type t2 under environment env. Alpha equivalent types are equal. it takes the list of variables of the two types. +is nonneg and is pos evaluate an expression at compile time and check if it's a nonneg or pos numeric. +compile time known determinez if the value of an expression can be known at compile time. + it returns true for externs, packages, controls, and parsers.. + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + + \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \typ_1 = \typ_2 = \boolTyp} + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + + \inferrule[NumericOps($+, -, *$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width } + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + + \inferrule[EqualityChecks($==, !=$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \typEq {\emp} {\typ_1} {\typ_2} \\ + \typHasEq {\typ_1} } + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + + \inferrule[OpSat($\plusSat,\subSat$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + + \inferrule[BitwiseOps($\bitAnd, \bitOr, \bitXor, \bitComplement$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + + \inferrule[BitstringConcatenation] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \left( \so {\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ + \textOr \left( \so {\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right) } + { \binOpEnv {\exp_1 \concat \exp_2} {\exp_1 \concat \exp_2} {\typ} \dir } + + \inferrule[ComparisonOps($<, \leq, >, \geq$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \left( \typ_1 = \typ_2 = \integerTyp \right) \\ + \textOr \left( \typ_1 = \typ_2 = \bitWidthTyp \width \right) \\ + \textOr \left( \typ_1 = \typ_2 = \intWidthTyp \width \right)} + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + + \inferrule[DivOps($\div, \mod$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \left( \so {\typ_1 = \typ_2 = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \\ + \textOr \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) } + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \typ \dir } + + \inferrule[ShiftOps($\shiftL,\shiftR$)] + { \typ_1 = \reduceEnums {\exp_1} \\ + \typ_2 = \reduceEnums {\exp_2} \\ + \dir = \inOrLess {\typ_1} {\typ_2} \\ + \nonNeg {\exp_2} \\ + \left( \typ_1 = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ + \textOr \left( \typ_1 = \integerTyp, \compTimeKnown {\exp_2} \right) } + { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + +\end{mathpar} +~~ +~ ### Cast Auxiliary Judgment The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. @@ -582,133 +770,49 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the ~ -### Coerce Binary Operation Arguments Auxiliary Judgment -Let implicitCast typ typ be defined as follows to describe P4's implicit -casting behavior on operands in binary expressions: - -cast typ exp produces a cast expression if the type of exp is different from the -type typ. - -The restJ rule stands for all other binary operations. - -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small - - \inferrule[ShiftRight] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \shiftR \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[ShiftLeft] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[BitConcatenation] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \concat \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[Rest] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - \typ = \implicitCast {\typ_1} {\typ_2} \\ - \pprim {\exp_1} = \cast \typ {\prim {\exp_1}} \\ - \pprim {\exp_2} = \cast \typ {\prim {\exp_2}}} - { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}, {\typ_1}, {\dir_1}} {\pprim {\exp_2}, {\typ_2}, {\dir_2}} } - -\end{mathpar} -~~ -~ - -### Check Binary Operation Auxiliary Judgment -reduce enums removes all the enums recursively after reducing a type. -in_or_dirless(typ1, typ2) retunrs direction of In if both typ1 and typ2 have In direction, o.w., it returns a directionless direction. -is true if and only if expression type t1 is equivalent to expression type t2 under environment env. Alpha equivalent types are equal. it takes the list of variables of the two types. -is nonneg and is pos evaluate an expression at compile time and check if it's a nonneg or pos numeric. -compile time known determinez if the value of an expression can be known at compile time. - it returns true for externs, packages, controls, and parsers.. +### Field Access Builtin Methods Auxiliary Judgment +ref to type_expression_member_function_builtin. ~ Center {padding:1ex} ~~ Snippet \begin{mathpar} \small - \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \boolTyp} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } - - \inferrule[NumericOps($+, -, *$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } - - \inferrule[EqualityChecks($==, !=$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \typEq {\emp} {\typ_1} {\typ_2} \\ - \typHasEq {\typ_1} } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + \inferrule[Control] + {} + { \fieldAccessEnv {\controlTyp \ \ } \apply {}} - \inferrule[OpSat($\plusSat,\subSat$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + \inferrule[Parser] + {} + {blah} - \inferrule[BitwiseOps($\bitAnd, \bitOr, \bitXor, \bitComplement$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + \inferrule[Table] + {} + {blah} - \inferrule[BitstringConcatenation] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \left( \so {\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ - \textOr \left( \so {\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right) } - { \binOpEnv {\exp_1 \concat \exp_2} {\exp_1 \concat \exp_2} {\typ} \dir } + \inferrule[Struct] + {} + {blah} - \inferrule[ComparisonOps($<, \leq, >, \geq$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \left( \typ_1 = \typ_2 = \integerTyp \right) \\ - \textOr \left( \typ_1 = \typ_2 = \bitWidthTyp \width \right) \\ - \textOr \left( \typ_1 = \typ_2 = \intWidthTyp \width \right)} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + \inferrule[Header] + {} + {blah} - \inferrule[DivOps($\div, \mod$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \left( \so {\typ_1 = \typ_2 = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \\ - \textOr \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \typ \dir } + \inferrule[Array] + {} + {blah} - \inferrule[ShiftOps($\shiftL,\shiftR$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \nonNeg {\exp_2} \\ - \left( \typ_1 = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ - \textOr \left( \typ_1 = \integerTyp, \compTimeKnown {\exp_2} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + \inferrule[HeaderUnion] + {} + {blah} \end{mathpar} ~~ ~ + +## Type Related Judgments + ### Type Well-Formed Auxiliary Judgment it saturates all types first and then checks well-formedness. for breviety, we don't include the saturation in rules. @@ -877,6 +981,9 @@ names to type env. ~~ ~ +### Type Equality Judgment +TODO: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. + ## Statement's Typing Rules this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index ad1ef12b1..6dcf95b01 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -12,7 +12,7 @@ \newcommand{\so}[2]{{#1} \Rightarrow {#2}} \newcommand{\lookupEnv}[1]{\env({#1})} \newcommand{\emp}{[\ ]} - +\newcommand{\insertToEnv}[2]{\env, [{#1} : {#2} ]} % separator \newcommand{\rn}[1]{\TirName{#1}} \newcommand{\rSep}{\rn{-}} @@ -29,6 +29,7 @@ \newcommand{\binOpEnv}[4]{\env \vdash {#1} \hookrightarrow {#2}, {#3}, {#4}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} +\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash {#2} : {#3}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} \newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} @@ -83,7 +84,12 @@ \newcommand{\varDecl}[2]{{#1}\ {#2}} \newcommand{\varInit}[3]{{#1}\ {#2} := {#3}} %name. -%% \newcommand{\parserDecl}[]{\mathit{parser}\ {#1} (type_param param) {const_param locals states} +%% \newcommand{\parserDecl}[]{\mathit{parser}\ {#1} (type_param param) {const_param locals states} +\renewcommand{\list}[1]{\{{#1}\}} +%% \newcommand{\record}[2]{\{\field_{#1} = \exp_{#1}, \ldots, \field_{#2} = \exp_{#2}\}} +\newcommand{\recordd}[3]{\{\field_{#1} = {#3}_{#1}, \ldots, \field_{#2} = {#3}_{#2}\}} +\newcommand{\record}[2]{\recordd {#1} {#2} {\exp} } + %metavariables: \newcommand{\env}{\Gamma} @@ -118,6 +124,7 @@ \newcommand{\params}{\overline x} \newcommand{\prm}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} \newcommand{\typParam}{X} +\newcommand{\typParams}{\overline \typParam} \newcommand{\wildcardParam}{w} \renewcommand{\arg}{\mathit{arg}} \newcommand{\args}{\overline \arg} @@ -163,8 +170,9 @@ \newcommand{\explicitCastOK}[2]{\explCast {#1} {#2}} \newcommand{\insertTypVars}[1]{\mathit{insert\_type\_vars}({#1}, \env)} \newcommand{\getTypeParams}[1]{\mathit{get\_type\_params}({#1})} -\newcommand{\reduce}[1]{\mathit{reduce}({#1})} -\newcommand{\fieldOrMethodTyp}[1]{\mathit{field\_or\_method\_type}({#1})} +\newcommand{\reduce}[1]{\mathit{reduce}({#1})_\env} +\newcommand{\reduceWithEnv}[2]{\mathit{reduce}({#2})_{#1}} +%% \newcommand{\fieldOrMethodTyp}[1]{\mathit{field\_or\_method\_type}({#1})} \newcommand{\isLval}[1]{\mathit{is\_lvalue}({#1})} \newcommand{\castExpression}[2]{\mathit{cast\_expression}({#1},{#2})} \newcommand{\ifVoidTyp}[1]{\mathit{if\_void\_type}({#1})} @@ -172,6 +180,14 @@ \newcommand{\checkParamShadow}[2]{\mathit{check\_parameter\_shadowing}({#1}, {#2})} %% \newcommand{\resolveFuncOverload}[2]{\mathit{resolve\_function\_overload}({#1},{#2})} \newcommand{\match}[2]{\mathit{match}({#1},{#2})} +\newcommand{\isValid}{\mathit{isValid}} +\newcommand{\apply}{\mathit{apply}} +\newcommand{\minSizeBits}{\mathit{minSizeInBits}} +\newcommand{\minSizeBytes}{\mathit{minSizeInBytes}} +\newcommand{\setValid}{\mathit{setValid}} +\newcommand{\setInvalid}{\mathit{setInvalid}} +\newcommand{\pushFront}{\mathit{push\_front}} +\newcommand{\popFront}{\mathit{pop\_front}} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} @@ -188,8 +204,8 @@ \newcommand{\arrayTyp}[2]{{#1}[{#2}]} \newcommand{\tupleTyp}[2]{\mathit{tuple}<{#1},\ldots,{#2}>} \newcommand{\tupleTyps}[1]{\mathit{tuple}<{#1}>} -\newcommand{\listTyp}[2]{[{#1},\ldots,{#2}]} -\newcommand{\listTyps}[1]{[{#1}]} +\newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} +\newcommand{\listTyps}[1]{\tupleTyps {#1}} \newcommand{\enumTyp}{\mathit{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\enumTypNoTyp}{\mathit{enum} \ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\recordTypDef}{\recordTyp 1 n} diff --git a/lib/checker.ml b/lib/checker.ml index 519d1db16..8d5309ccd 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2255,6 +2255,7 @@ and check_binary_op env (op: Op.bin) typed_l typed_r : Prog.Expression.t = tags = tags_bin op} (* See section 8.9.2 "Explicit casts" *) +(* cast judgment in spec. *) and cast_ok ?(explicit = false) env original_type new_type = let original_type = saturate_type env original_type in let new_type = saturate_type env new_type in @@ -2265,37 +2266,28 @@ and cast_ok ?(explicit = false) env original_type new_type = | t1, Set t2 -> not explicit && type_equality env [] t1 t2 - (* done *) | Bit { width = 1 }, Bool | Bool, Bit { width = 1 } -> explicit - (* done *) | Int {width = width1}, Bit {width = width2} | Bit {width = width1}, Int {width = width2} -> explicit && width1 = width2 - (* done *) | Bit { width = width1 }, Bit { width = width2 } | Int { width = width1 }, Int { width = width2 } -> width1 = width2 || explicit - (* done *) | Integer, Bit { width = _ } | Integer, Int { width = _ } -> true - (* done *) | Enum { name; typ = Some t; members }, Enum {typ = Some t'; _} | Enum { name; typ = Some t; members }, t' - (* done *) | t', Enum { name; typ = Some t; members } -> type_equality env [] t t' - (* done *) | NewType { name = name1; typ = typ1 }, NewType { name = name2; typ = typ2 } -> type_equality env [] typ1 new_type || type_equality env [] original_type typ2 - (* done *) | NewType { name; typ }, t -> cast_ok ~explicit env typ t - (* done *) | t, NewType { name; typ } -> cast_ok ~explicit env t typ | List types1, Tuple types2 -> @@ -2516,7 +2508,7 @@ and type_expression_member_function_builtin env typ (name: P4String.t) : Typed.T | _ -> None (* Sections 6.6, 8.14 *) -(* look at spec. it uses a helper with a whole bunch of explanation. Disuss: any ideas to improve it. TODO*) +(* look at spec. *) and type_expression_member env ctx expr (name: P4String.t) : Prog.Expression.t = let typed_expr = type_expression env ctx expr in let expr_typ = reduce_type env typed_expr.typ in From 28b87fbda7baaab1cf637da4fcac81f84bd7992e Mon Sep 17 00:00:00 2001 From: pataei Date: Thu, 9 Jun 2022 07:46:35 -0400 Subject: [PATCH 07/30] testing with math in line --- docs/petr4spec/Petr4-spec.mdk | 35 +++++++++++---------- docs/petr4spec/figs/actions.png | Bin 46971 -> 0 bytes docs/petr4spec/figs/compileeval.png | Bin 51234 -> 0 bytes docs/petr4spec/figs/evalmultiple.png | Bin 49107 -> 0 bytes docs/petr4spec/figs/headerstack.png | Bin 22611 -> 0 bytes docs/petr4spec/figs/maudataflow.png | Bin 180616 -> 0 bytes docs/petr4spec/figs/p4checksum.png | Bin 27154 -> 0 bytes docs/petr4spec/figs/p4interface.png | Bin 90061 -> 0 bytes docs/petr4spec/figs/p4prg.png | Bin 152857 -> 0 bytes docs/petr4spec/figs/p4transition.png | Bin 89087 -> 0 bytes docs/petr4spec/figs/packetfilter.png | Bin 30888 -> 0 bytes docs/petr4spec/figs/parserstatemachine.png | Bin 73596 -> 0 bytes docs/petr4spec/figs/prgswitch.png | Bin 230924 -> 0 bytes docs/petr4spec/figs/subparser.png | Bin 122786 -> 0 bytes docs/petr4spec/figs/switcharch.png | Bin 48395 -> 0 bytes docs/petr4spec/figs/vssarch.png | Bin 231408 -> 0 bytes docs/petr4spec/figs/vssmau.png | Bin 70776 -> 0 bytes 17 files changed, 19 insertions(+), 16 deletions(-) delete mode 100644 docs/petr4spec/figs/actions.png delete mode 100644 docs/petr4spec/figs/compileeval.png delete mode 100644 docs/petr4spec/figs/evalmultiple.png delete mode 100644 docs/petr4spec/figs/headerstack.png delete mode 100644 docs/petr4spec/figs/maudataflow.png delete mode 100644 docs/petr4spec/figs/p4checksum.png delete mode 100644 docs/petr4spec/figs/p4interface.png delete mode 100644 docs/petr4spec/figs/p4prg.png delete mode 100644 docs/petr4spec/figs/p4transition.png delete mode 100644 docs/petr4spec/figs/packetfilter.png delete mode 100644 docs/petr4spec/figs/parserstatemachine.png delete mode 100644 docs/petr4spec/figs/prgswitch.png delete mode 100644 docs/petr4spec/figs/subparser.png delete mode 100644 docs/petr4spec/figs/switcharch.png delete mode 100644 docs/petr4spec/figs/vssarch.png delete mode 100644 docs/petr4spec/figs/vssmau.png diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 51c4b966f..be7a91645 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -1,19 +1,18 @@ -Title : Petr4 Type System Formalization -Title Footer: &date; -Author: Parisa Ataei, Ryan Doenges, Nate Foster -Affiliation: Cornell University -Heading depth: 5 -Math Dpi : 299 -Pdf Latex: xelatex -Math Latex Full: pdflatex -Document Class: [11pt]article -Package: [top=1in, bottom=1.25in, left=1in, right=1in]geometry -Package: fancyhdr -Package: mathpartir -MathJax Ext: AMScd -Package: amscd -MathJax Ext : mhchem -Package : [version=3]mhchem +Title : Petr4 Type System Formalization +Title Footer : &date; +Author : Petr4 Team +Affiliation : Cornell University +Heading depth : 5 + +Math Mode : static + +Document Class : [11pt]article + +Package : amssymb +Package : amscd +Package : fancyhdr +Package : mathpartir + Tex Header: \setlength{\headheight}{30pt} @@ -172,6 +171,10 @@ the implementation of Petr4 deeply. # Overview { #sec-overview } +test $a \leq b$. + +test2 $ \var$. + This document defines the type system of Petr4. The type system conducts three tasks simultaneously: diff --git a/docs/petr4spec/figs/actions.png b/docs/petr4spec/figs/actions.png deleted file mode 100644 index 7404a6cb0ba2572069e8ef58f56796f75960bd14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46971 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 VmkjKCuw=lGy0Z3-B1Ma*{|_FA;a&g$ diff --git a/docs/petr4spec/figs/compileeval.png b/docs/petr4spec/figs/compileeval.png deleted file mode 100644 index c0d5ad6cd6857b54ebc6e21b3a3bf39457492b81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51234 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 diff --git a/docs/petr4spec/figs/evalmultiple.png b/docs/petr4spec/figs/evalmultiple.png deleted file mode 100644 index 15f7185ade4797cbde3a0b6c56c1228c270db0d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49107 zcmeFZc|4SV^fw$rDN70=Tehz~>tt7wElbG0RQ7eUuVYD3*|(8h*6h2;5<(0n zF?I&SFvjv+>RaD__g~LH_x*Z3&+Gn!G;>{ZozMB4^Ev0d&-=_vU2RoL3MPs(XUWGEl_hsaY;_4b*{fosdaf6hNqGx0oghJp67`R30 zjQX8h27W|q)8`K_?w-8gf+bUVpnD<7Q%%o>hxs_9X`8R9a2V-b;r6)l^2HTC{wpdy zmo&&}_2&E1%py7G7Zou_FlRd-A732dXaf&{u*N~w`s@|Nv1yCt>3hBkk>}16ouyGa z^MB~q=6Rb2QTV?hNrc_E6y0JDQt=DvYmw z{{83IeFk>pmon14cm9?ZM0{4jE%~4D-*=u~{eLg~v!nkz)U(*acLigMW4p=a?_ouc z8I5*0f*-pTdSO7HJz`BT(J4Xxo@U#|>dZu~BV7skfA;UgSy~z6A@)L}lhlGIVTWSh zODaE9iZ8>2ju!$=nhtnT-V2|zW0X3J6L1&&ire^9|7`Rc@%f31Ykg_rVh8RqIteCe5L~;3yL6JDK5e=eHZY7mj}dHsonPN#NGyd*W}|BnM_C zco&xKS_I;HXO74P$NP{x7gWO7@ttEMKR-ev3K_Oeuteo{n&48 zw7coUgm7ta2JvAnXL5}1vxm}xzd!Fgd%SLb*aU$hxw-b4O`AkihiwzWlz=6hsP}GJ zlYOEadx$T-B4Do8o6@YOVPRq}X4^Zz!Or(jAvlsAvRmPTYEV7iYd=v(Q`i>j;l=ox zp)qESg$J%l3Za-|NRG=)qebIkqcYVsIYA?O5q>lxIhj`Ff@W7VqyCeWnrUvm@nrg$ znv~hKU%t*Bs`TUBC-3UohdpABLmN{zaUpE-b_t`AtLEHg_-!#Oj~W-V2IB!)kt#|z^A zv7pD_#j|sJOQNN9!k>LKvJ&Av#&@S4jlE4R_)y^uS#@KGWswz5S(QpwRz2Qa*E?BY zwjEx21NSD}=Bn%oiv8-B5!dl&4?~q4!rtrbzS)cMdx;4)7E(RlAKAn2p+bZfzj|YF zdCw`xE*iu#g=r7klWR^mgHy**0U{4`^LW3g^M=e+tEbB!zN>dYc4CV@c>G`&IKXw6 zXph*32%{@ol)aX0i5?DYkIi-yU;@$d}li1u(md$`*Pt`~w|VF^W&r zRwSIbMcNhaYv(Ae`(A~-A4rt0vx3_N-6V+Xgw`DtTU~=8#n-h)z0QOhb?YQ9xXL0P zjW81vf@i!bsaP@7R+iVcnn40fd)sW|#*L9oPn1Y%y0e3{n|J&zsaO;qPmH%D@{N$r zsGwjQdmj|#AIeOA8j?Do5BHb?}yKxjAXYFY`(n)3AK0!EGaaty!ru^vv}Dh z>95073G-EiU-}dIJ~F&mwR;Hr+N5222&x^e#TfM-b|Qj|`~cfQh)>Jn$GqQs5b_pW zZO)@^14*^&)Z3c2*R8W3>uEA@Z5Y;V z4fn>}uCG)dWT=F}VuLtOqwmiXyWk$Xa<9(?`1on8CKI`IJQmrq1BDe2?5w{%k~I|E z{|wux&&?VKJ58BFgIhk<;un~m5%WVGTsj*FLHrDzYtd*MDoPBuUNR#%xQ7st6S9~@ zfqTTO9719;jSRL{H!E#l(eZJKqgdC!v8k~2vaL_(6b0Qx1l`m*v(+U)BILh7M|rJu z=IiH7ZmU6mD<{J;n;vYXm&Aam+pq+tbkS_Fgi(H8y2QgFl ziXAMHvO(rxu!Z;nA7es@{mdLT=C?Mu%9PAOB;xtVNFg6_WdgQCl|afb#DwDWEN){2 z9Lm$uYv_3wNl-|MMgFTMiecX`0$p!S2C}vra!1ter&lFO1RpI+bStUAtR7#ycw=ky zL$FpR4;*B%_vl}n*n_cIm;a5V{cbv z*Glw@<@-MeF*ZIIYXk|%98AnW$XyDFt8gnPi9oP&j{Y(>drTiJdk34oGe7G`cmTcl z$4A4eNolVe4-IUsg4}A%%|~C+39jPk*4a-EtH%W=n1UR1X*i-g!2+>BLdBl!rm(m(Q83 z$Jn_nBr953;`g)0(LbU@#O%qzY=n)VHTR*qZwGD0xX|Kh-ZFhJ|fPaMdD%%QwR0YlH~sE~_}N>o7Xml5r1e zZyz zM$sCYS2jd9t=!B1bj*!sEjT1J$UYXXd zbjm4uYTBjs=RUYGqO*M^lOdeNX;`?$Rz6D2L7Qc?pK#W6Y{6pTil8x{ z{;=X7(EGj2YcD z5GX5dK^>I@v2Tvjxg2>R>o44N^c4=jB^H7OC>TDAScSlb6ESw^YSCN8(kyab-&&na zsC@SyXPxoD9D8PMl2AS<=Y82JIgt@cy4}eBzeq)Gc$%wBmLoDtnJx>FX~a zi7hvQfO^z8Asa!UJD2zfqYGxeglNrZOVf?vr|ZwK5L#s>3)HWbYx2ae2QF=1nmEYV zrHmdy7O`{*?j+pvXIWX0w<@}q_Ngi^s$;WLhN!@&9K_4g(9gQ$2kZWkJ{1tS`Wf_} zhfSXQ1QEXx7?R?|v0xipDjPBo`#)s#51RXBAtcvN5gx9{zSO zU^dO>X-D|m?TN5)Eaq+d3h#;kLyv`OpT0fWc;&87zKZqpPQ0GQv(R<0yT`(3VcdPh zj#9g9ACuKVFD-3()yqQS67!*80k**`jO;7ORXf7jc$tLxFUM^VbQb+jVX{^Yi z_R^O#4{NuU3qSPg&W%j$f3m1OQ85!R7W%CAu(?g?IOqVad2;AE?AK9kbz9P8dwmo2 zv9v)Ev8PyGV}ly`F4Yacf=kHrDz@&9Gs96fh&}3!48|5oI2)kcVRU67we#doOp6j% z-%D|x`Kr#*p3_EFI<>UOayio9braFqsdGygl7&rm!&AnZY2tcV&t4IJZB_4RP;KyqzTCki z%UCq?p~}e$svBn%A|Fc?ww9dvw6q`DC`;$vCkrIctxvFNzANTcq!e`Tru4LpG7n<*>BMZ8@CU6oro`8(K?Kn`$`=`4qja6}%6H3(d0amh zCV8*eK#$1cs;@m(!c-;-m7Qd;YjRj~PmW)Sg|$_d|COL=I^_Ra09Y3+V#+*P(oWO^fS>RJX!^7}{Ema)$@<@*QM z@Y<_`l>VbtoFP_oLgD%&4RnnhiMxJb>0OSYb|I(P+g|jg?kUOpBkcK_Ig3JJ8b$XQ z)T+9X(iRa`*#jkdIt)GmZw zbC>tpa?%&)Xfq|;3D+i`ton3(_s6=UxNU>bru(E3RzhtVe3p8lKr7kOf7a0x3id}c zIVTBXB03T9)DN89{zfFhA^2Tiv7LtV(Dm{0a-NutcN2+=7AB6)z-bqYMy$%+FWeZ( z+sc};kVnZ#&wW$Z7xLE@kTKHAh?Tb)v%esifoyOSCKZNBHPl_HuK0$T0L%IyG^^l` z_;$CkkVE2onnXwqi7GyGu-OBXKP5Yj+H<8TG68aG7HEfRIcFftjqRxdRaOT_z9R6s zjgazGml>vaj!=b6Ma7`{sfpSw6mx=+r6143Vz0o(04y>d9&VXHs#y+p=%XX-M2W~R zj)16U3i4C6AlA?3%;<#brlc^@BMy&dte1VuihR|feQEtB+dJ=5ZCCnq1pOCMPOD#w z3YpJ=;^nqpd5AZIq-+(4plcRmvr+x(BsVEvw=P#A-4dI}M|Ucl4`LT2pRca35dZV+ z&x!tBLy1s+R%4br$9qGqg!O1CUPyOHS?6d;zb9L$%s}*R`|yHMQo$DjPi;8AZo8fBu};3>D?g(^6xyWG34(s3>yCs4z?( z34?#6ms_eikvyND~jK!Q5~q^Rd|hFHv576VEoqnO?lAaz-qQkI#yXIRVqS6s<`O_J;6|3nJ$v?aA{zuxhUC> zAUx0|9DJ*z#zEp3jWngTRRtwF`kP ztPqKd^&VD{ZesoCaC(XS$wJ&#LHmvK11aKb(~|E>-8C@P{L%|*U*B`XT?#_Sqz#!fw`^2xTk1I~jN?r+cWZGYmV zmYLDd%2LqH)dNtgS{qy-2ML|)KmpjVuf()-J6nO}f}J)!kUaA&zb68!Fhz&lyzUy1 z^hj%I7k;XM&pHx;g=9a;gmHg4X8J-2I!G#itthS%_KFpjEPDO5{_y+me%(%OLICzU zM5|;AH*$Vbzic5t2kTdH+g`2?GCA~lxq5w^3WLRx z*HxWtoa7MCeWrpS0zOiYTaA5Q{>4Z~xi9NgN+tNwnsU=(C6buz+~gJ4`6vjQAY!+_ zyS|y-ap(#rHmtoPYSeMGBD!;M;05`5?p0Awn=fkFzsyFV(cc8cFaHEHT|0{uDR7P? zpFhNgH_%I9mfJJAHSM}*BfQ@}ri{=_`YF72zjuwupIH3<1dv|*2A1*^Kr(?n%D0Cn z=Xb|yy3cV~Dav4a{TG|!U^}k8!(b!71^$VKMPF%=4u8Eo<3~DHiF!u#)Zbptm@{BK zFht6Noc?q|=DLmL^#ix7&@d)!>yp3syBYnvb&XH)BA}TU$w^EP_|vHwMr~PIzn5VQ zdvO*mw&NRZ*?8w(XtQ1~6U&cXnLZNII}MLZZkn`OUhaRd=dM3N_iq+692IIUUj6Kx z;g4OaQP-~;(4e|0qqZX7Y2gu`=$(qX&`=7R@=e)42lZ`=n`8nTR+`V`f)Ds}J19@8 zyJP~48+z%68HkOdetQi7+?^#oXQ=lAFknOJfVJ1QU~mYXCXc{><=Z*-`0GSZQ?Ar3 ze>Qg(3Up$N>qR3>w~cT8hCzV<9F}~6ro7&r#Dh8fZ5Od~(1_jG{ z2YqC^y2A6~N1#9ELv(hy;`B|oqn@Nb~RAT}0m&gZUGN|8OC|3ceJHfMpi#44}-*7wh};yQ;?PKw%Fk9&U!OrzESNL+ee`acPP zzwX=)eaKB)dhPO`q!W0oo{&;?qSI}vKQ-Oy!xCtK7RWRH?mx)*ss0R3^_Lz`@&{-K z^smHq_MGAMH@%|&l@&BffHp3rT@f2?_;KccY*F^9`0~@Pm4C?}c84LC(KruvYvoT< z2KdxOz)rZ9W6-t#B~CPIUce6DX%GL(_MiA+Ty*Tl>ch+k+yC-H_V^`WGhPOhmniG_1w!nW%amd4t5f^n zyYl&Uu}#F4jb683dOLgNd%uPflhpsPXhA@?k4pxd{@Ot$_FO=>|M$XESNK1rp7(en zST#`?7sHbL!xusL-930&`GbnYRS%RQ!4D~bPd?}E#@gBrurdcx;`7taZ8x(s%shseziC@i6zE#NfLUw->T1#nr* zjkCL_&&c~n7vA^az8rJ$uak$}mRN#BGmSa$uM;a&=^0>j*DvbS{AG zSDJ64&VqlU&MxIPscz^x%g z2spN#snpgc5$qIaR;ajs(Y=J5uCHR7hN|()sWG+Id#pg;r+(4bto+HXlKW^UX-w<) zkdgaHTZB;$Sk~A7nDUBr< z4%@IL{V+)F*ET%^A{VWcNzmGt+M~X2~oeV3uEM%rc zfO1b-C2TlN+}>v6DYsbgwglc~R&VHGAD`_&&`U4ZlTa_rPPGjpphQ2xV6lJSCR=W@ zE~k)+Q9PS>E~5Q=6Z|3Xi$)|as|B4hj!Fcf2)eOsinGQI>36?x-h*j-AhpH=8~1{I zs#_(!BdW@MJ_Wa0FrxzAKG$jA*Si}VXm;A}zy^Bp=Wu)4HBH|{jZDjE6cDt(om2$j zjx+Qs^hk9Yb}VDB?m>gB&oXP5yuDN{H`dtTB~^)HJ-dnt{*JJoZ%fPhTw~pR5@12=NO_TNoy_XP z#vQG+pNQ7B?&3`Cd%(GWUCAGgA+!`;dTP9D;FV z0bN0$aU|eiv6~*S!)(*aad2ygns`QLz@plC1M^jL2TrEJq#JkRX=7Y8s;_>Fv!Hn^ zVo2-N7#RI_3*32#qVc9kUW+(DWrRedRH}|edX_-Ne!iX*23{HP^yabsAiE$135AO2 zLB8L5W-n0M#8Gni7Av)$JH(HpJXE6^V}bG&#+%W2%rh?Oz~MYr;p@%Vf?G>jWu9U- z%zdm_eN0Mdw4I{lkJU-NHmKWE(8<=aYXDgQ^7`(!- zE1ILfDs!B*hh7NWpg#Bxp5bjk6l>=|$@Utk8Q;Dh#13VO6qs2-MA^l#BmTp=wt?fj zqcAgSg&E{_izpki_1Ze>6@F?~a24V_UDG11>)sNmpZ}c;_M9*BSKbOXOq>VhQtJUw z$d-lH=qogO)=&!_VLB>*Bn?zN<6Tyfs_?Bwmx;y>BW(ihSJx@iF^Ig8@L)!FD%k2v z_MZ0^HZITqY3AG<}=q*{M9&8-~vCe~NG%|)H9Q$|NWdu2_)^K?>QT1zch zDjTHg`?Y1u+>QdeBeHxjrh%gMPr?!QpZsw4SQPSZH3>%5JPBOrOhrG4WM7|TdVpS# zX+Wp*)5#wNL90v!P!)$m*a&5Uqr>oOJ;-;vE!W&Mbx9A50K%H8b`xmJir&gO%<-9kcLvY!>Y0p%1 z+a2*C=W*0}w{q;Ay*l7=!jUfr)@UO*w2RJBpVg1q_3pAS+bVGgauZWXiH~LnI%!)t@t#*hR$a&s)#%%mNCmDX-T4Gry&<{&}YfpA_b-V7aI9oep)jUw^%aQg5 z9$h|^`T^X&>TD?6;<;`_vb$wQk~qi^vHz;|4# z>JH56*yaW+6ti9Z0_EEe(kyoNYOVYA+9A8fkQU!fgUu4AlL89wXE zv$n!|CfeGAipN)zUtLX`Ozqs*O4on1{j&xdZU{X(q09D8596Ky-zGTR6K$w~Sy{%e zP27>a%1mtv)xrdA)(ky!Y2Y4g-R?EkAvd*x#%}Kp6^L@k)+|ccb+U@rw_l~MheNz) z5moKjXd2rdiHeJC;zL)nmW}jdUu@}e0T2xI5Wfx32L$?=M;YdbzGiYy-f_dVK8MP| z1h5PuNnLx2D~ueyEpf3fxaGh(c@ic+EHOkCS#b*5fb!=jFak3 z>-NAaPsm3i?qBAKg7b+N)5li#JLPe3pf z=Uz;d0x?fj6_@d7OtV7NG*SiK-R!NG+m`EuR^1FwsY?=0*cXM=-GyDsYxW~ESLXV4 zKP%rsY7tl+pV(?onhP6v$_j-5yol}I_r?7!5$0n&?l^^8`0aV%feZa~)iP3&bWT#@;a09w}lj8zEItZXYP1^6|-_0x6` zH%MTC@*)m1&F#R_&sYJsJ58gR3hO=SEkCF#AD{VVxha=G0AyHX6~iR@BG6FxQqJ>J+sD| zEZf4qpE>`n%%k4pp^}EQhDs-5Gg}`BA4^Xz$H_T(ab;tWsu`Ng^F9Yg_MXj?4j*?9 zs)^u&kob$R%RWSrMP@VF({Pd#*h6q_;o{2J7Dr%B?&`WJD9O3hFu5%HC4L*-&r)9w z$)~C-&sWL1xfKUalCmFBD)e|>3vboEFyuq{1T=N@xz{CFwF3@b#)^T5j4FMGLI<+l zn(nKHSsx`kcDvUz>vJLfJF3x8h6>q@ck zXPFJ952)-@QP(J}*5XzF1r_MSu!7FzT;)mtTkd1F5OT&qLu97^8sjV(|H1g44%~R& zo`6a75JHDStZ$@#v38H0wXqFL!GzPr)Yf4!gIbtN zHKwhxUBTJ@*rC8GCScWEa)HBpw{KWuz0QW2t9biJZpBDLirgaxIPKYqOVSly%Yi6uPs{==| zOLr?aI+R;T-}KOMI8WjEg?R?bu8(Tkt_tE2HHs=fi?-pPaM0BL$LHI{OBy?Gl*1{& zwd52tK?K+_w-rIK{BVocq}{QOS8bxkId1X8jHT4nE`+>X%a%fw&v=497h5-WvK-b? z2p2U1YPuuB%rj3&f(NqYB-Bds)m1Q!Ug9fyei||3A;$0hAD(BcE^hnRp2R0-4ujd& zt*?|6K;rb0YVCRw)2A&k%q6H-s}yJXj6dzi#Q(z3UPJ)(tVDADli0lHQ<7RWMuoaz zLC}Y`Cm)n?*P**vEg`8!sMlQJd%-9$t&--4E0qr7jM#Z-z*X1A%j*S4l=UNZAjgxG z$mSi~J=3@SA3tg(_|%d6nJT&}q$U>3D3+Trc#U_295Q+ZI)PYUe&5PENGxcCJ2r(B zga|m^AMfkhoaXvfAm?$=9P1lNICV;Yq*q(+=y2EP^^jkFo<i?8(*v?*nAxMzYt-_hF2qKYb7XiEC zVf-=zSx6PK4kL$9J@D*1SjFVW;urdo?k2UX73n{Uo}zb?*Q0fb2#igJ#&v{Y)NMa~68vUZkj>e=xUc;TIjJMv2$nIU&7w@0qQ~_tIwZGjlq?~=3WvllvqI2Zh z+5)qRY*LH*kVnh#8-LSkf0w7D78%&*8bFc0E0A|tP~ltcORHcFF^Ml)U_R6Kl%0j% z-Rq~|ELS72fsav&R_p7xBEib>q>%6$`>F=zBQ#aV;Yus77F+O?h;E4`-f8gSci7hw zA?=U}P|oCX)o$3`yTjzO#%Bc%?%MXO?QxxibO^4l%`0aI>ang54f^r{T?FNY5G%x_yko9%0KN>kV=lN|vGv<5uO|MB_PzWU~XLk=men=cojK@wy^~B!?8$Tr% z`cmX?t#c9s5NatI-#XwsR1XO^uTJY<)4zm#NW=$GzOmJ|EC#_XW*;*|#vRW3347X2 zlvVDK^3NRlRAeA_CCmJcChvaW&*y1a&)6Fv&6= zlslMzV9xXoa@=&1&9h7Up|=Ss`_=gCGTbv0p^;fgS#+swYHYIPasxz95ke629AJPd z+YLe=@I?EGW=@pZ&W*W3t(RWmg+l$U`%6>$%Cb#{`@yDy%p~Ow-%Xn=l}V+l60vK7asOd zSnpW@%kv3ii}aVl>h_10?{+e(`4#-;Z))NJT4_RUVP*Ziqqr!+Y7#7Ica7S2SjIID ztb=<4ZbLd7){zMW9M>cj1%O%(fIH1ZLEe z0X2)QC1tZ55L#=4Mwv9zfTSNtiC&F#yweXMZD-M9JcR%jL@e!k@h6>1oC?#yBb347 zW7KR%cE%wMA>b|-1m1}eO!P6+9a$T)7fY>PxNR%wkE$?VXJqV8#G^C>r_w>CA^?M_ z-e9rQ$kO-7$M$0~HFxI1vjByxbHkYj)QsFMA-*W1yIEv0SDh7}W$rJsH34M@wAIG) zWhai+%wdQy>HP^U1$;X} zCu$!T^~3v?o#*5hVDt;FI9u0P?-OfzmhkM$yqOsnErPaGhT&SCh&Nut9kW&Kjy)IZ z#n2rlVykte(EgZ>P3ljAq_@kLGPqn1>_YOtf;Z2(Gc60!yB**h0Kx}UU`CY~Sr8(R#-GppbQgKzqbAUm$cr}AH9*?4KOrSoSX*Jka{*LA#{9K|4BvH9}lULbULrX zHZR=n>;A$MI@l&LjOkA%3(rCpw}WO*YhMgG;uqrhsqBn0LnK_B@ixQxvS+a_mud>M zGy>NTWr>!|YUv@CPTqtNjq_+uUPCx8_(OD8hL4X!y`Ah^(O>4$lHh434L(_N zqv%U~o}+Y$%k4c}yA}N~fskZS43A2kqLqXHi^1e&;<-ooddv+%G>kheam;^v>5Ye3 zU8Eq`o#!522@XoHa=gq1`KQXbvi_P}(6^<`Hk110)T5YJ@WQmMF^3-L?yyoZg+M!a zuiIv!*y?ka&?4EzeE^OV3+lVGyz3{6sChhFM0XW@@tkh)eSx9CS*?QzG&GQvhDGw; z;`^SYRWbaBcOj>!F8x-J^LKZEVW*kB^^xb{@NCwu!f5+A)2E7k_X>kj&r~mmk=vzL z_e%8e!`Ys0)9{h2S?l(kYW^dlFS7Pm9`adizY1N{9HXo`s3@qhkGFbd?vRO4xc>TX zA*R5c<>s|h^!_vPCCJ@-23LXhUYloQfOGf0;>iJ0+ym-1tiX40KE-ML?R7RSrn&Lf zp4J>PvVd~+5xev{`3~aMFYhN0)p(P>_FQgYjF-0shD^539OVfftT3O#I^a5=r_|7u zX_kmNuOwU`5pMn-+hg9Vl;(xQHneALv4fHHpG6bc7AspOpovR0c54BE1f~O3G`32^x zhP5i{{sqt#Xv|54+!OHSG;!}%^K4Mu$U><940Wo~|^h54*t(lF(?g}xRmq`J^{ z?*vSROGaxY(!WT_(Ef(U)(*~Z$bxIWiht1vH(Tx9!`i6<9OA=Q=KCl!@pj6h=&^pL zo~MjS1+PV=ZQrSf7u0m*qz1==1jHyRXngfgW~ zSi#7<_4p+HVHi8WQ@M^<2xiB$DolYTc#9ztIAvA19ylf6;%k`T|V zTwDD*cU=^#-WRE`qS#8QzN-y=nU9x?lB9xfZb_Qd&Fe3ZW8HPw%d(oh&x)`}+(LDE z2fRxWJhCYTSUko$IfWy4t!M*#A5R5>)FZ_#Px=?d>>NVc@AqWl#$oOqIT%heLqXcC zAn~?h<730&7Wwg?t!kQf;>oU?x`cNR*W>2)Ug=rZy}g-v%INX`SlTq8`R4Mn|A+-_ znu|>19od6^ii?`qMp8|*y0#Rf!f=uA z_Vc3TAl5q~*l|Ycid1ut8btnct9#_<_q&!t>M-wbNqa557`mhg8#*j~mJF|bcIhhJ z&V?5r6_sspFB&p3$|ivs4L;LlGR+|XYT;(O5s|UuicADUqXswu4(Fq}ijk87huNoj zV4^5y@WWU1!t9GVI+_N&<9GHezO7~f{GJ`$$wgVBRbXG0oJfh~Ig3(H;4+qqIus>G zCY{U2sdha-mY=b{T*>mC@y~v*8lGd!wH})FBCFbZePO{;y1ye$Ov=6t`j zBq>G#$7@l4Xl0*H`3v+bnU}-Poim4WM)sw(f5Q%SIJ3P7Zx`O96ku6Np4@Th`@{!* zoFb51SOQgfM)xbXr+HCyhGi|kq`!&gMXnNFj9W-m(P!;lkc2OsTjX0WK*^h3p0g1i zsh?$8cmVy~gbRBM&=BsVWF&FWNE5AdCa#LDx@-dxiPH)KyS}9E?Uu}u--QqtfxGY( zXU(!XO?*o1ruYT0oMWfa0-Rh$Kf{xQ=26&qBvpJ7wfu%`l=jz>%f>UtEfMvti^6

{135S=&63=S{ZFT`h8Cb@q{uC*uoDye zqWsI`Mk?}K0p=xQh(Uy4xiiOO0RTo~PEQn1r$aJ+B>$nmT;~B=Wum53(Mm37vjc0R zmgZygfl00IxSVrkv@#?|r>zR7&h1C*s*nCvm=ZfJ@s7#MXHHjQOX^r_rw~2U6zoU$^gK7W6kjhCx4jS|Cz`SL)0$=<36gM!_kigQi_qmh7f(wsD zZv|EI-#6c0=%G7gcTr(~c1HYL1Mf->3Mm%M0{u z1p#&0KKb8&;cI(zX42fZfvyFKEPM3SvhiQ+l=r;xGdU_ORXHF5IEwtjuMFfDQ-MYY z@SiO&(Ax{Yt?jfx+y_Jn3^_F`z;ZwQf8oML zNW1Ir?*jP$g1rAPWqgn4XslyAtslpU_k36Qn5A5I86_%1qINchKfnflTlXDpAi8)o zUSkaN;@CVTT%0D`Vm6=I0mN6Q*%{~+^5D0Mt%AlMpjT>7i6y@nBVX zLK1Y}#=jEM#5^E1+4L*;8S}cX3Gv;#~C1 zsTqKI>Yp~X#S36i`z^d*&xJjs@jIDoI?I3Fz4$HHuXkSx0F8@xd$H+%SzP>A;3!as z1UB9LeQ*PhqcsAS;*MdF{F^gYa>^Myz_&VxnniAG3jIjUY|3_P`#mcyk}i2zawVh^p9SBZT3MFu$? z%V&VXAsMY$nKIpuNg|1)(i~Wu;0l4udAP=uCdwLV7hB||?_t_cdKaVMiNHXb;6$xm zf}RmHekFw;IQp&Tn^|jWy)AB~lAat8-n!sjBV8u!f}+7$9X#W<(sx35CHbvb81@k8 zLfv0e@nHtQDOd0+E-UHQX)qD<{Xom8=${_c_@rcsq)NXR7@Aw2JSJM6S$;J4=s>Ud z`Yo&iD0Vtz=^qm;HbB~cJK5SqzPrM^GKE*xH@=h(Aq#cyb(uImkAJ*14%e!iVH9X^ zHrOf`F|NILN{Z;SYVF&a+`0A6aJP53cs2i&$w7#HWc97VzRIArCQO9znJwf1>OG5} zt?H>Bx*X)sbgsferW;myfzr%79$>xTx9R&{bI~DEFJ)B~`Xhz!(!fSwS`0fxM_WFw z1)ePgZh-AAi0l(csF%#)O+?6?-Lb!r`uWTKIooBJz|-u~+Y@>om}$!Snn<%A?o{(@ z^@7a5P8>Cxu#0!mBwC5N$YK4D90M2}Fjq@5oquIK2s^g!u}8w9V$bIbRew zxV@H1+mSKUokgxwetg;X%iRmg*6byU=?Q)};6s2vrtulabMrf}L{swTy_rpy*3m06qpkEW`A<6&IS7(Cc}H2(c|)C?uW-MT5t-8DmV{u`H>l6bD(|p@21D z{ybgoi@IHqm`Fug=hnYa`voBN>+E#Rr5&O-hC9U!aV=kJSEp>4xIfb3mfCBSn$&w2 z%ca%sGIbrSlf`i%HQ2hu4m9Vg{_^p2GytfXZnp{O+Xr8_IFQ3w>_Qe1Nl0w!W@$>V zCeYkb$dGv6c2TZX`8ZR!X0QD~FykiAo>HvA zZNQ+~{G@X!ek@!PxlPY>FzIIk3(of)-D=Uob_L^W>UYcT@r$35Z$>T-1ijYi0#{jN zEa(9o_?}eW)J$+IWD@QPE0>ySjlKp_2S{s+0+sz&*_MZl+~74nUy3~7EXMzypkV+f z&u7C<8Xh1fRh()BUgY}W#aEFY=BT<+y32&nX+Lyo8U{N3Nxt1}E?zQ&&OLjTOUglI zs?BBxkR_7CjT|W6n|R#Xs0HsP4LPXy^&Q-+@UBYg$&X}$h-S*xJENkcvI2VF02nha zL)`mmaejksM~DEjoyXoB3AisJv{m^Wj~s-~9=oNps1iBKajoJN3CZZxjx_RpfxY zTg&+RfT2pSJJ2y3+-3w&&+LCrr56LT_{}^`!&)tkXl1V)ypTq~?up;{l|CuST`1VI zzu&!D%xEkJAP#1C&PK$gEit@ZA~_M7<}JK+$3;Xl>-caLoF)%`15AQt zLmUgNa<^?3ad||lxk@T~BUBq@^!;KpPRU;$Sf$%XC+-4#oFL!}CCKDP0i62U{MENh zqF&GHCNQzs)dG3^QJhK!uZlnec;q$@<1KS<>w>atUH{k~7^-678K7y}w+@gWol-(B zr=)(5*Xg7Dq?88ro6i~S5@D*831yZ4xJ`^t+4t0j{abU<8UsNn49xmKC++<^U^Gg0 z#cG{=Z*|$p_=j7Z!aRdoD+tnv_5)gsf^`aJK=*n!j(lf>X|w-D(~}Q}c$-h}?fXo! z(W#b@4iORK2&wz4Lp83|*Rx$GuT+fBtqY;+{l@`rqRIC42EFgw>;;u?IhgX_k#DZkBvx!%tCG9m{bUZvZ}K?ff{z=L zX9-E=X=33vy=Klvv7YMwY3T{rZ9@`*v&UK7K|OJ3CxMj!et|ApbvAibWqzb@oK;QE z-2ZZ?YSS%IDy)t-aO4I7S8p0JcGW~k6WUiv#URpH$-kQSrDl#-uu#FO{%aLmN@1uY z8bB~##U9|0ahmhrsODfb^CQ*4)e}q^J%@}&Eo``YS6^6I%|t}&_Ct+ z4bIc|=z&hyh!OfT^g-=TQi;b0QilE5nx!&K5TaRkp;X{bBnK5}Ipb=e>2^iKL_DO$ zzs<0rcVRRap%Sz35a;#dlX{@xoiPNod3e`-u5--$x$>2-Ah(5j&pnLCIE3X+q!?9- z*S8$lib!Qx*NAF>IHVwfAW-@LEIgjBDUc!tgQB}^wWIH@2| zx@A9S_p6qM^1Bc3`jlEWJuO?X!i7JmFdo2g?3B?Ykp{%Q>3_P-l&{vLrOoM^RZB_r z9cMfXty8QfpH#GTAsH3n#`iPf$!jL}3hu2V3oOPJwzsD6*$WnY(o%$9wMqO%Am!BW~AaJuiRSNKRFg*Yw$Q!O2d!dXm z7j>)W-*bux$e?I9i|(V7FRaNvbhXsK855qO9C@-?mZ^VPp#3(H*ek}Y!T#lHQQoMG zg8U%v+a3f%l`3vamyt>DAD=(y)tE1bMvms*U+nV_`2M8C9QI}@erP?%Z&Dl+Cx3&= zkLF({dVDUh!t()hZ+-TOWy%O2l*jOz6byZA$6-&`+?QS`SL@wGhlR@<51r?lF6c|$ zZ|8Hbv#Lj2;ai&FIenNKIfJp(9?4*QryJR$FJaU(L3_$g=xp+W&C&6|nfC?WSvUWk z_1(G-lzk$;PXq3lD@A%YfLwdyIb0VHy$&?@{2BF*2m5Bg^LnZIb}HAzW3=N%^8+(% z8rzogF34Z@-7qCIv>tvO$rJz9qR#Zr0R@efCz#wV@T?QD{S^n*&JykEP`rF1`Bik7 zScYojXJ2qhFn{RyYVke);Y%&THEr%d(gg0MUaGc_T{AiI2obmA({ZfbyWhj|aDkA_ zs+fS&q;72TL?;83&(xF)icl73Xz#O2;RVYUut1*Pi#}CdTIoFAObv;1jc?+$2zLl5 z{>7-{5H`_nImQr@gVr~LEE`?3pd;0|&iPBga7K0@V~hZ!Q)WTbR?nrFB$Xf6ChAPX zUrJCL*4kpra5xJ-YQtb;6T+iau1UDAytp{!+Hzmxdo+Ij160dq@>xP{NXK4w(c_~4 zIUb(}2uc=`qC;HbTMoqI%zo{%SoiN27kBbH_7!>}7C?3WW*b z?b;MJ@RhK-s#CfG!E^9NXQbAV!OlLe$QJ2aAZR>f=NyRJfPK|D+0M4q4`>|qH>fNz zy`Q~4Y63rb9C5ghb}2b!%H=#g7Ct@8lxQjH)jvA_NHhmdjCarSUaPV{LcR6FSOHB( zV1677siQ4ejxH?sRgrC4b-4GxG#xwY@WX;81wb-6lb4NQ8!N9XZ?Q0Gz}dGyiU-)z z%RYMr0;%PV!1pBapVB_r`qEbqvX{aC4|{JJR#o?YjS7MasE7!Nq#)9ubc0HFH*Ap3 zO?O%#-5t{1v1w2gq@_Eg8)?|onHzk5Kc4sfcCPDO=X%fifANFtwbop7&A9Jzk1?kC zL4?xI2=4B4_i!7LdV;zd!WD*wBeEPoVT{^&;&idwBPKyidzIik zD+Oyj*);Deab**5o|s|RJNwfM{j~3OI2AA&wL6rnJ<6nUdPculX+9hYB(vMD60<5l zBeuJCly*kHQDhQ^(tt?qE%<0VZ>w!SZx@?OXGteA6$$He#+vVYY;s%uoZV}yW29e8 zQ9eJ~g-V11vHs^EI^n-Oe>H#vge^$79B|p4P8++)yGO!@mw^R>Mo^jK1rq)_JU*&U zfL4JofdaApjZQ2F#nZ3BAGo|JSdFSn_Bd8Tq#6{Azx=wjrvSm!BYvC(x*m z=>Zx$xg1Qtv@4W1exSA?>f=g=N^9HDw1esnash(P+UQj&U+wjVSY&RRa>=*b^R{&h z=cwmR@AEPd4=#jeDvO;Y*I!;)1A6N} zSO;iIVcBUKYbdfqa;3OX2#ndR#G~skQD&D@)@V}P5 zZ&LP6y81r(!&ZdOS!8$~q+6NN(>dQ|a>%BEYLL=tOD0qRz^4S*oAp#gHHSDvWFzr=ujKeG`;Js@i61km zpwi`rpPcFPG+{nA+@NZ-?qF-I6S&>WM?+F~oV%PrupKoZOG#c%xvSw#RC^!_d^FaD zxeV*S^n0FVz=! zU5^)rOhrH(9X~6_XbXGEq?TM5e2aIBQ8&O6XHVchLHG~l=}z~ZO@h>$tm)5K0Rq#R z%tt*>clh7E{ec=q7_V4Y4&AN>9NrBJee%#bNS7I?{v#Zsdd}Od@@djv|x(~ zGCH^4WotbxZ#CW<))Y?Y8p&iSlrE@phJ*^Yer6fJqSlgo6VfA+q6%Y{l zJp1SsL}ks^6uDfv7h!eB9j0e$XL!*fu!N~)8%<%C#g1Q9{LQ4 zsE|IDs288^F;I<}Q&x!eY;Uv=mO?LH0TZrbgc}|f70!z|iG{KX_EW)?C8s^A!FYz<){qq;N8ck7g{wvS$l88W^1M;xaf@Pso0`g*Jh-ElIr(lfiD-sSw0s*8B1ovkkq+-?EHiik<~l;=F*rK9Np9?5WgHb zmUode(LKs24;4V5jtJ_6NfXh(@2QcuEUp}nMNVzQO>W`NK`64Wp-4B7i~!PWglF?F ze6t0FD=!<65{R#Z=m{WNO3?cGUt0q}y?qRHl;4kTS-D&Ts~%Y4lB!xeJjJ_y@mmA} zKS$8Ca{W0?Y5 zjusr&|7+|6o`dxWl&nY@e1xx1(93UprNo{H;{Dfi-ht;}eP8%>{Ut+ez)MDqmr!1R zj-V`f&bunYC)WpzJVH-v!+r2C#qu2x6bU|vesc{k1#ViX-7?38>z{!eoAO^{S{AhX|Fs`VqT`GE zZfw(pv}KPxnCovjn)e+RmuEzIU`5~by`V6M%2zlbgfCGAx}V?29~e+Er6a7 zlmsK}Z8_m%ApI|EI!kmB57dY|;sXhxgiDZjQ9vjm1&u3Tq6=^Q-f#!%WnBl z98TF7AQ~u$lG$^vnLB7k$A7kCCK%N7>gx0SLH}j+gZAsC9~T&|8{Cc(fDG4B9?W-7 zJt*+%Yo$ltfGYQihs_~|su<0mC5Wd4aI{EQ?9w2-8Ch8nCsrYj6SlW{rJeUyMF)Km z1yA5MK|y$~HCj&5j5}_G617meR_5CXm5|A&8b76$&-T*qjCnaYoVy!lKHeZP1RWy- zwuJ|sGGUa%1^`t;s?HP_YKx#&$nE)U=jDEa*$zxX+c&2V+q~cSP#7JUhw(#*t1E?- z+5m5^pFytc1X#!|07t_%#zxC1bG0(j99juc`?;^jz@pGbD_C{3rcfsawI6)0O(MvsRa5!ui13I;e1zTj2o+s05(!iV6 zBAARC1Zyfi1!^2!Mx0_A269Ay)%67G9g=W~51rO&1K-sJRplOQvqZCnwr(OsaX-i) zfk~s%^L2yjDZu#h9b3dVo+$CGVMNh|M?;dSfV#)FjxDjXVqiXO7iq47d5 zOpy-K!VHlBy21cb%PeR-!#u(cYpO8N&eE|F5%?IyJ5z*JF768IafUUDWa(xCO;=#u z_6~-8o$+sDP2#0Xv_&)vA(PHxPwJ3PY+5WB&yY{7O_y5}(FaV}Ak5tZg)37Yq3wPqL~ZqEWNfa3Fs%RSB4&ab5uD7wLJq+s~N(H(?Zt->4D;$?WqdJWl*s zfv`uw9!#E#pH;xp0{*3wc}f)p{o5Xr!{{Nu)9P@Yg%PKHJ7-AWS$!+)HjTOnZ?f|V ziRbx(%6{WHpDDF%3&$dW4u8@g^2`8qwi{>^LxDZvqb$9Z1LKiZ=hVp5ZPz_*iO9T; zwpL-;TAf9GWE@8H>C55#&zdEz?9I8`7-7oJ9+k{)j=uJA|7-O)^G$<+qqe7qt`^_8 z<*x*Fb?hFy_yFjj;)(@5n9?ZF%A_N|);qv{llc=6?BSxlaTbZW{{|16mc zvw<>^CLO_^LeFDH%@>Ujp|=KWDxoaxzAamFc`iUmxwA5`UFvo&X<}tI$&$2g%>7;Wv1R>s5;uNFpskS2)XAskMI{Fps3ugao(#aBka$E(2egm9 zVOv_UT)WsSeM`<;xm( z#DmV_j3)dRe(w>lDQktZZqh__#;ZV1l&cN?H=6znzvO$x{+1FlXgdNjF#m2t`6TDA3ZF(3l`4Af}- zCD`@%bu~_c7I#h>&Z6A8`RtMdo}A`W^fbs9pH=|pHoi$M7snMHMnkot{y%(b@QrHH z_PP?K{!e`?zm;tawo^+1%0ND%PK`aC$bb=OC_Wb58lP&Rv7afN^rhSN{Qe;<& zPAUp#M1j+K9FYU}52j<_I3~qMz8K#|4aO;j4w!8$p2 z=ao@yT(%7bCfBLg5=n(TCw-!g0$^#{5V{#8;O)1WMKqy8A7@ZENR^V;knS$c7q|Nn zI=S)9E32mcL+E?Ln>f6mf~?q1CarDSDDX7ybAoyW@0k%@ES9Fpbmm7%rgv4Vz~110 zsaW8EibVkjn23^jHJLjcT%D6w805vz3Acc^&%m}dvk1#I*n<@`ZvVWy^4RtkjhDbG z0B+=$TBlY-btcktqVfhC$1pdC`v;4^1G(Q%#tKHM6Jr!kCkU+%?|#?}W)zKe!a*@A#q z_e0)m+J$bP({Tc^*IPpG;rLS`CCYqHK-WxC0VbH1-RRZ%3(#z($(OR6rk##E&2jco zdWuDwUzK(lJEU90fu4N6Za4p;yb=8u=VSvE;W#+OQ@uWlG@K~B$z?!5NIKJMaz|l3B`x3EAD~%?prz%n(7{J^kYhrfK_eCj*z}BK@8$SDENJ?um>hs=K zuLUpF6+=xR9YjxL^qt$`uXU!8%mC{Dx87iDWBPVMg-Ss9W!i2vClQ-rj$^o8M3JDV z<#g_H1!64K2w#q+z?l*|(IJ84J4sP*$Y<0^e{C^i`CvP^_k#Ic0B+u=9x+Fe=+(XI z@h8Oo{9#sXuY&DwpP*BSt0NMl&_0{h>8sZ(_r}a$(F*)tVH=M|6YuaE`xNd8- zDEUDrqx`JtDU0eT^rdPWJ`;|$dQe+ise!mUY}?Nwm1ly31ba|r_3wUE0EW5=PP$tk zMt1bp$Eh(8h`qgdf$M@1^O~17{0!3bYf0EfBY~AR?XKZs=a5BM*HGZ@%d~{sdzT3? z=`m`|J-Xx87;?!pfuVdgcSe35n|b3enHJ-YC_~sKAb3kEHf6(CpkS{mmsYKb{P4?2 z5naT2w?49l$t6j@%znuSF6)J#2YL zalCHDen;?-!P`O^*%VD(cdgFBHoaqp|nTPSaSIlj9;)= zXiPrd{fZL%VugE}<;TgpBn7#BpDFc9Xa9N~p~>gv?yU?8(dc+II%Coqf%@h4a5u?} z-RAa^T$3MbTGQgdZ&Kzv8bSWRE8;DT7u{1N6$ zEN?2PsM{FxgcK6nY@J#`4e_Rq|D#GdZM8E9hU+>r1-Jc7MIsNIQakir5TZUm#%77xn zC;2^$#%lCOg`^rHrGW;X{ffYa>a7NFW-{`uinrejd~(Z=wQ4@KsYd;HAEvZ3c-Sv# zqRa-r|M+3l#t;F4Pez8y>t&qunVGH}K8pAPf~7PCz0ls(v!f2ER3i+(;9_q$?#7&X z*JsT;=?D)Xm+XGSPuNxGai4Ud`6MiM_-hPBPe9G$orD2 zTVIn|zCf$ek=NWB)0b)iP=6%n?^OmAb|%v`&c^aJmOfKlc<^^`D7m7|D=ia(r2}r- zU!gr;0FNw{R`@&uXSsL5vOn?xYVT6Ua7G8YjDHP1-Pq1PCV$%-86N1ER-w7cij$Fq zLfn|s!e~+$h5xZ!sdmpH9;?#w?`Dy2J15u!yYzTk{gSwJYKt;E?zuBd-maT085xJd z%iIvYSPr#;_1DsjZH8+t$IE*$vVR@fwoy8#{bm;o`H`vVz8DTXVYl;QF|iL`A$DL* zT&epZkzrq!DW7G?nxj?`wmu5$IYMrb9w>mMs3;CVe(<{*WzTnob4%{dst;yd*w)X7 zW( zA1X1{2^e;1JX+3+bNT|ukrG0+sc<+PRv0BalsVfMVO2?Ms@+(=$EBvLJeE?Lm zX8~b;@~^(gHN%-!_wh11(t3R3$VM8o$14VcBMs)w7)61FVVdE_RQ3B)12^w2?q8>0 zPUH3on)_0fQj_G4_4nfCXD8nFmZodeFcH2yNGm=VhE6;b9WS-0ji6Q{D^ARgyj*-F zBY5{u8=G3XGz?<5FZ}9T1{PcoH=@&8Y@x?Hi@5un3Gx(RW|kb;H`u4{1 zW^tV>jo5RXz8<%1=(z{dQhEO9B1w3~i^06u6-};Pjn*Bly+$7p+m^Iy-B@=7|C6ny zT5Xs}{?*U)#bvLi-B*0LDcc`5T(^_i6q-Zp`BkFv)f@epUvl2*vp@WPmf}yNRFW5D zj}t;X*NBd-;dG;Lk#$FwoNF~6SoY;d;f%sdln-=|17FcD2 zFA7oeNcsAnJ;K6xMk+V?A;zfz$w2Nh6wBz^Rir$-?(n*PnQBx$a#XVoG)q2}AXn2BWAher)K)=a!=dT zvrXX+Mw4TA6&Pt$fqTY6vjR-PLXC@=t`Xkh9hV%JO{Tkct7(Tfe3oTtc~fwlV{8;fC8@o& zkcym`ALdPQM3+`G@F-g`r4B10!f|hA(zv6|a3Fa(?9QjA?fm>>YH*aIc<|;7yoLR2kHF-Pn(7-;HYff?|wLM!yR)eKp zdKDrs(oV1@5mgj6x{KF#gckm+s@{OsBie<%d`F8_dY*)T$a3V_FbfoFqj)9{bFr`6 zWt+aZnM=^KeP+8F0VTu28Ie3%?*_!C!K6_qCSJOC4LXPdIp}1xZ*WoJ^E# zO~r@=A2y$in7=1~IZ1f_st`u{smTl)3z^R~JchqrFOC5dPI~g3!@Oy?VWsDN-o;9E zb;CIS`~LiV{*jzSH{A&?9BNs)1=s)pf!wi|Yo2X`1q>iC=ns)_}K zc$p8*vbKcpDJnYK+gnXxCV#HUpm$o~chc`PvU;~$3gGp&r=Z3`IQLWT5+QUF&}q)3 zZ&)gRSKC*ir$Mb)EMO%+V9)BlbyN8Km%-Y>NSW`)MMgs&_QTSbB_egB-v>5i8Tl+4 zkpWp;A*xX_uu%L~48=?gwSEZ~}m zfN^a#IcX3@AaA<|vXDJ)7<8_d%u0JD%;sQpG~GRKQJt3>QYoo=4#15M89&6GN?YAi zwFS%!t2hgHA4oHkFr?#uf#pT9mtO3-% z_S5Hu?H?G-*v#)r^^GYrJE1b-C3q%1q6^{YXzO#?SXKJA(-qgqK^KSu-a;BFlR>)M zdLjF=w8ukdHTxY+4QA~Rt)$(5I54=z_LFfJx7~%DzCc24?tpnRBYit4?Uz9pT*~H6 z+Aqbm@eY-Omj=qP@An9~+9M3@$t9xbGROOd@cW;Z0Z_&iQR!&mu#LC`7FV8qvDA?7 zfzoM~YAP3KEn&zHNT3Zi&q~u7h_BqHT@{xM{e~*VXrW2Klu;rL!Nl*`%)Y(;K6*M} zCS!Q_?0vX-(bmO@*GB0h!5iKI6kxoSwD?b5hK>3UybC-}si6(L%2ULL)*~2Li98>e zGW^DK8x*%~rM|X*>e8?nOhex|S%Z!n6g-;PvN}_S3lM`^6cC2~ATmDF`KVh_1+~TjUQPUV#zc?q@t~VXqH(<4_FRdkHx3smj;k539 zf4C`q@V*91pvf8OB5aTUgU7C^MvVf7HzTnqlBqWCk%cFKV z+Y&r>-+;3a?IyXOm`6_6b@7};cRy-QxwqI6PRSxR5TFM#6f@PDL=>EflK-tk8Sc<& zY}b~rAIXm3MAlT89W~@b9F@+pp%I6UTTNfzoDViFt@IBSMXgWP^2>Iwwgc{?zKm!! z@{_GMXcm;74S#eDmNt29exokDE-OV0t?!76Xj`-NRXsHyV~^ytl91D8K=F(F+TzYo zlSc!dV4Q>C=m?De)EP5SRmfp$u(9-^i;|Fifp`YGoXcZ=wXP|p2`5PB0TK7j*l0Qk zzN!%_m?OnBO|HuM;-Q#VRo2JIs|Bmcp1bd=7c)Y!&rmJRW)abJG9!=L?P~u2`7FKGr&(*&vZJ~ime8j%-Ys7dm-(&YQ^2uRn^FKo; z?F3h!ZW~L)%2NnV9^llS0w&w{nkU!^D)rpy&F_On+|=fK(_COO_XwD^8APH}ojEWaCa_3`!<6AjVhqf&nUVxHH5aLE_(A$r z<6usy#85{%`*k2!SG5E#mNq-w#NK)1<5XYe0=;sX*+M^&Q9*kfphB2D zoQaKO*_H#faG+$2MOB{|Q3VN|XXhKu>XuV0_)IihbS{rESXCGm({pozA{04N_}*IE ztO@o)Wqkb43Kg~&kt#6r0=3582waOa#m{ed_I=1R6hGUh8K6n1SV*6_B_MWAAdY`H zR$=;FfscUJpd+HMu+TX4_0G^2kG_qm`(p+LxW&xf%4^R_08c>*6rL?SA}$O5qBhuNk#Uod!sSSu-=Iv>HwP z^T(@35AU`t7I=yt*mh&FDky)nF<7vf!*E-cR5V%D|M2bhed4e-g{+R2u5tatr1~&M zh&HtekA%(sLi8<5h`(&-_A~pBCh+y+7L85EHgKL+fRV#_W*HNAh6}(q_g{%{QHhF$L*`T zUfr=N9Bg_?gt%PSjs&;?{wv|;^>)sPfj5`AkCFJVmwboQeYqR|^Uog;W%^P2e3br= zs2_2UujosEU+(ITPV!)J2ycF!b-fv+;jgT?(BF?mi(}m178#ci)?SrxIYgu+sX1T4R;NArJA>Y zlbpZ3r~+zXn!1@-*Sq=`;1BoWkY7Jt;Z7CM5zK;}=wF>%2p&@S`1p$C@wY2+Kqslh zn4tXAABg|910TWe$IojAK-@qs1YvE}H%apAt^SK!f<*JbU)lto1sZ|w`fw{%;SQIL8h+!T+z>gR{9 z=;Bi5x`*z)hx1dPg~UP_r-CsOmvA8%fEe;FGjNC(t8@l?ZtCLcw)Vfj_rA-})EJKMc4OuI0$gMDTwl@K8oy$0@9*vKP>vk?Q1#=i zw7qVxC$eXv8lkwHsaUwqF*hq(B=`f9*ur_+gBh8NMF!~V6c0%p12`zpnMk<|}CfUrI; zcZmc34NOo7K@@2HAUgM7bFTqh?9MHIRp$H~;=M=Ay;*tI>wPf-*zYA!5wU+o5`b3z zL^mXty1U-61NxcI~&;yRxl={D#G!tWWT*PC6;C{X-%I_UrLPE;ez zkI%*Wlirl0WhU)fs)q=fk&$El6@NY&(Ltb30;C40Ri$C2Z+g71y~vCOcn@eWX8m6q zl)pa&3@e9aPOED#QU^|Rncdh8>G=pb!+qY{m)!Ed-xCHpp^let@BV*7Nbd-Q zq-`{1sp;Bi_yhcM{a~#=Q~#YSq#>o?ds1`n5prA`4O2jWvVCy$i~Cw@G^E8iP1$KVhEnef-V1w3+?WUv5hEci+;MRCu!rzdN!?{LzY~e zD#G_Lkn)hhR8;bF)5bPls<_`va@7+&&%SK(=)59rMldg$F?HLCZ@@e<)_)mw-rV}N zZw+A8PXbHv?Df(~%TpA^iJ>Z)-7)lyXAR0j79-Eh-1*}vBo;g6OWf3||Gcx2|9X_K zRqwY&NlrrPE<*Yq?a!9}ErJ&{1VGe7QHqgshjga232|yq+SG+06F8Xhu+nV9X04kY z_U(wNQUADI;0@kj_CwX4Y+74fx=@jmI;ve<`aq{UYiyQLP>)m2;w=Q;@TEaU48T&z zCIBBpq*M+V z3xTlK_Lcs-{u+xWCL&r$wP_vAh&rq9;CxTC3XKXKqeu{8q>|b2C9ZmWpM;OBK4}Xa zn{+|J$afZF0{QtVa(W?z%$y7i&{Iqn10TL)%miB6HvSgEr^rdTM}V7xrpUwlda=9y zbkVn1fWmAjf2T7|Yaw`{Our`%m1!;y)8O|2eu%E>Y}n6W!|y8BdK%?8<)l8JOqRzY;O4e?%IK|(5B6qC(d(l< zB@=;rr4Tuew){gOTP)qd6L}=-E$&>EvlVha! z1}lC_Hm66QeVvsE0t4}5T`j&ZV<_cki4sYoNIcFdip^$Sp<-te3_BJwv3wE$ zrWN)$byoha2W)c{VJN(Va~>u(T{zxcuT{VaV^3L&>Zn5q;lpr`_n(fYnt%6vK~6DX zZrFyx`Jg7_LWcO5t|!sd$$^o;BE;VXB4IXnMnb?2-QU`A$EAsZ5ZA!!?P_7~0eIO_ z&gj%EHa_Dpp(?X?oINEty_@1{a1x}|klZX1Bnm236_`S(&%gS^c{v?UIlhX&K))Kf zNJy-~?&a0h3Kl`GgveP!12~NMqnjOIXG)C>beY+9$R96OQ=i!P%7#T~XblWT@dfig zo8)#ZR@C44B$YZP_V85LiWXI4(&l{~Yj$!*({d&^7Xi|6kGE--$9B>dja1JPBs3*$ z8Z*6BLk>#g2_0$jRdF1M%q*=a3Q!T!@%(J--yW60d~@7%Ay;FQg_r;3MQaa*Srna( zQd#BB@bqm-=lASv4CiX#bP(c%c@4+r%5K&!NoeubU#dYq<7ZK;Ik)oho=giae3b@6 z6u&%;<{DfNHemA|CsD#DHdzo&?!g3|J^E&Sr~nH!zq7euL@{1(lML3~vj`|y0r zv9V<@9GsHF1l^Wb@P4916I(fYl~j z%#|On;uWK(9nOz-pLR=!!Xj$GdJ0j`Hxz@sBU%6 z_Mm*0GHVWE!}z^)>>u4$C)C&uipCi83bd=ovBI#*=#L5wA@5Lk;tzg|IW=79#Bv^X z-j!W7l?~4;3ZaQ)2-)q32+L?JUbDsO!{0)Wm=dzx6`6h2@uwzQd$cz_vKO_AL_@(rd zgdFB}BX8g^&1ounC3)P-C9Dm#>fU-_S^zhrx;Mmi8_|>=|o;6Y>X#+oD-qrsweJd-jZ=j{D zs16G^dvA3}O|c1!9*`*pZf^Q#NwE}~MkvI4FSzPOG>C9iN-5~%NP^St$d|gS?cV-WaEb5(6_~@lHfX1OX5ngfdG)l+3sjn1 zOzje>2p_-+oovX>vpnR52LS4ZeGVEX87hs#I6_+uLarSI2XH#ZMvwt5;PFXH4#mF8 zN%RSirHT5i$YvuYUC5Enw`U6Ot7q8Qlrk?fa#n&*_WY<*0O1omJ za4^=0YQPr%B=Gj;d+1@@3lke-EIAd9(#K`mYFbZN^BIRV<$5CAe;0MQ_r%3K)HAO$ zpMYl=nwOSlYs|ck{-x3U`jFD}L`~1ILbKXNJ-3^-GK$OWX*lStkCuX+JKxNjB^BiI zBv%iLWLobY)O%9Befsb!9zT+4g2RY^f)s)DflEh}OWPbd<^=W#)L;Sdoag(vSTo*M zm&)fG|1Ku$H|%E3P%2c_9$@)i1K1bXaM_DJ&fN@QC9|>@gSAza3(tF)EpKCJ1rhTS z$IbtAh{Rwl)+|ynr+4I#76xQG4lUoRlOMxA63NlpnB(l_7rQnk+o{rkPl8ykX3;<> zoAlrW%a`z5iE*DLiNsn0zHQeOFV&W9&MDHtBm?SeY*!C-kY*6o- z+dDR{AUSt4ZC`7J*FEd0JBs6{{&U>o-}95#aRPV5@G@(<;jN0i2z^mvQwl;Mjh7o91Y85%5D@>em(URg!F zVUcO>`kG~}MvIRmZc5>Ljz%M5iyzGWd6gz1JY+v&BOys4+52}S)h`}KgX6a~%c4d` z4>yA!A`xxgJjrc8G}x&3WQy2!F8e((HF^?YjFcCOCf;szFK{sjg} z3CHI<=}8C$L9@0;mBmTWhu0vkr_67Vda6L-0~q}e-~r;lsh|zPazcIU;+LFG)%O>@ zcn|`Z$0QDJcJ|?J=lMauAPSA?)cSB>vU^LgOKnLc2{{1<@(P2_f~J!5Ky^X4wVCbr ztP|Z{B$Nq|&sq=14}}SmLWpf&g#OW?fKI*0=^F3cvPbK9K(5#d=ah#AR7xiYhjs^hzY%G}c2^?Q)wYCMr=4=>=7YL!@yNTC z=Fact6h$|fWuI-0*yx)e)~TDsLJBG~rCb$~w~Gq%5%d?p;(x%7f`>0TQ|jOK zwS9Yza=xI1#FXdYreavLK4kS;Bsa%>7Ic7sig zaM01$KYU$8iW<)`m~~0m-V6Tmy-gu~Jly>(-n(a5dzs!nc^%6^=tamsu6X94t~DZ% zb_aPF(*I&TaR2?MpeW#`qtS9aQzn*Kx4$~XR!`sXCLTBQ%ycd`S{tKQ{9zO|mF~gm z4<_f;y)TbK{Y@1kfnX-Kug{j;=VgV(pHyv{<-M>=j=!no`H`)U-TJxy$e+8;3!Ezs zP@iJEhgTVwXdX!Z)KRIE!;n`eu@c8&Y(yZ|t~L1er#G|Qm|)A3OKt#?{XW`|U6Y`0 z1%u|vP@b8%MuSa79hX}GHT_r%#FHdMB+2=ux#P)DS94z<^HY(ZwVJOXR?C9ZicL|H z2$g{;;igNm%1A!saKbu%!t;KQ99o!@y&$%5Fo#WlX${kIw0qclo-2dz{eLl>8`V5nIyDo=|)l9yXTLTdg z(Doce+>#pibrGFv%r-(*{KeGiMD7H9ZBE-VW%k`9@`5Jy`*C;abXGCoHxDOF+T*7P zQnuWV^=I{0#!3(Gjqh(LhRL$2AHR3r{flF(b;lcZN_05zH8~snn+JoX@v&A-x0a8y1@hoC`C* zn@e3bgV8*3$wti+`A9CM1`L<%hf{AQ~$h+3EQK{kBDm_7?+*dgZC_KVjfs-#P5>UZdH+yO{oB+*overYpt0&3z7Bn*CgerRwpPryLez zZ!~kw*u4ISQ(rLUV2ge1G!XB-Ay_m}of%7~*1#ld5q;l6f5fZ7dn2GO?5Fj8E+6tx zbUJNH*gwGD9~kM)oKH?O+sodDoR1@H+wKu&eY9P5V{UyLDbxYorg-Ie^yapT3;G zbM0zTaU{c=692hn9aXXQuCiLCO~v};MKs9hAV9p%07N}eZq7SL+6OLT8&AT>MGihV zx}VQxv~ULuwf)ugWPGm{%1|C`mp?ycLW6dgegwt?VQRa$9pIpGw=IA9tz;VYsxRAx z*$?HnX4Mg-xI85UBQy+Q$NKqp^qWf{{ulO0rMu4n5Z(x+oOzxRsjASP-MSYFws6!w zKRjBp4nsHWk)ZNaZ96zzW9w&dzfs!||9Le4WNCx+S-WV ze0s93+a_D@&!4xR{QMv`{c*!T>PtgiPeN_ep+b?R#qsH+u6&iOxAACNW?mj!7dRnR zvs(2LYw%df9!$wb21cn5$WcstkxS291Li)fg?>z=(b<9FFrK6|`z-W}g&TZRnHI~c zESL|(OAamTk)DW*5)87f)6)gPA>g1HDfcakm|Ts8Zzuzh&7!ImhXMhLa)iP{0;o}Z zp0`d;T?`|cOzdn{d5c>K>G8ugS0{go19+S;A)$ExV~xa=t}8!kY@&863vALO;jVV zo#X6-bH9Ny2oQKr!rhV)B)I$Fq`ZY_ExI56xZ7GUN9&D}{}GLV%r%sd!|A8uqRL!* ztD}OEDE3?wRbIycewmb7MWl znraKYW9L~XIaqs!JLbR99vUz&z{XLmym$*sXo+rBSn2cpv zuE62%LtnnXVZSib<^eo4PLgBVwFhV9V|R`@6x9C+UoB*dH-0o;WVWbu0AZl`rsnTg zgFvab06?tI@VnY@o`Wwu<7FCFVJ7tezYFj(G9WFG@L^*z7np8x_=5-=)03=)giy7< z`lG|AJoZtioA0AA za8o8Ce+F$DlG;)~L^U+i^~ql{lJ{feqI%Yrau@(s7W_+^-`=9h6#%l6_)6fw54C1Rf68PjdN?my4#d0x+bo_jBUoR=5p zoH^$==X`(P<@5gj=Bl}NeLi*XexH4tm;iOOys>#k>TA1x@7L#dg89#tAfn&2 zOUb>yRy%XXRp0leo(LPKh@);vMQWxjC!%lVu>E0&-+?)>BtXjOQ9h%B_0UbZ56Asa zG@>u}X&#fCdS;RtgD8TgAZe3FDHFZb2itKEMNN0Jd0AK-ayVMaD||j%jPTtPy~6j) zR#GDBO{)a1XKfms0GeS3E^5XuElz0JM|h1ZvlVsGbim&)zv|f3+af`+!>_yltK&(^JBCs8MvNd`$fl}}5bEh{xE^iMU*JKwRG zKk5gwG3ZE;HkH73PP=wz>A1E%4k&B9GH@|@Mb9a0uzkzya04%9uS;EV<@6&JxqibS z_9+XH8B>9}j@Tz2(xuHPf-JzyT3dSgOHG97_V=pz+rBES%ta6nHZE6slgXk~7xL_! z^Y~f4g{l5MQcj*wz372t#(5^xr_@_z(dxE7MGrha{R1kzrk;CE>(B)X)z98tpm)-H z#k$0Wu!;~q2lr_ULIV83_@HtgME(lcO8l$)A)v`KG0XYw^`5H67KQlH`?KPEHE-k^_xg zR3}ZYT%K0<$&i-stV_cYbdt1MAQ`|896baIoMN^_1#NB!p zx{88gzUuJU%7+z`2R@3Xn10kiN%3BY_AO(|N@bx1$-uTTXMpO-`p!f(7g4-cmw;Ha@FPEa9bC zOP8a(1B4G0@Z~2j+mq2betmc}77;(*Hnr?e`FXSB#|NZ$4O5>!CvR>*%O@zT6cV`V z6NB{}=9aOI8Pl1V%pg`9gt6t4=+jx?F%oa{};DSEymfcuUx zV{--uDjXOnKD21G;dG6-*$uU@g`9&Rffn4GETFv@FkRhUDU$zLhP zSj%Fk)LhRPUIgYndJ{en_e*3gP4?0t*FIENH)9sLZ2ym;MwO9}E;a)3huyXTzR#3o zd=@?4@Bf7_`+$puk$_Qx6u$qBMnUz1z?`ZIN7t6657H=u_|-ls&}PVgWl$T6*|jUh zGjmk45XbjVpznvqU*22h`cgmBU)8)3Ese9T_)}6P@!{0uh#ylIaGgP?zH}`7diUNE zk8Ol7poq@Gm%Uer1u7klJ(D*J6K`;8RL5O?KUJNU$+O?_=q;NHhmYAO!euhnsFG<> zFVFFwKM*R3E!PgVAf=}zr5879xYS|Mqf1}rGha9Xzqi1a?)S2QI50gFUgus(eXC~b zF_Z7xP_GxDle}|8oBKmDa$&l{^hwyKOQU!10quudWW>UB)g-#=?Dw&e)+jBSf^|A6 zdu}UDl0x5X2dN*!&1jJ(m@} z^UYECI9v}bsTb>_HD30ILkb*wm#Pe}2aGx21NocrIC}o(tU0ZayQVIJtPT{aeVZI; ze*v2fN&tF*{(6+aT2hxT%-q0zAnUL}OhGpI??_Aq%2lw^AvPo%i=kf%*L5anENU(= z738aJ*Po|(JM@hmw6ton5N>UDT2oSi9fSBo0&{3>^kD|f%Ux!e+N}=4Os(_b%I0%K zP4I8QVrLqw2)D9J^xDP_i&A7&>sB6l)ZrS!>Qggt!7i63jns~Y7gBZc2anHY4Dag)-}m1;Hi6<$EV|zB(P@Lqd1gbj3_8 z6C4>c-YB!OtM-lFuOQ=m68?eR(@j|nce-!cZhhRgnJ1c218Zg+^!$oz!tsM^> zs%<>vM%^G-&KAaZlLul$ER0+jSQ^k)08%4vRnp9TjTL**aDmP~A-!1^R|k`duU1O} zcRbo@bju6J(Sa^sdQ4Ow%Ir_A4^2m>9G^u71i?%*Fg8>XC%|?6944$B@|AZQ6Q{qj zO9zbdY`E(ku8Z~R8`9p`jLu6Q`Cn%=B%Z}&rScLj7`u{`F}LojSHS`egJx?}96gTu z>%sYdgCG%jAOBu21K1r&zv26aNekxQqdTA&kscQ2h=O);zcu(;do;i-0iN-}+u@uH z5E-pL<5cHMjX(41+myzw?Hw3HMd%h?8xa=vz8I^*5bt+d!-fgi8RSa5M^RQWreV?9 z>B~Fy=;qxFA78)@3X?LYjY&qPH;ipt(_6f73!nki*O(Rh&5%PQT<6h_W@j%70|>T> z$qK}{Wj#{2*6$0jKzaR@Z}$h%GkU+t;l2;mIp$YHv!6+{mYU@M<%i86c} z+*d8ZI5=PUpA2GD!zFTQ7wT*8S^9va$O3HkU+WQ(ZRbdE7hTs)ViPkb$3&akfvW`{ zJ#wDzFs6aszdZ~o;vdS`%@In7YeMS$DC|TX7pTcGJXldS%#_wbJPMmkWpiA>oT3CR Ryx0VObTkb$3QpPu{S(fsxe5RP diff --git a/docs/petr4spec/figs/headerstack.png b/docs/petr4spec/figs/headerstack.png deleted file mode 100644 index 6cbb1cbe47d4f1dd47117894735edc641981ef35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22611 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 diff --git a/docs/petr4spec/figs/maudataflow.png b/docs/petr4spec/figs/maudataflow.png deleted file mode 100644 index e8c124394d70ba741b8c8fd299f84e89bd3defcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180616 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

goHSbU0cAX>N)a=e9GhvF_61x3w+77 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 YCX;`*#i$It*NH$?N%MZO!qb=k2V70cod5s; diff --git a/docs/petr4spec/figs/p4interface.png b/docs/petr4spec/figs/p4interface.png deleted file mode 100644 index af10a5a19294fd009ffd9cf3ec3d3d8379d2c13a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90061 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

rZQIDcW6tzI`(RJ9I-SG?J5@fR-@eE;H=bm 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 diff --git a/docs/petr4spec/figs/parserstatemachine.png b/docs/petr4spec/figs/parserstatemachine.png deleted file mode 100644 index bb5096e4c213b72c2a7fc73a6ff8188bae6cbf00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73596 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 OAGzns&nhHM1O698p+Lp} diff --git a/docs/petr4spec/figs/prgswitch.png b/docs/petr4spec/figs/prgswitch.png deleted file mode 100644 index 978d11b9889e7179a4aa185de490f1fd38ee8f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230924 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 z zYYX%xmp0T28Qf196t;Yg2&q-aXb=d3=eMc1pkGx?(E>xeAb$2Rl^DrYxc5fMz>{07Uw=x;ZA27fz(}NteLPj`BFk?SgM35A z-W)eG_a8P=2gzd0??|?xN=uhZLsqo&iGX(iez_j|kK{PHB|)IT-yTZ5DHd=ky2b?i zHZe~2Zr89J1`qrl9hNGM1pIJ4bfh;)I%H+kI>GaSKlvJnvoPSiSvBzjS-OuIES zzKgrhs(Bn!^Le{E8SM8$T?8wl{>k}U*VfBEnJ{dLCk>9x79R;*K7tWGyd!O=jx!J& z&gkQ#fH08)Apc!0pDda2H$_Pj$!|zlARNE}gm>2ki$Tiz0~Soj8Ky=GXGVal^L;Qm zqGqnOAKAQzx~ht9RKj)8E~U(S!hO!m!HgHyv+PELYU&9_gC|3?JG-3*e z+r6Fh*&CuyK(I#Ym6j^I;6iVUPi|n?U0pzMIX^x4Pg(&`!k6Dl4mx2vi0+RaM`Qw9 z+~#N*Q8nHlM6>T2ypcWw-FB~@`9WR;^azg+C|nMFL1M`K2{6q7#721yIE z$j9m5^xMRnN`^bUG9We*8@dl=1f)tP;s^9A84K{{o?Ne*!L{|23d@6e#s~@66o00N znuM^_U65atKh&bHV(oJ)fPPWbm?q*;@9$bAs3$R>`8P)L?Fk?qacK0!k>6ZSP9ylS zU*XV?tvlbdmnsJk?6tVIzukALjOW>DmmD#7e;euXMm)D7Z>;D=i>VsisWnf&ErQy; zqP)(S@dRn`14CTWbTe*yxO-#JgKYPn*FA$B%>Xw4KU$+g-JFly!SnGja#G(!=p!@6cqosPOBVyP~2#nJ%_P zesr?v`*;+%ByU_C$T7Tg=2cu5Po$<8DrD6ym<*o66fDZHeZ`aI>epS1brO6=;qL6{ zL=+amxxp0s>zC_(eg(w((1!YB|3t=p2^Bmuk@a3;F{YKP-`1YAZX0dC!W=?c#He_+ zL_U7&Wc`Xqoqpi?xq^gyuTcwY&8JeFN%5yuZT+%p8<|q&KvnwkgOj@rRWau5kM5D+ zu$#x5=%5O*i0hT);z2*B&S$TI>vNHE?aRn3>HBhN3@Ho$K`lJWQbdECcDN?WJV!BB zTey1u@f|4O0!5S;t)Ja{`LqVrxDK9aK443=%e!>(2r=;y>K=I z*8M(h1Q}$4!C!|#a`~Cd%&e>G7%;sEp0BdJpG;nA_$0Xz3=cVPKs*TOP^eZ~ zfZ;!90j!H#YRjyVf6>Mz?k)W)Iq&3i3)d2AQAwuI3i5`QAUF4;?_LhfYg$*X&d&Lx z1?wEiJzoOKyuD|(@aVb@&dDwfsRoi08+v6{TfPMAysoNqGw?^}{&{|xRL^%2^4Al1 zLdQ2NiA_}AzmCc~1io#G55SbI#`a0e*z`nae&ISq(NL6nE`{~dNKo+_9^HDW)!^~V zCR=DQ7LWzd<(ME)t{3lm2FI_qqHNKYxbS)jCJCgO;RoY|XP3v;zgQP+ z1PB#Nb2I;irFjd*L8Xxw@I9nk?p(03@3AF+umPdD&n= ztT-9!_@Fc47iGAocM1;(MW{D0Q-aQth&rP|R2dGi}^hvsgLboZv=*f++^;9kmAPg~!EsZQ7)hF7AgaCz2=(K0MW$Al%+!?*!;j0=5;mOZF<6qxpW(Mi56ZZ4SrgQ_NCO{zY*> zlIpiawAaA89sFBJiSrDqFXYwc2hGbvi9wY4jdYZUoptDi5x+zWl8kxivyn?_#Upp6 z-dR_50MBfVg2bWL#cn!~;I|pn$^+T_IJX_Jgtw79T6+WFxvt_tS9EvOp=p3od~v(* zCH^I?txWS1>cg)1{67(Lj~HHRr!RgW^`-O0JP5{l>KmeRZe}FJAoNSvdtJ_teUS|! zCfd4-hh!y!n?2gfRWJN+6DPxz!?gWm>@RYjb(wos*8ULXlh&t|O!1(uvt{NFQejg` z7hIElo_+d_Nn5zL^6+zjw>awQss#>ej^5fT7U`;jz(wRF8Dj#bWRK51oj->6&9{Jc z)*2z*T@NQ*aE#_Dy;!&3>tqw4v37aA7~dXF)ZoV%S)NG-UcfSE+(2ZD&*F;Xqy%wN z<)n{{@rjocel?tr>?vbc5MX#fr7P(!W-z5gC~5^+0v67ly$o;&%%Ek=bbPXG5^-TI zhL&kl3i}!lOyL0ZHrvDVny1<@qI1nFuZ$M}L6%3LZVu!@JI`UQJmePf*O%A%rNOD- zsbm+EiiNLUQ^5*vjd&Z5e#vbVrghYX@^rT;_~#<0|N0VjfFW0J`@&eQ6c>TP~rVLyk z6gf4nz}iqhSKki`e=*cjHq=6!KzkzNtG6m! zqCQQ34y;-G{B^$OCK&d344K0q z&ti?v!>u1ao2T=yNpk*UEzs&cz-e5omaZt_op}P8;@cL$5?_~>X=L zDbS7&SE_zHsMU%6#;e75w3Y+E1BF8MHNCiIPH-Pk2`@7-+w*p}^|h7$cHSXoE-KL& zl5GF@gM8m5xA|%ydI;j~nU{4g)JgEpv=Ag>`LLl~MgSdG{)djsAkCcBEPA(hgg*9r-de*274EsPrUB zV(PoUg~~uF$@wIB}nE7g*?>^F4yQPd2KasdiLB{vGBByHbzN(DtdDDXGJsx>&wHGq3V9U6}dc~TxvMwcOU;burdIsTCW#> z;e%1+Mq;c8#2iR@5kRvnfNue1;wUULiYg%-1(e&3T!9+z9F~mz|9KVI&m1XU^h68V zcR3GrO4oTkapHKLyYpSTw&Kr=6}p7mpKyqMp`>>jL;NBTWSecdWPuGhVh zo3CrWZQ_~XZEecW^&AhSaF$JItpW1PIs1{0lNr4rb_^e!bB2YcDuRNwRMJ^$lc&M`e#<2BZuY~@iWrM?XM5B z*Pm{{KwT@!K!S5NBmDfE@L$=ayEip4JT#3^v6wE}Ox9EO% zCsl%9ed@0z*~ne;A<5ax3Lr*LxyUZlAS0F3z6ZIr!+6U)skfz;kpaKGX$yDy&ZW4+ z(T}X_Cz3x!Bl5{pmDtB}n@PFP*LQgFYiKdRMwcR1WgSl1ZO2^%mPtHWUnUX!P3tWL zs=)5^a_ss5s%0cc>GK@y8N82NGJ9d}Knho{97bz(_05Qw)lSb_AZsZ}s$$%yBmW34 zxr4#S?0an`&CqigyNLs{CRVW92KX)WM|%!fwvF129GShw%e2mc^(`)enQxK?>R zdXMyM&_Z6ECe#XNTe)qY20LyS_JcqOm-}YksH4=d-`XA4Wc*+m(4GMych|%6_g)@_&bV-f=W6j?3*O4h#kkbfV)41^C5DIA z*Se&aGt`TR zpVHnXp`#MBPSiCv@Iw{sABV#rB`WfWH`ZA%zVYOXmn|j_t=p~8>M;e1iCVxPwM?N~+*yiq^QQsmQq*3NWe?MTF z+4eV%={5`&3JrA%J+y+IH27C_PsfkDc1TbK?6NOiTPZ|^{Y2K1>mQg)hmWa2jV{CZ6|6dbIxVT%cmc*bzA zy*Aorp=JrA{q%MgfF2g=*+KJp#r=a<$(NI!37!wp=LET`#Q68=g~Gk?AAo~(I$v37 zs^6umD?zq`{skTfxJTRT)Am@14|+Blo#*We33Pys`BqAgT;b=N_jagl2;f+p-`%w# zb*v8XeRsHiuAe*?z@eg-wt#YX2wTIhR$LDOW2}r%jpj8H>+0-3R5N5rtvc2_U}4FY4u|hHDE&A4jNP}x z8dgwFUagi=oh_2iPccR{uQ8LuB%S%o(Q`Rkc>+f^O}v3;$>c=GaNdwB3ILleNu+H8 zjlXUbJi70@!wZ*YFNb7Dm6EBB#uE&e3j?q6P3tVTuSV%jN^1XN6+ZGv=+in0 z825U}`4vPoXLtN$cu=a@@1-n`p51Gdw-Qcfrj*m{j4suhK%bx6wzp;@o%4AM7jx#5 zJ$EgAxStdPr?)saIFt4H+Q+ks&Zh4Te@{EXU!hXu@peK6AINnOS6gANV!jkC3PQH2q(2 zw_feh(}dWU>XQe2WteNHaw*n~2N~uj5oROIqu5_i6>{P&P5|~-;_*;sFp~(r@+O7waOp4VoihVw7a}`cZ*dsW;94E*rs?d1yGL-YO zNMp~YlfAm4iIh;tz(so9a??v(6B+}|AP>=(5&|vVH>1t6? zg^sBHHQAdoo1UTh8SvLM6mW^lGk$yLmej} zo9$+$>mL$&x*RUPT7EGOuBes zY@ea&aWE8F*@t$$RT=fE(t~%$RQjEd6FwG05UiX#{hnuXTG>JS`OzlfS<`QU8~?*-;cailxuZ9 ze&J70dHL!QI=nC5IB;q%pt!1j*n{N@hEa+r_kT59Gk<3<>2>L9F;)XHQ!I|IAGQYa z31|P|4Lf&EItZ{`Y|5tOLF$xJS%smAe)IF?O8_p}Bgb(=7>x#Y>hi>ZLzv5Dcv?4O zZ{U+p9W6h+^DWpP@R3uQda0Fk@k{Obqjqm4jl|y`=L%u}F(*y+ee)xAGuk<5o4)va z&}o5yCnIzbg@o;!<<~6W<((6g#aHoXr;Bf1dLb|=Z#dN4x*p!P1czPH1Y;89g_SM3 zWA9|h3N!}5d`|X-j9YCt4;Op%7tV66;5=293ZbI=szq39fPI$5r@ord z((`p-PY~i+@(k~TN6rqq&J^L?0ib`)^P5#T;jm>B|n?j@Oeg;B(L_DSQ;(MZ$$ zxle@9Y)u#2tqtR<=!q<(T)B6UZ4f+OIc7wba;CNWNT25UtT~l|f0%0V59f!Sw z1cxSrva~4F&tYf!)?|SZs&7x|y;%Y7MOmppcBlfZ?;^*~VO6;h*0>9y>R6{NK60pu z?WU>rBRbiB)9p9GMHCn!`>hNQiCme!2r<52^}?4IxBvnY#7Ax;NF^TvjprMPY@ovQ zn@4a<8P$ir>>DEkzA=)PKAx*zjhW@ih{}_{339LfZDl*|0s}9ijx49{}UdqzDHFklCcgMj(s?Zb+%hb=Ad7($Rz_bX(~@+qGLwr#b2*p_54!h2TJqLR9% z1*`RDDV98x?f@fAVbqBhkX>{}#PhmCjv6IfcmFZotjC`n zgGO?#Rds&RmY+N4sTu;@8^iJZ(b7*ApXnuOL?}C1zjo16*HsuYNuGtRGTcNE207HL zT~X=6+S-P#c~^pZT(3j7L&##E4UN#{iFbV+oafG?;1%A}Gb^@9Nh?To1SU7Fn!>Pa zjF^9CL6*JrXZglI{PEX(0mMbi>eB=BgX9$ir?1+pHO<%ZReW)-0GRg9fq!i=aSZSM zq5NrJA49ch|J+wN^cHyn5py5?)<2=r45#dW(QTz4`OKlO{6SHV-pEdW25E0me|)Ok zpI-lRiht$mbcDDqSL7j851W>(yCMRs@oTMKKc&S|O$?KYm-7>2k-T!#1CBdr*2n#d zM65-IMHSarCFTWgx5Ng#KEKPfq=!j&%&o47W07(_jlX5!ZxZq=>aC~SfN)A6*O_#M z=}IXKt-el%!%Y|V>FVosCVI#C$>cAzIqsx!D}97b)3ot<@NEC3U!_Jg~k8 z!)B<0?+8Ub3s5(;Q202WOb9;&^;0!`T)RD1U?QB0Uc|45S^D{efE%Djpm4TD)w;>G zZFPxL$(HDuj%R{F`xU{*b#`p>+y8_j>vP+b_-G1^Z=G&u%;>qP+TqIrfj4=n#PnsO z%9-t|2nGe4Z&qsT+n&4+6i$2L5A_x|7u2q^6vtkEV}L5GDUFG7b*_C7hmV=wLsy)a+|1+`xc& zR1Rx_YUu)6>YUGR%THsCvj`T;MG6}428{ov{ne=#3BKjt%Ag~T7S4PN#Fy&yEhQZ> zn|tV|_ISEDJ!vf=IHkPe*l5$xJQIX+rySsK@YpfN8KlxBoCOrhBuIXp-<|9 z%_kx+eW@w0%C&UjGc5r@>nsgwm&M&)VSW}qOBI$auX@lwNOxtApTImn4Jc+?!&bKzn;k@&fJB~jt$YkyUa?@8I)n$tUZ-pepetk$ zltBHx=fEP5YlRa9CWxZTHgrCh_v;V3CtEhSW)PUcE>RvpL)*`zY8U#d3rvpcpQphh z4xD-VKS9S|Jc}w1vWTvhpAfU5=yGNXooNn5SmD#wH%;ECD7FOhS|&&@-&$AqFC!Li z+m$UJ*XHNPIG|0xC8&#tC%aa9OyH~Mkibf)H`&QTvTn%oL3a0-7UbR-SIfa@Yxljd z|7pOLxu!mK`T#yQq|6M_XR{)@CR{x4t@{`XMT(r?ZXe}?%L7ff2k_0;YEsy*DJ5L? zk(pK?Vn`$zXbqui@8;X! z^#94fH!uzmRj<~Z@s{kUI)7@m5v-=vCdTvfr`qyNa*irukxoP+ew3#+dY{C%Bx#~l z$&&n-7hPiL{ofbVZl|_h6qj@P3Qv4H(&VVaYE*Wl5>n+6AX{{ZLan4}Dk^vr+ znkhg%_jB1SY^f+fPA_k^zve~VZpAU1&HXo^% zh}Yl*n_)P?f%SEhNS&`Y^WueZL_632eoi889=m}nHJ;c5QguT{nwYUq$F|QLu%-7v zjWjq?iU=|rv)3l+PMEP%kioeZj&K)?zt8^Fcfmdbp{u8ttdePIf zY&diL5Ji2qBm+;2nbBl00tE6*Sxes#8YCpB?1A5uwKN$aL1ar``I7_q9a(?JAuUan zyk|8&Q20cTID6!L7wG}Dc3x47x8!Ns9w@Go`K3$GjM1uY(HOK#8+kQP@#tka-oWQ2 zGJ>6OR#?0N3QNp#!zYbTJX;|kW>`;D?Ook{fa-)=e2eQOdH7+Ia6FvSI*!0Rxcv3? zL$}I+ZN9G_xxxM?*0+05PO{ceK^BUwH--3je?xwgD^E+(%QW+>L|;v9fvol+na&0ej=q;X=>?I5YcJ=pYqy1XSBdZ6hn!{ZtCk8%Zq-zobewuiP#+fSrNDkj;Uy=gzq~5F3pGFaPty3m3O0N(kGzakRZxx1xSG+Q zAWTrRSTaXTY+%Vp`)_@Dli{Jt#as-S6hq211iKxFZmpWJdN&+STTHLNiHMcFo76yA zv+WlBYgS(%w2uX@K5dG~tOa$|u);=Y%UIo!sm~uY`UX`_v2OKyRkLLy%po{$GNC|) zJW(7;zmsL>U+4$A^n@qy{8720(7816B*quCu|=D z;`Ny7pW8!j_xGwxcldwUdke29+pc|B5EWFqRJui4LAs?R1?g^)mX0BnZluc~C5EAM zKtiOYV+a|#8DNGOX86Y2=Z@!jZ~gv(-&(U~&6+i9uJhXGKKDNMvE!2T=pWW;^e;`G zvItEXdf;l}HA$!tS}T&=v}rXiinBXr%B$ox?Z>wm*L%oPv+fzNt+4LUJY^_3Gd>z1 zb0@u7cH#uVB5^>UmFE9Px z^0d}2I(dD=)AICRCEj;(augL7bMjxjz*^PZ_HCNXy*$ooL#=fR`g`f~n;O`0jw@H5 z)V*EEG!3f{CLP1&ghqdjJ_30=H{PqatOj#u&k@|nY3RMs1*5vw>JWr)6jld7ufLgW z?QS-`K=lb2ruPbM$WQ&bX&WWcP= zfUpE){4kd&&n~&+qjRb!(9~~_)azoarN>FaS&nZp%psTmS+#5=JYa4ZBvKO*q^3bu z0jWSh0vX=qJWZ#2TB8f5(Yuu6vxNW*5n|A4g<8)6A&DHvS#<@P+_WP-Q}to%oYGWd zbkRO-ps8!z;C3F>8A@yQiO%nl5ECPPIe+fX@?opQ14-0uJjxvyw^_ZIWA{?zVb0Lb zJDJ9XTv0*yii=H@uK)6Af%^OeITRdMpu{0y__XZAvTw?$x&{XuJBRmqJ;UydVI-U) zdH;=nG%}4Q+n9Oskg^|ZU($Z+uHnup*uia^xWwJp$^8E9wO7OI=e~iEYV+OwR5AFJ zcD)nQ2q2kUZ#{yWdc_8u4@ z>$Ps0D&dX{B}A{4)iU%<-R1B0`pv4xBZBzVQnVynk%nq^dDW0oPiMzHZ=b@(Gt9^x zNnYGzQT7oB@6oTfTIY?Y$_*P&40f#S)R0p6`?Ni0hkS=T}S#v3o5`N8@*qYGncX|th-v^`n8^>BKWc{=QyOnqOaCqvP_){3ybGzyqT}D+6bRd7V|d_*3#(7;Ulo5 zUf}26`0_(?-QO6scN94Jrk_&JLA9>kZ#m{i9d5PtE2SAB^S?Yh)E*UM{)bd zSNUnO>Xo1^v1w6|;F$)K$@;>~Hw*2}+ylX1+q<_cPk&|GG41Xw3He&A-3~NB<4j=M zm+`a|dLXzAnz>$nR`US&t%#5I+p^{o5qamqsnWN4Kv&Us@BL{iSO3mq{U4_hBZx&h zHL;@XQtyrF?5ZbO2dEsi3gqcr#ZFeTngsdUqg_nG415lg%i_B+diLw3y;N%Na<64J z<#V=NJYO}b3(G4K00}VD!D*YsZNO4fO5NECwWL3!i#cmAeN|2GPhD#ulP zqAR|bwqJgx1n9Od&pnwCRHkCVW|dK2TZ=ahX@Mo|m&f<3S4r4_odd+_dj4dH|AMH0 zL3&)GPI@e>dc>Wvuqn7@A z_c606h}j;L->|C;GuTPIM^2P5ZS?uAQsP!4#*rbfKS52aZyElXf%+H!{LTOyRJn&d zY=wi%%L8_Fn|apa6M`r+74$4LRgSWg{JX8LvFvfg{hfIJUvX>P!ZvZQ_ucB5{9`vf zq^?N&tgtcI=vGJ`rljNjdr*h@_8mV~1xTw;V^HdHvO?FmVqD>R&(! zd?k8{O{zosY5w1YC;z*1|3|(4-w*zuNd7vD|Knc%?_vGj4?39=Xie_vlat(u+Safn z=av=urCtUHU^fOhTiOR?8M*K@#!^#%?N~W1E&2;FV(yEHur)B?f+-}*t zE5i!lda5(gy+DWU)Em@wZf=G>7w!+Ljq6IRAPN$ngDfA z;J!b!@y(R@;R%ErxADy8L(A*4>3W>lABOy+qEyJyeeMyL0&!AINK2nA+L?20ChP>O>dQ?gZ-A=;jS+FI3nwzQVY3%dijs>{=p2^W@)s4K1&TH}90XxIS3~UwRyyZ3P>u-lFaDFNG zGMq4uRAkE>rUQGvYMv@?-fnAPrr8!!2xiQ(6QR%P-66Ibh>;2tJxE*k^}{f?=DRE> zCSD_$fWlkJ>rSH(Q*I5t@3e%jE@D-KqESW!LtY;IW0% zDK?6I`4w!$!eu5dmQOy$_J7%S;_uO{57{{!a_E1{G@7xKYrvV-kE+F_HR377Urnj+ zwLxoA7@UqSKDu#g8x)mwzaS?mKDN@)13Qg+WG}4AomX}qquDOZvQ+El5X%`VV>d!@ zBnLfn`r%w#n+AbPpKNKH4(e`6UN)>YrWNREwaNew_ISQ(29)^!7P*iGGXq8s0WEKV zO`tG4)Es&rwS^d~U)XI`<#OD|_gZkyRUazQIf273yu01h0qb=~l7}^`Zyd2jXzi#n zIQ8uIZ-|C`Oi5PBy(oOlFP9$=BS-m;L^ev*PAB)W96+5t4^_GL_olS{ngi?nN0^Eh zVIQ?}Z@F=)e*gr;k>6JJxGBD%Omc9b%qlP)6xUl8Xk90|@tR$f&U>7FDdgPUTOOd` zy{CGL1W|DZz+iqu4eL-I@#Vwa1Z_-==^xAjcg#IpMS{D_Sh{aA{j8b%S3FRh9dxWB zsdZj#(Fb!qEBNA2aja6^2#7n|FBgOa0oXP$oL`DpeIKpPZ8^K} zU|^%zMfsO1a7atBz3+1AeB&Y3^!4~OYk(oIbti|*aSTlS`n-I%*w?SA!U%RMUbGl6 zLPiktWa@a94;q4`Rk@ zHEfo?q)1E6n0jgo&%K-pNZvg;v#2Xs%}FJDjkIl=1fqBF7ljT#eM@=4v%PL0!WA5( zrr4n&`^KHRDc$N3P-Ktl$i}g{M}O(;=~;9ku>J%+p`3SiQ7$QFXD%eOY6ot6aY$+W z^={ui=2#5gr>HJGe`B&F&c4?3n;bARaYDsr4>bK;3Df?|b5iBOuh8^jPk>HhJ;=_j z4*e2SPBBK(v543D5@R{CUm=GjkS!jarIPgf z8$|htzIC=lv$Rh1l!0H8!AI>%WF=4^Nev*jXxlp(6kkkdD?JBoorI1eZiVpVXzSc7 zDVz9s4Lf8ug15#?-&iPPp73&q)vyiv-P!h`s=`b#9N}(y(g6_6^~KC=^Z!g!Jvesl zSxfOb4>f%7JX#S(G&CHGjLOokrv5dN9t>io-+jLQ>5sT8TFFgYjk>ytBKdkI3bzTDiVa2qt(&ePpEbmFA~*)3x5L^Rvcxw^^0 zr?|~5wAf|Yxr;8UNuXcCYfOK?@#~kU8!yk$GQ6ggeH!4k+a7%EMGa)X&I(Ey6DQQY z%u3?f7I+>#(;tl}@SjMMm_7NT#qB%%wxqg^;(cP9CZ1QK`ls}$>s=S~KNsd1d2e1FtDj!#L+Brw zB=%Z)IojDvdZMuuc>H!IP3N?->2q|Cmch{EzQ^})cBjf(4`ongG=%nmRX(~)wa1WG z**UFy6}6Ij2RVd+c7vI6o>+Eq+^ms%3w`y}`-Y}R7F1!s$riKT#ouNd?LU> ziXJjSd(|U1ts?{^@G{rS;h&5JJ>c*zGGmshQuIDY=>1 zF3=Hd541t@T=6qOJw{T$auvw}0EE))r@%GG$(Wp1tL|&+{xNF2eUY;TUsIojsKI=& z1`gIQjWDJiU{rfos-W5z0vrx=-8YOo|CBgoKzQEuMxkan+s*U-RPOd}>*}VTlMw4t zBVyFd+7YERfm6OfXh0ddJErE1_V|vsxZspr?$yMINx&ub!&?tVs|nF#A#|79q1~Y% zVG)qYTR~GEs;TrdGW33~%sdExtQB>%z2rq`j_rWojB`it zJQ!oT-mlZOtmb&3pwa5D-HQBkp5q;&^O5O?R=dYp|0w4EKVT^s3mfG03A`g^BW)>A zK51Z54L~d`woFU-WpQBoQr6zNdshG;$1@5J;BET=%meMFIC=76Ci@|+U0yRSdY4V{ z+0E-UgLSPE5%8=NxclPySC4h-v#+X`^&h;UyJfT2pmJwR5%5gg&e7Wmf6f9({Wb4* z1-logMT*Dtv0d2l{4q5AvZ2sxa8}u7zw(3wL(}bX(L9Quv#1Ys@;)CbHC4$Jnz4X$ zPM_p;xo8gTQ*IYI)eU-J5|kLEe1sI`Mjaw^0}s5mql7)t%#%Hgt>^ayw|N-%4QYOT zw6Jg;RN9XX>_?wl8s4F~SOA`YYc_z!92AlP-7UtZ^|q|Z03YR^7^eDZIDVT#je5bB zcICdL&r&ub8V;1$Y;IP`6K%uv=z5tVd)y@aI{Iw)_PE!k<=&@t`Bb+qSxzhV&u2LyLuX;##)}oO~KvG{xmtxBe!4zx8ESE8)zKi7mFu$YU?Zx})GJakrD& z{+n8C>we;xy81|z3_wUA<7%9!JsMM_I%4VK)UcYZ9%!~Z8mcjbm z@m0m@7jXQfF?B&WaWlq?hb5|Y)4T24qZtGKem1DxwhQ1%xi7+`xq2Zphu6<1*u-ms zqmVksNdNa5x`nF<(N56|#f)1V!>k0s6}YrN^}1(y$9cHMIg1bZZH?WH+vI$@1OLHF z*;?bbu2zqO#6jRbRea4hksLEhsQoZ8( zhF9*vU)OFO{7xwa80cfYFbHY0emhli3R2y4lsO~1hg_qd-4}6-rZH*UX_QMVGley5 zHoK0s2uU!U!x^VBk%g8B+llJ;-|XJk;1he~QC;6s4r+_9fsrmDfpFBsc<2il|y?|Ch}59}#mf zo>cqsoTjR!4H9L$kD8A@LiqPf&!DDQV#W~tuJZ)iX2 zRIr*ED`2vk|3k#n?iORwvQBLQ)c$sTpL6sa#jg2D3)mySLS!XT{g%};YfPP+hOMW- zK#|7kBRNsm$sMart1mLG-5w89?0;)%mzCRVFqd;FIO_9l70k15s@&`>B+WAMKWH<# zm+L6`j_JnYcE66FObyJJIqq}KS|CT#%t<=Wa2BY$pBoQWSIa>e=(}`QbRnFV;?KC8 zyrJ&vdhgddjG3bQI>>#=Ta;vxi(9gF0~l!3xGLdnJU2J#>aC>=*)DVjkMWpz9~26V zSdG0=o`}`lZZqWZnx^`;Qz*KFZ2LU4v%A-XUUP2UhcZfBtyru{hs(6W9jQSQQty6U z6H#o5ZPG&%x0ls)wqwcjuvLh9Y~VwHgW&s<=ySQYIKsxN^4M@Qy3T<`>%fB|o&dkX zk~12FI(2T_{z(yqbPwC$t&_)vX*9LJHJHVwm?Fi3-As5B@WhcbXDT|>$>AKd`IVuN zt-i~^4Mhv*^?E!R(u(zbJ6yzhvA({(&iT-TO0V8#ChhXou6}gLwz^(PvW@FM>f8U7 zRM!CFrFUnG{#FQ~l`i!e zQ{*lN=3Ew5OSpqAH`LQ<-;4!*i1PV;A=ENaLd7=R1k)TTQhC;=l=1U^3faQ>#_C#! z<_;_XLb(^x88p$XW;WLzRZsC1InInv21Gf2FOZ7|@TK%!4qg!@M(0VKCaT!NslG76HrbyToCR@b5A&fKew2?caU2iWLcu)&jsb;@@agB=Q_aVT5b&1bEMA0qlp2Lh>(w{Egq%`l z*hC2~JTyX+;YZ;O$0HE1g>ThnUm;KUJG&v!3ujQ6!;dS(g{RH9XNjY^FjT{dC-8FB zI1O+HOCY-ihbblM@su|GoZ|eiJR%XMYcxq`yOwuOvz?}Dq`59A=Z}VLe@Xmo;5^Gq*$5esQ2I_*L0Sm^I(}t1`Xl)w-^U42<&m? z&P;e4Wz6@i3A}?z&GH$cU+3?x;IPtS0WW<4dI4>5Mt`&nWi3!^D3+xWIJ)Pn3*Ign zq1d_B-F|!(;@Q?2cdNJ%4tKv?8p;bqd}ic|gfAfSf)XtMY$N=eO#Fw#V&x9jBSrXv z@J@VkrrlQ;aw`l~Y=^c7_rhQa%W}vt#tHuG&E(XPh>SIMt@wJ6sd6KK6J8h|k^9UA z-knfD70%z;1F5SdLPtTmvD+uz!<;Si;PpRy+kU#@;8~IcCkGJ_U_Dh^tTtdZdfjti zVGAzTde+RKU^$xK1GjyX`2EhH=*~6k1OTdcohCua*0Xo@oMPSwUDC$kG~2H9E{)ts z*-ogkd%5E`88InqoctTgOpiI{^&VUQ=;SLD%-W-Vb=_{H!gOY9IbA$6q?N#)D8KG* z7LD`Od8$d1@tMYawgy@0smN!)-)aKv(KwdT{ZN3;iI4WrtkSf8i+ zuYc&iG+H7X{V&QfIFaYg^%O@FT&W=RW7K;JOzpfSgp{Wr;n_rZCU$re{PvwOY z&>UWO-|TSMocN?&@5ztjN7FK~cjGAY28y3WV&y8V(fFiY|e@2L|tm=;_zdT z#J_Tdm~Z8Cq{{9(j|;ZWxZ959sfH7XZcP=0^57da!Hb<6GOyLlyu>{5VB+&hXvRa! zqlw!WX-r-z0`Kkk+X7Jxa`bzVJ`Pl-yrl??+nz8E#B`g8Y7nx_ zkB|B$T$=(0z^+%nPYEgYW{Ccs0ZSji$-kRcRpP;sw&F}S{J6fAFX&!AW)^XS!7T(| zgnwZ58M5B`;Y@3Y{Nl+*9#1pZ6%sv5a!J49#8Z&&Z!9CGA8#~eFtfseiw+6tP^Qd8 zXWRAdS^K(2u)Ul(yX$eGgQO}P zWwjUWfi}4vRUR4k>jjzcZ=#CN$jF{OBkK;a*gv0{s;y|MpqZ*I2TV+O?9yoLL`2!Y zSK4n)mcnHr8tpuh2>0ulYg|XTIXiV69r_7Baw|j+JNnoRQIpVP{d}=uH>Em+pU8TJ zp>NZi2hlp>A?^e1C)D69&kZ;+dJ&`@Sl*->-&L%v9A)b(Pnb}7^PT*(NbjX$5YF#j zQn)yyNnEWnlX;Hf27S}#^%eST{3^|zpbcjF_9RU$`(wFx`DQ0Z!Z;+`iLvt7%u>I5 zso`Y5_FIAMkL0B-SP%6XtP&R>7c&#$m!J3ZUrBiogoncUhZ1n3~v2TX|Q->!@v zgnPO%K#S7%Iex(tYtZD>LuyYZ@2nZ?&HwE7oizcMneS~jNl*8fkDpFm9xfeT)o*#? z$GqtxuJ8S)(0+(6A}I)kQ~`crSCt%gImMYX!66MG)C>7>=}!b$7bxdUt;~#Y*Z&9_ zGnqhCR+7=7`@N*CJFUh|@q10jb+wNWK9!r90v(<{!<${g4eZmF&)3?MAI7&9mp*;^ zG!g$Y&3RF%UhgoS_dyUV0R`gq-#7M&AItddRA8RD20|FAS8!u%{HzLvT;_ULBm@t& z`zcKm90#s;321)#jp;?Db75ddOu`ksAFm+kb~M3A@`>TOoBrm#l%(0(PFG4#;?DuW zR+VkGF0a{+Phue^DgT51D>j>(UO>GYu`Uv@oN=nF1E`nZ6TS9b3l%i zetC8hX!<>+9rq7eNNHd{Y&?eu#%H^?SiOGXOjU#B@AZtSGV(z24~_gDAA~jzuG}RT zsZmI)yOfs^M=UC#w^SnB1)V89sr_FXlzZN>vvXy@92Vvz4k?lBPM>>!{PRy)OL^n$ z(7hLe)|+V7QfzlxcFz6W96T9%c6PgB_X22hAL*pW8=Ot{X6Zk!m=J{H5UW3xy6d!e zvhl5NvS9T!N-!yh?R}fG1*l_zRwz!XstYWPUBDuzFBCOH?^x-X>5+7q`15*yygyNG zr;wtb*5&+mdcH(T^>hyH`jT!W9o>8z_Q1M_&ZkSQwR7H$qNSu~o`6Sl>s71T(yU_q zBb7g{uOZ#O*=*A`mr>K7eAO^&hGWOIY;;k9{G-j!ZKtQjIo`kh+7bBey?9d%+W2)q z2F&|dpzJYbuK?G%)K?s1x=`KM8inY~^sgy$#Y+FzHsO5_FWMy9hNC86km1c6pU$Yb zE+$Efy8^n!cStv0RdQg&6aF~ZY*85DMFtMv+2_sDt37wBy3x(_Q+G>ovTIgRv@`}_ zJ%Wu)v(~dxYXquCSkssoZGx@_-z4Ik$-{J8Bfd+gJT@wV{e zgU=+l|080l7dU16cQ(Gk6Ba)zGp)Gh&xY}%M0?eM#~%$t#IHkzTxQaSn&cXI1?|Hh z8wB9l^WI_pkGaMCbs9!ddv-puPiJ*hp|5HaHjn4X7T&88wc-}I@f4ex=sK1^<;)t7 z!!5)#K@WPbBQdY^abusP3B7THK!?+Jk+n!mEH?l5r&cg>D5wrG+Aa#M6~iA)TfX$^ z0Es-;)&W63`zq1r;vD#B!RF03ztNmWn>cTdo_i6UTLmsYUx~L>khSYq{k-5bOnV&c zJsM2d6JjiiPzu58xK(J375`6DOiWrCm@wPcyVGFu9z``Ep;HP7O-@eQK_$TXdL9~4 z^!Mot{@9l1&#+I?!SujDx{M#D=JuFaJioyziI9G#BToV*$AVkI~QG~DvpmI72kWc=*HUQbao7Eh;%)x$!)b-U4B4hECCpN@ENzXM6L4`_z?Kd) zvmceS@+>2=>>_!?q9icxPWO4=KQ=N!s)OiTU<+ee^s(=q^&L7Of>2M~DV)^C3@uV+ zx?7Lj=ZS`Fx;EHP>~dF2{5Yg8DObR<4hr1}uc+Lxed?nll6AXCa6 zEQ1Nj&JpV5fhI;%AL0_d>0HGU9^a#4djmYy!a@x6Z1be*r08`gUEOBI{9AAknqgDM zqwFt(fw39%!FbahkzC`JRMhzlah7iq4m&7qRn?SKJ(~)Qs#sEY{a$?34ZrDEWW1L0 z-E)O)|K=rpa0b$U0AVJlLYA9Uh|qsv0F3_B zQ$U;aoWm2HfKS6;i>us^}l{OsPzFTKAgHbrN}{?+MIim#xVMq496b z@(x06Zu}FVwBYKMZn0d0-fRh*(wG0w38nYPKII10n^fzH&h{MGTSj`5-dXwfjw%FD zGM>dzaSL&}OI%^Th#c;=e|hb4Epj_V906H;w;CzOJECtsfZrV+aYC}lfQ~-B3DYP8 zT5T~d7*QMED0QpO$s5=oEVU!E~Sv zq}Nbk&SX54@hJi+QQ=V^cMYJW-L}y{QbL<@mQE>{itAgsz-IwqZ%!oV#27a5J2Scn zg5kftycC=*D20{Ru%>5U_9lXY1g-GLP7qzg@=yCN`h{%wV{ww)vSPcPx~HJdCt0%B z4J8l?aT1w^oRu?qYV1te|jkp7w>A&cUcJWW0^Z`_pb?pRYTBJcO9IHwUwk0(R7`HJ=2}wFkz^*@op?el)Q6rTxjLD@RgO6! z0w*b7>+~~0{pEM%u7E1_pC(T`^a@ycXP?}^=i4U=EH`z}IT~2_E!m(3M=)(_*fXB4 z8Ru@$!|A$V<|_=OHV9En=kAP6i@tRJ5YY{))0eJ#;;{X$JR-qvUnNbox$URtT2SRK zXQC6f$$s|j6ANeIfCuPA??*5fe3_$CXn!}5Lhy~PQdQZTi_3SXJWxF!!hW)SPN#S( zjt;>n(TuE^$`2@6R~3pmW?BsIG&Y&e`*wM<{jik%7yX!N^0&mV0h5;ofWr-bK0=b(+oAX3<^JNvK`Cebguv4d5jU2VkB*+ z8?0NdX9#F0Vto}pBlrjE3VtAcWs&7n4b*12W0|rcCc4SwFRL-=7Tmu};NicUu=e)3 zAxRriPoD)OAi4bwl*nE*N|1QUv5+?M*)-YC@?f6>T{0QbMo|PIrB@ZB(nXpp_J_;o zu0~93#CKv&B1C5zlNz2-cX$_H$GQh-k)O+RahMd4A}NfN{rb2E6`r9Vo#n%1J#Msh zp>!bz(?B|SeJsRrqUf2&eSb0e7}=uRXP&ew2TSXQ1>o8cEtnoybv(gZ;0ZkJk`;cJ zqrrAZrX=1+hFR*f#1oByKm8_Vk0;WDxITP;5sjGeZlL~&x233Yr3N~@Zh{TX5HP8j zOSXr>L!-hGB~6VWO+du+2<_IU-6UL`Z)Rarq&lu22_UIT-`!!@>K()gyxk4?w%RTK zkjVBvYQfjr^q`_dgsWYH=O)j(D(4;0#6qY zxq?Yc{Wp`02B&qU{G3xkX!=1=O0+tO!VFXQND*b1TbDTOSwi2)Gf81gN0b>+_N|nmAmRUBS{v%!+@)} z@6UZ*AsQ#D(1r^1?GTCC?Uz>V0%1bHHd@}2gXq)1ZqO_e+x3pgtsedNp_hXqcaHJo z`f}y6YMyf@a%ZWc(fI;i@c%+pRx&yZA=Gm|eaqGq;6583Jg?i3;J;WX7 z_|P`S4>Lk|^^;JW16n1aSw;URP$IMk$YdB>`a%YFX&32H%Nz12wt>bYl(?cF&+|<# z6D!d{6MwfaQs{da7N)3p1KNF+?=$hLQPE`t7}l=ntHoHl^l7wgHCAv$+_R)>re~L1j7>rFvlL5yVm;yVgT)7}t$JeVdhycp zEV(g3Hbk#w+3hLMWUL?V_1!l8MuazHxn9QK^Z! zrzGn=_pwYX5@$sDysGJ{l45LqHUhKF^|9&1)IB<+ zCDPiFb$B^`@V!Ckl@bh#s%O9ThcKSr}KLeG& zJ_o6qogOTe3}y*Rnmjoh>+X3fqO*J5NXa?PLugV_Sy@zi6r|orwN_I#73-^9kOb@o z`HD_Q8RIS`cY$W7>TFqvUZk|m?6V|EE^N)Wvx|zsbLDBT?N*3- znBL?-U7w3HDL9ol2w_2h5L4N zOHXiZQs+6WWdN$TA8z&7yMhwGyr9NScODSp?`8elxc!65Q~dso!KIJAXuM1pxZpC= zvF1R$Ih>einHBrOp@58*$8bI7@^m>K#1d(Uxg){RCWfcnWS38=OIK05eB4D3%F17Z z$$KV6>HwTrxTxTP9j|v>n%EPhL&DXAE`6CkOy(1s5BTbN&Vc!EnsV@2eccT?6P=G= z^LFUHsW9XaXEfi4PpAL3%NB`4G7E3_5P zoL`L~-~U<)F%Y+S4N<0E^$7h=023p7WSX|9^u9&o=2O~g&N{3IxFF8zM#Z3z)@WXR z@_(>$f9>EEyrA}tk&k2B<0X$|aL%h)d{e!}^A%n)4)LTmeW9eJ4CD>CIJHikB+btr z+nQ^;!5%tB1gF2bN3qBaej=tIM%~GLy~{V^U7c!5djS-=ixY0?sI+aFufT{yrHvD- z!^+`4{@&h)h_2(Q8+|;Ki_1lf zZZTge9xxR>$Wn%0gHlG*u{zy^C6OgbGPNMDQ)Uz}pct)9R(jy~GR0C8D&x9iN%(9b4?mT(5d0V@QRA z&PIIWJzr2hmw@ON8-aOUm@7etSALSODc&OC4v?E#>u7}GimucZ1VWj=zq2Afz5`B5ixQF|VYupq5@OHCQ z`-PO-`=>fT>CwL^jXytxUk}z&7q3lp@N$cap)j0}AxT^ySzoz>7xapFlOf5R1r<)p zsxnQc#6q09$+N1$_s}GS22m>cc|)*ER_j!t>NGaf!X;65Lr-@@;6;GxJHZ5)EtXN(*D2$kj0A34wz#| zjD_k$y%$5)d7x%TbguK*cnF)kz@!js-=!<&)n)VXSL7b3nP;EN=DIQxL83x#H>hKD z6RD#AliU12#E=5P^|F7R|I+>iq= zhaK^r3P!R+Pm#$1p6?3cQk)~%9s%}Qy+QC%@#A6*226H*4pEK0-Ed@9n@I7JjFe&R zvA}k0M~1wZDfGalJd~_mhrj78>v>cv@$3c%y0w9Q5|~^AgN}7mM#~m2a_m{@-iaha zpymg!e5Niv^XRmdEw-ts%p-m&-D{gV&t`Xrs+lQ0TlC`_4R)L% z$;%5J#)|kbMV`2c?`to|6Ob%$GUc_r)rgeiJhf~gKEag^Q2&dYo-f!jvy76j?5!!z z(<)e3VW$m2r;kkQFEe$_z;tFM{ZE|yYQqESovavW37w9^hj+Ylr@@NgyW;KhzV(XFov&>u$y8?OB zJF%o#HxaJbgEs$a8!=HN#!VOWOh?oDjnXldZh>A3GA18h(>zd!I9^>{C6zc^NuDRx zCTo@{d;wO?G@xrDYLY>ngzei1F0Y1KvbckvjJwWfSz3!Hjm-x z{tA(TdOIRXlVW#FMyOgXo=RT``T!puzC(#X&*XjI-S0DUvUFz$msHq+coGpy}EyLC=m`BUyGiB>~YM_j)B^s}p)p;@i=*`H=vPntn3@tudq2 z=LMF8varADqrdO--4v0Hg+|!X)AK*uNB^T6Q(@3n93wS8Sx=y@Mcb&j?uhT zOiNvtVN^JB;EIFwa~LgbJhD6oGg(gcGp)W~RQS=oP(A0U#o#`L{tae#%||gy0$j9D z4-9&(0$j}Av`Rigwx~SZgQd+V3igLFAuOZwRX&2H9Ae92np80d2l7Op?%#~MR0<9Abq@qfn*=(WTiV79zi2ScH<>wMr8r9=2_|C8j0pVmW^Aw z?9utuE8_cm1Fqf(rR!sB8F&U_nG#vne0C{C6Eycpsx%8$stZJWB6en2o=sBjLkkaL5v3t!wg@V0 zCuT^~>rRNnqlL0}t8hUP>b+VSw5F>uWs4ECEh7A7U~=iqkmCn~+J(&jMCf`a)ib932XD0Ag z$$Lz_VV_?9+@O}sX_FPx6A^^|67!6-EcM@XDG295j#Sc)lB7nLk8*z6g4G8Fk{$+< zev(AAa>VhgY(~G)EJ)B3Oz<{7QXw-u>VknBXIwsmCyeU;I4c$uXBTy-gcuKuJSe$~IB2 zBq<$()4kUL4tJNWoOliB$>YZ#^yHA+LD7hTsVW1GZQuy0n0X+o+b#m`%^K?T9-Pa7 zu*BA^cUfp#vlq#(^3A&4`~;(0%Jlm9|EgOZ#EKFpb8hiTyG}!?xj7ur7C2F_qMR@B z8tCciEttCG#X)D@>YeS0xzQ&^17zSSrBbvGc29vU1AmD9Oy5_^PwjSOw>S)D$_5aW zO8bN1J7Ev$BUYQt@;G7j-8~UN60e6F5hoFgY;hM&(q)9lnLe^Zi_8^3#x_N0x_^VQ ze@=rVQ3a4fL3G-1u@~F%+4A*|XYwDpm?hLMc;uUC<=XN{+Vs`OJJQDwY;E$QnVDGe zW%ziztwNlZS}5;NZ?BNht9+Kg;>K?Nr+xnG^LK*arOxmo8!Id7tBEGB&p?{?^85nP zifvD~GMIZ{jH8#ds>XN*b>+wXb56|EAYfIP_08-Jg)(FgZkdX!0Om>N=3jvkrZ-$@ zx0!kxp+u`~6s8<;O6(5Sp`M8n8b*TI3g<}Q53+YkH$eD9@n3{hh_YD;umW1W3%#9T zP0%{WBq^#N%4cwG@A^kze$F6tk~yzvP;@n&9UXM~$~6Wr3~YY5hQ-VO3s$;5jy4Z0T$u3EC)eP?mdLURkOWD=qy&}strv{y<)@iqf;D zn8F?TO@+DfL*fUl>;MuZp_)dRtn|m1_8c3TTs>RddkAD?Vo)*46Vx`4HRF+nYMT+BiNFf ze2jyK%)%H__6XE`Y?sTzEzI+PUN*}o$22KnEKL@_KIOk{Ur;HInmBx1-eY@`W>sG) zo=K-p{^cs;=H1J(AA7nA-u?g=r6tr^&(o+!_ zJ5;n=)lZt_`{x~nUZPEp!Q`s+_NZ~Sh#LC-?l`HJJD+R@|JsfJ`amQR46^KboE-io zmo*>`cZV&qofZ_pu!_N}&ZE&VC|!T3B}3H+26trRNnQC8b@&7%F`76jZ;OG+@;Xx= zyc_mz#s}^hl$S-|Q2#)a>l&2*l~Vm1vCuPOv*r1}>c5VE4+HmUk(fhUUHkHR7ou{T zG?5nKf591-a=gr@mYq)J$-;?IqVLy(OY@UVpwpBz;Ahl?dH53tKJTb>Fmyc|uL|}= zEan((dCCdX{!92&%!m_)Pc>PgUv0xSRs3w(ee+O*c)e41UEGp9k=D>b>MND0j?QCP zvbw~~u5kBN3~*m1zQdv#Ka$xKu)hgqG01GAckeHaO`cv1$V&WjAMZH_hE*t?SY0vu z`;PvK!|6eI%qct11P~Qk>p5NvUR9a2goZKGPx2Qz-mpc-FJeTzp3J8HMV8}7nNOtb zmC`MbP>RUb@3KC6dsmYPksI5Hd|LB#oKH*`Ksy2Z^h)KwcIoGdN|3^d6WJ;r;xeca z65!(6EnD%(qu$V8u|RPXZ?&=W@X)n6Lh68pYB>h!QnJ>%n1#0B4V=UofNWPUtGiEx zvSmpSWr3;}WKZ}zSLWQghUoF0EC0ByRqNGv|8iUJUg6!Q6>Bi;Pvuhoq+iWSOABG| zTX3LEL~}$O{|Ry4I}{OHCv#$Qir=w=y$a$Kx*pXusl7eGhW%hyc_^J9ENHi6ow~rT zLz^5EzIOX!cQR`jV_+4qLN|4p@gLmVeO~@2WiQBOF3FPftva+Pu zFID+NJY7A}8keCvN~RR5)||?JgeVB5(y55$$;^8Ogb!J66LwdY58Z_dzqhiXB`My* zxj(H7=lF{L7XT;4LVTZR5%{=#_I>KWfM&Ff!!tim+Jw8Bnq^#E9eXJeM|yIiO8yt& zbOEQ;)Fo25Reh0#%R9tzHeVI zf1ls`IQV1iIJW1W*L6P6csw5GdA-{e{y$tpZ@#pFL8~E@OOHDmC!qdk6bI5U0&*pp~e_&|n z^6C-+&1W(RQyk-VGj7pE6X+xvcW8;wY~7Eavoh^bzE+3Uhumw~eL_(RC6uRe|R3BiZjRX7NjX=B|B9QdanTug3BFUH^~0dcS}fji)>X!dj@T za!ngs0x3r`&HS*bpqlMoTU+B1a+yDwt2AhsE`%2CLvMIoQQ62p${#NV>8{Q;W2N}N zX!w7OosnK6(X3K;Sd4z6CI_mTnwqAd5o2Nv1;L!5^R;}4asn#Bz)s)8HRRj-Mn%a0g`2uzocqZ+p6686vt5%n`CG(u@FZM4sTmkh0=dk51jeiAEW(17tZ1Tl_O~1!|)Tsmn$9vgCSk_tWgTp z;}su2GN;Zpl*9deRStDII%xCg$|n=FHg)g4p~m>1F>2GIzcRHykNf{vUFp}jyTfy( zX(QxGrn(bu`khQ5@Ea%QiujJK^1S-w&i;Zlkgk7R8QjX^A44-kI}SkR^ACT1@*ii| z&H8)`^$6aKpeU2@!ve`0Mi1^TzRC3%;N{@n`+nIF!_^&h-ePFp4-Pbt%eRR-$<{+e zgZ3M<*g;yb2Tm*i)Lm|E!zvjBlKPP}Iod{kTXyhs+=Fbv*XF~2Nf-X>A=NOS(eSE0 zqF9~F!sc$0j~3mTu)rpLm_%gId;4n3dCn^8B<8c5?tlgqBWv&eD>hxI=<6rA|G)O+%X|8JqvZ%F4o5aY9cLe2-Qz8ie)b$)B&{Fv;HpytZLu{T89 zo(;!EjxRb~v*7b)vi@`XpFQ&*q$X!k>j1d^tIR_`A4E^kE1%?H#s1IQp>OCh>1>^Z z`t`|%ag*bKd}>OEk;~XJOTP)o+h296QBEdxy#ABp0)vb|f`^p8#P2<1#tXha`Z&w& za@$+5acVk((C}DGftL6MA^(3cEFG5jV_k8aKKhK;Yfp?O^Kw6E5|q45 znFnR>%E450Cz=tU9I+y2elMA8IvQ-LdtcmhpFa={a+@^9U(#ek^QD5=j+2k<8cRJ>b35RX3a7>7I|e z7u&O^m_qJ_uH|*p6k#Bl9`_i2sXuNV9XQaQP-$h3>(4vC&E$N=Fi zq$E6dacnC%GA?^cFSo6^TAJVC7yly*ehp)?r8E*-KRYkp~+pO6F|d;8A~9x|aHxS+~8lE2M@=8yoc@LIfL;WL0Oa7~Mlf&c zo^dv$PC_Snu6{za)|+IV{2nn7ZA6n^xj;+zGO-{j+G`jy)$-frN1n_vPPl1Or7589 z>`hV*fUFR<)5;gLj1x1;HLHeF2E>1^8S%OA`JY(;(o^)muW!tDn*6V~0bvCzA+AB* zd$T+IX^mL|lQOq$gCq+8HTewbI>}e=TxeAT(Z?^Rl^xi+6Jx_~vS)VjvZOS^{}&5X ziV>0pACxQlq<-8xT>GPqDBH(8Qz>XOvxral_evy@Ulw=*cV@Gl_C-ya_7YcptNBQe zz4x??gb*4n`~_tNvX98gF5lTL4RWQ`XT96O|bZ`QgV_ z8F`l>Y>Yl3E1E&7PR#?knB^dc=_&uF1T5P&Os!BREeC%kHh7&)(Ory5W zHLF)yFSKz{Rb4GER^TdeO9*}771#hYs{R}(sp4YXp!$d+6_mD@RTiZ1PM2x)aWPz| za=jS_^9+kf({Bv(m4+cDqFobfbxEQ7v9ihlT59VHh{5a>>I)I-ky$3CVhQ2z9 z`-}DUl{hY+q&kk%IZd8cLA2FQpY42_YH}aB%7R zKKDt9y#T4&hEqy{fRo~dl>fwrJGfzJi$wR0NROCh2_^0|r zU+vA$OqRO6_7dGlJst8no~k_+@+;X+LdS!0I$fz!N};M6HodUWIJe^qYGnG*O^NMw zePv-R&DlySJ4iFdA0DAI25Lk8*t3TA(}?)Nk)=@a=jC-A3vQCvVN^33H8p(QOaY6o zxO3hMr6$j1uaB3c<}`O&-X6*$5p1mGZc@1xxR<7EO*pb<;#zB8FGqD-z^N8Q`Opjd ztnOTqjBj1CvQMYo-0i&jxQiwSwjSsX3=DiCI~**6>QV_hmpzmM<-?~tVg^S>QG*n& z%>PM0Zr>}yTGhjql?b42_MXW45qOCQ>7=^ZXlfKWZ0u=+S%)>_dUCcrsNoq6`PA{t zVgDy=|4pvY9)|#(q13Go8vc_zpm*p21}r|`qL?}|Uf9Z9ma~+GGlsFQ(itjV=3Qin z4l*3v?D!R*M|PSkfKrl5FZDb3^Z2K9n)4~a8f7s^d+~rDT^+Ry#*(NnY;Y-cAPfE~ z3VUzi=mXW{xq?&y?JWWc|5&GRe^~0ezwho?gg;3|@?ou+c+8gpj5xRPT>*I3xVk=P zSneRBi`_nL(@WhY?5waa9J|eVm+~E4DU@m{+&6IfHmaHD8rO%y5jtCKEoX?$H;ynI|>VpCOr%FwW-T9Cd45 z@$)(XUV=(t9RpdrxJ?h+p~`qE+R&hDZHV`t_EH-*>k8we9eg}IZEx>1(T(oA@b;aA zq%o}44yIQh$rAkdOOy?1}>HPS7tb8Lzu*`^7bjEGY+E1~@NSBHGN{Z*X(%VB1!V18- z+)D_tJtLOoW>cxucFQX%`#!^PePfxb3uWB>-yvCSoqgwFoV!@9>AptG!ED6jrIZvA z#W*dg6b1G1`^62C<((x5W2l;GK{YLs5V?KgaaS)bJsqJ(rMF*;uK2{QVkkx47HfGi zlx}QoRj6hQmd8;EfpT)FD;7_-`6s7c=I+8`f+@djebFhslHtyUN@{@LZ*7hlmpprX zTHwDo1etu#U~+GBL+MY%4jyD8y5WHj?r<9YuL}5&xuVO&-HxV_eXFMJl~sw6pDkY* zoNu{|hIa>%fXCI##Ji~kdY8&b>;40w{MUMrja77*-^?qcEzah?+%gli%rS&84%Ow7 z5if*RHD1rOL`~Bk^yi9xsf(wrcNx7uhc9K=)3iGQQPrQ4riLEw0>hc7i!6bJB%@1U zBNJR+&t*~QUJ($TLFxxw%aDyG0WJ@nF@T%X0w;RF_K60;&B3rS*rU@UA3pc4-sB&i z_`6rL(f31c&z`Jn#|Vz^5xUK6BZP0DTKA%nvnh0A0`?1atsqS%xzm-gG_+qYn|QMY zu_PbNLy<0D8RP=`+-q15I}M;OP+#&+8o*^&;;=0(-$ytka}9Rt9~9B2cwAMY56+PT zs;qP%+oSOWSbUp8JG6jp3`kgmVj$XT&mt8 za$y}8M$JJk{d;;r>DalQN3(YDuh6)|K{`iF!n+-cx`J*WBL?AV;BK31*|3q_CU(ye7u0HfNVL^;+Pr)C`EYl<;Jp^j50=Rt!^Wsh04x1So2t zeuO9U{G=J!p(n47X_T-SG!T=v0?O|Ud-kFm=i%juodvc$MotM>&*9Er}lMpf}p)c1Axw)D*uuRmG`Q2 z5`niDajlA}?#F&17xq=_;=DaGt}<<#E3KGy-Re_dE%T_k$sZFDA_WiZ%)Ky1H9Qm3 z&1D^nvWK;P7-N3ii-MJMX%jA=gcp@vpLEcHlIrsT+EBX9SapDG*R_kLUoi#yf-@#Pm9H29pj3G)D{y)b}PmFW0AVOS?arpq4M^=|}&HQY37b7wReA|)1m=#JWujurgR zB<0=Y0q3g-$&e0~tU(#hCBEJ98pMwTf8Ov2)3!IO!KG~$gtspBjGZr;VAvO(sG0%1 z6eczAE-$7@z?jLi6mE94QXRI;=WWQO<4W(krO1Vu?{(wCtd_`D2digN)0UQ!isZwG zqQVZt#M9)$v#7;Jp5ji0Nxws0Ow6V>5rh_s1#J)HYv15BcJ+G>ob=lIk1=pMUiOaudy%Wg| zUJg8^LIRI6U;Ts5DRN=#yXa@?uUoqP13;l)kVM`&{qD_&^EuTe%EH(8+pbGoz!zX;QaZmW=(YV>`M;j~(%+ppM#K0|?LT-6k zFC3Dy_-yLi&cH=eOX_As$0$ZHNsmm3>JAzaKu&*zVxhIGd>O`mr=i(2FewC7++e>F z_j?0-t|PqzhVSGP|~L2D@^de zg3gE?;ZJUO41x>trtmQrId=RMJ7+-61WV6#YZXm%hs(4!|S`b@$xheV>d)-+aWh@hpd3 zRz5^)Sn#j(jSii@9a@c~{cBY#i7d4NrKss=f{|^!i-tX}J=;(Ha}2o`R)q~(EIUjT z#QbnJd6_Qf$D^5a=YXfDJdY0D?-4=+n_$;lx$tfYA>8}9;r7?yf7Qv>29w-ViizAdp&>ov8%_a z^!isjR+9SWW47HTlVV$SlbU5e%QpYDaKvPo-X>_nvtB3p3V+63NYyrh)p61WFlm<$ zVCCE{E!!AMuK-*=lxz`LM)diZW$p4maIW(@<6QzwgtC}Jioi4g#G6c^rSoS+=E#4M zQt4fEew9FDH2n|$hIWN33@dIQ09>f7dU%UlXSJ zZjZ1TErenY+2zr3a8Bns_rP7$22!)aBQmlArXwakeE?Q!W>0UNSxW?+-1%=6S%&Ls z)}yfyr_8r0kX=+^^jUVoiE;)cpx+c&Uzo#ColWx1hm6qd~e?W;KzB^ z;w_s|B%Vm)12?bW`5{<2=g9hR7}prU?1oC!CW{Sk{++^uXoEwp82i;C>J{3px}K8e z(mspkfSf*b+CNNi0pxH2)q}O(mXx4VQC`R1C!vgv zKy>XGzwr!mPS$^-LAul#{s~M~5vb2jR~{$qndrZ4L5Qr%_K`KTk=^j#+|?So`SwP| z)~1|*v(QPbNxmLF3(5SAOHWy8sOWHZ$SVS(Q2`#OZbLMeQyp$%=h|+@k@EJ0^C<69VE5;_w3JwX@U0|he%QfeI`rdvpvX-=8+FY+S0AOu zC+`-sPEuMr^;Tm@fJWlv;YN3F9kc`6dI9-quGW?xG1p`Z-oQ%HNzS{}xd(rsi#xc~ zgP8E?nmyqw2?(cx^ypICLY-7n<;gT>cjttD-^Dsb1Je3KM3JR{Z}zaQ>2_W83wz_4 zIym6rrG=Pntd`|%QJef?vQ$?msvw?tCMqQAEkO}wn92tT%B2Qf-4`8s`?)!!cCd?% zi+|jA8Jn;84Xy{-rp>prwpHbzM+Io>>ZXYz!i%O3?M`(an$}Qu?!}0{)*pdhL-*t0 z-+JC>hlPyss;flQlkL)I^76jGU{ev?T5x~GiTLOg&uq%j`DMEp-@*4DfNfc|!YPeB z-iruhC1s7O7ZKxSWibs?I-+y>7_||*?Czifyk3dMb*ao6ywG%8nnX1|n7x|gX@6Ls8!ds#Jif~550g@qrO5NEl=j9^uu|>p`h!cJJmWxa$4gm^uvsOB*>dM#1$d^uO>`_2&E?>{u7HS0P<*mk_@+m<(@wHV3BN8M zb}#yj{K!rVY3-JDx^^{?gUWH|)yZwxZYc;%78Wu#`5oJ;6!%A8T>G}YV=+SSw0H!z zm)l&eiA3OWc6EY1WYL4H1_Crjh;vqQVIWIZ_jw(~Rp9`YKy<^u{e81&x+uDBjVG)) zmJS*8XVUG^X~oKg$t*k(->@XlxL(h=7eYm!&GRE)FH-aDC_7`|q9m(spg&13vAUN3 z&h1|o#HSG9ceDe?1PGOTV~sI+0~_doL18C}AR&n>?nr4|CH@K!Z> z@}y?tq!3}pCXDuyGJgWHr5CdByEj+plc-`8!mx~l)TVd}9N_)POXVY=xWQ{UL5 z8G_5U4i3rJ>amQmZEBuR6O8;UugUg?iU~|AVa$hv=ZEWeq*bCz-!IG0yOcM@t#C1o zKE>@#k?!tLXP@mqK5F3pQ#;-z5thXj-phSJ7PD0uCzez{@m9xlA94h?t@=(Y`J}Rk zfJ!Ffps9X>4<`FrR`!mO@5hg4N6xdDlVZh=>qRCZ5TiZpsNI5yNp3&_xDleZtzN%!SXaiQc^W z>(_!HazdZ6<0o%62@cEG#$t9Tr+7&aOr09y|28%Apgc#btW$Kv!7I4Uh?V%g$agU| zQX>O*8>xm)Pds>EW2j-0>;pi+$D&>t|DxQ#Gaw>?yW){k1G-%EPrIGUkp=3d$90M- zYD(Uff8Xb*YebcSJNacfc71U% zb81r3r+Ki8lV6o#)8r`kZ1kXy7)Tm9yLGyoge`>Tkrx+@IiHMi{hI7Z?GC`-o6}7+ zD^43Vb5p4JN$kUuQ3yDmj+^?0AKoIE_pD3`p8l5AHc=t!dsCDqXXN!miCupb@W$`rB-N-h642hzpKQD>U0jm zbZ!A%dy0Keh1#+Cchaw4U{BW8iB&*H{0aMfqhGg4KOcpyci@SzIi+(7`w|dZF1Gn? zbw#p;ZAq+9W`v_Av-%b`KGhjbX7E~R8&ZM`;}?&Pjw*FdeBF0PbHyHE?!>r?n&$f7 z5KVzhNOc<0Jgn^XNcg$jg zqk+GhxI2x=yz;nh&@J4OX@xJcP$&+ zf~8+|qAfnceIw&9=cPz5iZRR9YIpn4@n%>@@{wxbR(cEG=`ZQ5%I|_$ml(~MmvN&Z zfOT76dAbp945AmRT|wFC;TJU)eKzypKE2u*1bNrJ96g?4;v`8G?(E!>XnaCv9kOzL zsF+)`A=I^FzSbhN8|1&R@4v?AbvU?S?4s{){b}_t$8I{1x5ruU0(aQK56d3hXE&JM-~ zU}#qdk9@BxtDT)+kQ8|WRFQX`%l1Aat2Tmy9cRj0)kR4e*%HS=NrQZ0Ud~Zk9AkKj zs;W`#mh1ygzIV*(7VkCyDo`A5Iopd3RfaDB4ak+*N5^1L^4dMd>)H1WIWA&iEv^r$p}7xcxZD{D6HkjXEZB!N{5gWjEAW}A)*=|HbjQP_wm;~SYWD%JXx1xwT6e1LWfy^BE>>l}zJ-`( zl715cC-Ha)HRDnO3_UC2MN+U}0+}0=qir9;ekw5lds*O+S*93 zUi7*jc12&&<(p(YOLNtd(NAkDk=Q&%`Q|NZ;u#i|_xkwzG|6YEH@0FF{6|X4Z1hzp zmeyOq25V)vK8GZS`q@Ut6D37Ey)!X95tvrN~KjR7B%Z}7p6ztc4q1wzTc!2a4egy zGBUaxZ+4h41ROEG3;*_D;Z4)_q9RhfFcr?STrdz^m10J9n56z8W4CQ%)e|sL5%3E3 zGI#PPZfDjL))cg)1XYoLu+HDd{caZ3M|ty{UKT76?ZUg(Rk+98BeX`)6w9OX*l3U5 zL`aDB$;kx~EkiXhaf+W$+I)0sqBdGWOFZ${{L4`oYfy=>tP(IBaJ@_p)Tdqpl!X(n zEX&(wtCA`y0PLdHNAZ>pD(-~vUVMNsy%O+zdj}cjKXdoOzx=FfZK*f+fx3VK07#y{ z{;_N0#p~x)r0Ub~4yA57-!+M!XNhM|);1+wGxU8`u4>kd`c%c#NS;q?uBoNy;frqp zKU%efN5w<>x_<0Zzz4~Ja%kBm`ovxfOWE5`ff>EIrf#VNHc2PAuYsg!*b!hPw)*u_ zyJ8eA@elA3t|$LDEYb(lW7c+G&1yZ=l8V8xpNG=s7O15}u!Hv!E%Kt37Gb9^oYGw4 zm22}4Hpd*tT(1#X_m=2{dttCt-Y2G$siI3ZD=(_csG&2)bJ#_m)qwEDaw_({&Ym)>V<7sgtQ`2g=pt4TS*e*-Owh_pm;M0iT z!lswVGA_wZfb15B)Z7Mt84<}tF_N~t8i15X8hn0X@&(|S_XDP-B0Xi7fJXCk;zVm} zeaGH=atw??obglNzyQ{}k)_WYU=0tMAs4qvZ?d1+W~ExCwg&~(^kxf5(-6()c=#I3SdzdR4 z7g0Nryum8;J?TT^Yy7=*q;zcY1F`yZ(&e+eKVGR@%?upouVvV~^BL>C_I*GiB`>Z{ z9nLGxaKk2xp>HOF3Oz&j6;(x8`sTLN2c`NJ%;?~YpeGG%uVpyTGUu@`8!UqNNM`L7 zVy$f6ZgT@Nnd4C*DXR@%VLO!PJ%0J3QwU|lpU@U#hrHC^s*FE>)XJF8Iz5Wl-DB`n zCYSU&3v0RKjM5+iV_To%yq87{1sg+6`+u`C-67vD?z}u2*&4Ut^y*uJuNNOkjqN2T?TCeg5y9FQ=Cz zubp76t?Kii62Av%D15L3W}I$%nsF|s$}$BjGn?a850&t^2EJU}fBw0KW+Eq&Sh+koIOC7g#Fks^|h@iY!V%bxsHbdEZz-gzK7a1 z{G-GTV`s!KuyOsWXL{6QC2~hZ z?uznI!%XiUGtc9Y4v}do=8^nNKhDr0EtU`V)BX1^iZRs=P?7}39D@yHyG5Aa*8WDQ zK9N55ek--1Zl8;UmcTC>@^t&;SU&0fO5_Kse`<;b4i-yIwr?*ReV(1$nXD=?Y&^Uc zBQpY38i&crt}dYRuRjS^F2l8mtXya6TGjm-*&6NlhVC1Ad`vwz!g+i<-sm`^O#>jg z`HB?WwYVLPf%&n8Kdw-l(V#o(5rUR?CfUiIHROt1PByyfR@{nTRrp`1r%dU&acfiQ z?Z(>M1USZ7Pq|2Y3b@R_P$|wA^#U0-*v4@@3%^e`JO9ppGsWV1&^ff8IjU=q+EABPY)%S2n)IUN~5h(YhC?F z&P&hc)}hQ87E-?Xr23q*r08g8ISNdLEaq5k4$vl^%u1$+q(0+}h_Q zCfu%|-N{7ph$mS0RC6Yi+Rvn+T~9;lm};W(IhJ*)LjuJ-j6EAV?MHY=ckM&Fz9;9WDcfzxfQZQ~NC+TXHzOP2K ze3&)vQYE`jhTw_!4@b-GJJJ0*f+W5&i)5>+)80YU>mwU-4nKZQi2Ljrcc^QAmRBAQ^bQnsUTjXC9iWR zb%Ut~=S^Ov;q>BaaJuj8#z{VT#V4i<=3#R*s1(-i^tCbl_9hc#z^S_Ajxg9{haSSc z36Q~-jPPmv{N{b())RF$qf)Tlo{q}xf3Y2Ir-B$cR|f$t?X93E)1g)nq+9ibV+jZw z5h%Ee7cdy$y0NBexI#aBoruV10W}#lkkjQWS(B6 zn3V;~K+5mRv}Kh(mI}j-eZv2_MBE93agOM`T0(i>{d@uZ~DVw8Hi;4*B}Gnq(wfO43sCwIvb_C6CJ#`B1fH8ixmdg5{Q zD;Si&>k&T_>oB%_Tj%A10BlYaaQ0QK3%v0Ah$fK7U{ab@S5{NwT6lxOvZQJ?bn2ntDW-A4RSASS6xo(JZ)ge~oej zlg1Ve6w8hV0Kd?1xmRM25I!|-UPU*V-&AU=naf>kc(h}i3-skvNMR9E5UlxQ7fHT0 z{*p(08zX$NZhf01Yf`H~Yg7p|?nXtYGmLj_D$dIvg6CTW4QC&O^pDH0F_A!Fia&}V zEN?&gIvrZ%k)F|0;HmwRKEnhahoO3(_4ClQZ}+{&*h(K%MD9uAMW zkj+)eYw8_o%Uu7>SJj~g483%I#_GtWv&?v-4)YS8)5-nsO(o)y;3!b8saDCi!GIrm zEjtqY1JOkfSXn`Z1mbPkwH14w6uk&7a!`fBwTuZPC$Nr^k~2$>Yq6}8MoLEY(jtjc z>R5B5F;}hfF&f~gU|Vi`najK4+7Dr04q7!5Kr5B;NZESSBwyQn%e{w|M6o+(r=&Eg zs9t&`;q*ekdDK}^R2&I3q9FqdnW<_MF|9Bi+m2WFzk1+{GlrG-9nR9&BaeCsdAvyO>4I|@6-rwz_p>k zMJ*)o6xAPqXvLP)^i^NG#_=Yg%ruOyeD)DSs{2jQ3<`isUvo(M%n#zBMYlJN1<_m& zm~n!~ixh;aOdzMkM88T@h<+uI1xrdOq7r9Z`1Q~{&^@AoZr;dmM4!iqq2JWIhFAcl z`JUcKUL-AJ@!#t7uec7+4Jkv|*Y3qO>c_nG<)_!n zoTkZ=$m<&SH1ucA73C3MqgUOTV~sWp=V*yV(m)I=uCBR73O#}Dnk%{e0`3X{&6D`5 z8Y8IS;xgii`aGqayJIBX9Pc3U#3X8@{X4zf{QXulF?8Y0bHq~pUO^MEq!Y+>&X1Il z8QJQfH~2D%LDDfyXXU>1=n**a1BI+)q+C z!cm8P`*F;+{B`Scriq~;=Y>$!h$b3TN{rBv;TN~})!+H@$>dtCmwGt!j3H275;>~+ zTP-Cl3A38!86q?8HJZ|C2?1wTwtSTm86+`ENhnLN^w&;`K=bR6I`v^(*t7pjefR1y)gnx|U2UC~1e#Jt>C zEU(R~bj~}gbaFoqxjiXa_TSG=>~#syCL-YM8ErXx{9zznD*x74I+z52FIQRPI77ra zAyhs4>HdSq=D5i1?JhG^aJ5!YP$$cT+hU96#?PN+JNqIsOX3glsjS>)ZjrB@UVU>Q zA>i!x*otW#>saP|E!c5%PBX3i7U-k)>%8LC;|0f#%O3#v1%JM7>w>qK_YP~ zn9tljN0*eMMT^3R00!;vFov;XhO|A-^Ea_a__4x;E#z#J+oUX=-HQ0+So~VG`Hu=T zY&^D^07q+YYWyPZEH#4PO^ihxNlqR2zo7m(7MB4Y8T^~aQk0IP_6&2@n^5mKJkdj= zRBRuZ%kFo34=Vw5Do$1J*&K?@7#<}ETP0=*0ZQhNuuMLFZ4ufZg4lADuZ@>ZTlg%A z&C-N%ll3O~&T8GcUmwV**_HTs@qZGnfR)jU@VFgN|1Em5HM&EEc!tXL*e_)LmZmiuva^#=DkjO#G+AxM zS)TIK6SdD)w}Zt!ikU21fZ(V(?$UqBL&~j>1ycyS$Qbq>lswhnhNqb$8Xczz0!!Wu z%&av>T^g}CH-{>PDy`{TI4?Ai;4}`xc2Oh)`EC^Pm1EM2)VsbrdUf;}p4xlH#1YW(~L% zY2Ro@5@gsgkVAxaEqgJ<{HJh!s!V@6p&uH2cJ?e0` zopy$6xjJo_Bq>N2%(19fm`fm)k)B>!8%^8kxz!Z~+N__sW#6JLsfJuW*y$QxovGA* zF+;WRMVx!#i?QEMd73nheTn!xHSw6W(XwgWd$=pDzLKMZCSJtW%mNmywIHB z+Cia7msfr;d?{2xbt@>}aX738Pe+i4iD!o6wsb1Idy_Hwm<8QK$S`iHzEYf`2KrI( zGV~?mDBT9}uZTe>aNSboZ;Ig`L^cI!yW#Y`zBAjjk6qh-uN&6^xriRng1eOJyJL%dajPX3zGL z+NkoZVftmXy*J7#4jnwn7%C);aT7M?;aCqwv>zawxG+hKw4|c${^sD74O%z!Z%I+FVSbU z@MNb{MdJ@$3DCXqKL#Vw99BJcpb7D~(rd=@}|l zbC;$P_p$T6hM+0k%=d%IR$!$2+-4P}5yojEaR&|CpnLyttjjHUKSQZ1$q}F%c5&fT zgb)-Hg2i~}<_3T@fxtaOPCVA*&o%Xu6$f|F!)6`$M6iQ9J+wUha;+FEOiDMsJ!q{I z&4)91_nf9HMT*Kct^gqSdgl)&y&t4a5cyqM^5 zA$6O@@8uzvdfmPzz`W}I;8nF0zns}s%XvO@`0j-2IP6kkqASEUz;ol{4~qGWP`OGC zf^#}cFcta!&NGed&C9!fGJ9;Ydk>0^*yY7FCY=|ykyC0M_KwDHN!*P3^wU3R8hBSD`I`1boa@JtV!*G>vsc^qz&Bs4F~m(bzdnw^ zv#xi%(QSHXn`X%CR>8sUJ@Midon}Qm0lK|$W<{5AWxD*S@JVsrqg8#(Mf2bwi?>*` z`(Do9%c?^ZEM1W_E|6=}$^KC6gKmdIw&#Io2ZkeA0y{hlqYsj%6G+Cd>|3X&ha)9c zH$F@AAZyaRgVKwdLT-u@B)jpvD&NILl&COu#D&*(pYk$s>yD#JEU)i5W%lxr^$#=3 z`T+&?)iT;BS~6{FLxd9#5H&%i@3daX=4t5dTYflTT4Rff;GCdPdg7TzSMvyHdrDg9 z$XvswRXc|KQ81U6A{TePe4RSNNo^kOSg>Kg1A z-3VK2>34N%imL>soGBlg^#(-VqR~fp%z%^_(*)@Ai}?ZJD9OxeS(4#Ev|2-~pe;lN=~jO6em&8S(9rx0@5eRY+>GWgB6YnSK|j(ma2dYx9+qTl1)TbMI;Rd``FNc1 zds;F~qAU9gWA##Vgy!4GlJsY_7R%NrlvOxy~=7mrZsyHn&m% zu)B78nqVnN_L8%IO&FOXJwv1Pufq5A%9_Lu`B?acuu{vdhI`S2W_1|RgArx#@5;(z z$|kZh-^BbN`&!>o*4@JyatiI85r{6XsujOmP?n`MTBmxQWLqD=|ME zrN3KQtYA^Qk)~g9>I(6lA1Vo_jmXa19HlzZ;tqm8BpGw|KOM8Oik6#h5Xr}h4gK+{ z4E21HZHJ=ETj(9@yNB=C-%-7IEeU_3v*guYX09Gtrh^uPbH zmoXpudjI&MGWD(!)PBEh#RS(SQ$*g;5j5N~AQQ6g%Bo6Z@el#@h^N&yMt_RYeO!)$ z;GRQJtjzb6g3ZzWLj3vFahApNCqyT{BD-4jTY8T=KCOwKD82GWJPqM=t}DnW;ye`& ztStPdDt7;wy!ag&dxG*r$c7YQ9OJK!wN1=1>0~L#N50}mSABQ)XUBAww{=#!6=r>} zMSj-Ek^6dOQWINd<1e%k1&F9#3EWFC_h8xgB9nLQuNpeN+KCxUmTzW4kAA{QMI7%^ zkD*+P&5oP}4b+SSF>Y+$ar`JOg|3izFU@gV#iF5{^GZls~76I#TF_om4_)I zbK)hw#s-Rxw#clCwx|54~*-%1FE;x#09(|Lw~` z3TTHxP_VYYR%Grhb6hQ||3|E(B;5q+`48F0m%dNts)?IhfIRY3xd`1?Inc0QSWEkJ z{454rBsF&iF3Ps_L_7``MqkifvGfzU8EXpr_lZ7Z@9tc$)m8b+8vbJ%?}#y{s}`q~ zC)QiCAGw8l5FG}W?U-7zQVR~h7WEGkIXJNRTx|;c+NYq-0ujZa|Aie=AT`hMD*=nO zgZrgh594Yh_Fg-NSz5s@s?p(xZ>$oF%HnaqiojQ%E?xmWKQRvRH62mhZ6R?Z-W179 zW!RjzI<#l!PSiBaAM8A!Uicom_JUugq&8?j;wV!w2)3kP@fiNZ?PNl5JEdGRqq6o< zjyv_5rdV69rNj78;+iGKwPtJfEvtQ9Z$H9Ic$xA?tCtzpv8rTYI{ z7k|uYt_8~W7io4AHKuJP1&7n9UE7CuM8aYpmL_AlL?eck^Pj7>A2TW5 zRA;c}XP7?N+G%+4W$Ccm-R`;4VoP`KKC><$bB`*g5vFdthxln1ldN(Ttrv-}h4K?* zJ;#q)&69|xE+I5~ctBt<;f%oko~PEjljF-hkcJ9@hF_AdKA#eL|rev&Cc3id#e zN8wL*uj|E+wm4uJC7m#6S?7lq7oSP>Pc7E-7Qo_}U}03bUdf3P@o7oFKKCDg@yB_5 zS0dJLwdWr#GPBqeZ|JTxYw9S_Jl!?1dnjI?S`52gVfg%+DxobE{W+o!Um(lK>dxy6 zB$E;u(Fu;y1j=)WBBlVF7lvt8!;tebgq9~f*Q1}t=VR6#?}#_mE$V>{bge`lO4~wF zgJt|nF;o5Qc}#gcd8(8h7#;2Jz(2<{%_H?9A%jKnNeqO)P$^SmAwd+B*hM@Ai^64` z%s$!1G93FUEiV*Iq;`cUC?DE=`gkSOo&T~Z-lA^fvF=OY-Ms->Wp9QnprB@0tym!S z=6RG#NJAD-O3q?cfS4J;<@eR}G4EKnF{VDo#vzZcu-lAGv*G{8)mMi_*>zt_4FB8DX} zMFmtpZ4&FfY|JSgJc84p{`T;LMe)*3W(>U>AEsUF8g~r!Sn~wmqz+TvfCo%yxacTr zlb`lisVCr-=Ly%$Tgij&5#(+B>d}(nt3D-{KN7PDhd0=KynRX&NB13x|N0R+H##%0uxh#R5>N zl$1mQMK=Xs{Q8lkPKAjnTf0q0%w+niVXez4@-Fa%f!;Ox3MP--(*=4?xmOv8l!Sof zPCEf+DGQy&S(69RDakM?vfL-{?FEw8Js&$uCUE}3!AeMJ4AF_2Mj-5(h4#Tef zsaynr%B2g_4D(B`^Dolf=2Er~lla06vspk>^Ap4&2M%lc1d5K^O=|&M6GlFN{a-iK z(*%f!iWaJR&*A`)OV4@6E*^S{NvoxLtks*_Pdz!P7|e&2eX6Eod{_M8}tmVN8;X7K`kaB_cvO5UVws5IoeE-!f?ND$= z?9%zcFjB(CuFyTQ?Gt0-bScyfb-%%@(zRxEt>Q9%N z+11%{_B+2jZ{ma17dt+yt;DbKatXd5V8EB9UZ8tvN5k5&VmkC$VJ-DzQHzJEe#UVq z?RK55-(3{nb7e2y-|*>whK%|_LkRtKaKUI{T`hh}d%m=Dw$q#A$B!R_QALpP4TGUV4;c(p zzL>6j#Fnojq@6*723oS))2T4CcW21mzbxF^93~Z?a8Abj&>mfYxoceH2U1(&JP`kS zA;^X6WjwANrPZ4sBX^vNs*--PDx%*xgENZ>_y|-IwLdhKf_Zn9b{ESqN=3o^Z^;!a z>Q{kai`TqXqmkeD_qPXI!`#%04a=wkedVJ>L<>)D!>F?Gy$2}o7G4Q6F5+~%u~dkK zese0s7mzX7eW%Cg^=#cY$W-g&Se!6PD=os`StB-|(&VOLV6V{kc=jQAu1<_>-Fe87 z;o>YIzUrJm^~_6+|Ad3c3YPj{;5c8*&v+(LPYs{sv8pbcuWg(3tfY%s;FsKzo;8dD`5=C zcxGuht;0m!!bLX^y1f^XlkhENwI9;o{<>#pBTC}@7L zC%r>7;A7_hnv>yE@eo{-*5hOCPaos*VTT1dvVETG9l+sJYRMS+vc0LVvHW(o|3Nbw z%|^ExBUMtRBBujaGg;tj{4D^HnC7K_8J6MkJT9y*vTabTRe9a_lx)}7teh&fO}Eqf z?IS;)kHLXd|H(2603d#(nKa#4NA6Rc!Q~r=3))5pe=8vJI}*{H4#SAQ(E4flgN_CK z74SJCeia+<1U9YP4R8Q6B{RSb>!ZU~VQ!^*r?xa2@IB@|2N5x`#}=qzb^KKM+W_wG zZ5!t;UNZ20aZbMJqaVQJWR>M7b!@G~<>o(%GK@<_G-uouk(=7PTx28~Z?b?lul0^X z2+7Q6Qd`900MB|Kp!>0gDkP)-6kZNdm=Hq&0Ta9Mvt)t<=b0Z1Ena@ z?3t0|Da{R-h7E<8@-~mF6^O4qj*TnB8V~78#g$t#L&F{2cMG}Aq69KKl66Sml9gtb z0#|SpHI?|Ivsw=Ui`g2~EkN=@&X;uL32sRA@la$hj2V&tEU%-mAi#yyO(eZRTWx%_C027*4$ zWLPkU)!?^nCB8l|@){o!gRfs3WTvBi_F}zv?oKffbVxL|EvI@ql?1q+viU&y-`K~6 zfes|K2oKB7haTWHo_z6TCV}1sceS+*C+ACW&1uTxs;|KIEG*(ksx?{k%u#XAWOQNM zWNhlrB_gU+y(Nr7+_5c#AGD2dOsZ2kpdp2UX;3O>@X=QsrllV_H3`HT9Oyu`Rt%|G zGcf&q`6`Vf!{gW-ho6fWU)Od1^|6K6%#({x^^RtC;h9y zPDt$;)b|m}8tl@`Rbq<%mhIgUHKuVl(#ZYX8dGI1m)f%Rzn)zB8Q@~t&Zat5N02a} z^kV<1iR*>Dt)s$}u8eg{_3?9)1nD0X=oHcSG`t$aw*4A0+jnvmHNoEEq16?wZS77g zok&oC;DK$+Jcm{FF8p&F-lW=EIlG+x+LU?fDp$1VrN%OyRqF zh9-ml*_ts55LL^*f7D+aQfmpZl-;3D8*& zq_G{o{JoTatxtgw@WJ%6WPsCwbAYGIb*{;uD-M+6)HV6aUDzn%fOKT3tSgZNOm=?M;?-tgo)E9bV0U zi5D5eS|5lUUqjy4_B`etAQ9)Gau*wW^i~qRL|xBSOaC;U66=1s=WGbjdGP|T>pJDLV$>PGbY3_ zvlQYfZXzzWrPm%h85SLsr)e0tG^RoP3PW|OIbI_NPp!0}Vg3U;i>@__vzaL6hm{Or zs^5K;UGSUmrb3%DrRb2~fS!D{s&4SD_ zVH~2}&wMT5rGEPn93D@R_R)rf*lM*QphonsNb?UC1>2E0E=}96gk%Gec*6caA57Pm z*V}x=Nj+eo_w^>$K#I%U1V}V54sQ^;8{ zvlx1aabFvS$rvfUb0a}JBv)a!Zi%rytQITy{LoD;y$B@0%nX6QnOkTpFkP$1zuzrJ}u@88(V+mCNsSoq@X$k^96n?~4EuRb$uYKEjzH@tIK z$X&pwffw+>r1hciMF@{#xBdLjjPr8!x)+T^=Cz}_y=Mt@M-_E7v!F|M4AYcl-3l}?+n^^S%!+X zXC!mWV8@*9)*;@3d8jtz3n@&xIrk_uRQY1>zBS{P%y=<`L|pk|@|rFqJi99XA4@t@ zR)`4=YpKp5=3+-z{|c`Lr-MUFLxL}9cZIlCS00&R7UTY=n*O}aZ^mWocLwbn4J8E1 zj#pT`+LXmhcl+|g{!Td#^@jayafOJIFR?9#W-NM7Fzw|U*-rcq1ZAgh&KTDk#5!(i zYF~7;mJYlZftbGuPIZercCFu%QC{X`)X>8F`yspifF}>Eo-@Q%XeD-Ohgb9m?BVqFKBhXy$eA2P&p;qNB!xzG~Z;q_%Uz zZVnM8%cE$9aVRe1N;$q@K`K;~8?yBN&=F-`b56JCYY(9P$~B`WJBO9+^G^1+tr3kS zZwm2_qSH4K`JvH`5FBg=@IF@+K?Jw<--tkgN<|@D#sLIl=G;XBXMz-MMy1y1yp8|XouhwtlJlOS-;5r3TtSD^m zH)YANoi3mC{y92kldBt`_HxaUE)B|a@@DRvtPIVUt6r@4BsLAfjDw5GJ0n&NNnN_( zw-ToRvl>7oDnXMcq-H-H0wGq>keD!gXI`r-&8rWSp+5^v!bKWi3v8uaEQX(bfWt&NBRh`G zK23^?H|Mdte{f&cOkIYVh<^jW;VE(U!zOcLOg9cP0X5j^IO`^=8 zBLNpExbfQAkGwHa#3B@Xrci$~@OQ+Mw>Ax*eu&mxpt)Z``cIgNQ5awW&jYUSEU{O< zdr}5mc=&TQ%bnC!c!JHrI=!m`x1>@Gh@i?StR033ggiGm{yirh8e=dC$G+8#3{1?? zi4aWSY$S%-$>GQzO~)s;p^|CFg-WH-B+uGIYFd$l6HV#oO@WM)g8o0XpgD~k&kXf@ zD=Y0AJ;vL5#F6f+pW2zbLj*ber*yx0ieDedmoi(t=f!*#*^}bhK6Zxnkw12uM0}*I z-CvZV&sUo1Mrp-egGtzFcrBuW>Gd)ciQ}-~KRq5x@b8Kuh!bKJ98h8+6lv0+R?9pP*0MT+`W+H^=^D}H#By9!Ej zdc^VDI8!5zzHZn&NL4DGW~s-LUbwsJ%eRMI$d=jE)bfqz|NKpUMH$bc3aO6U8x-nb z>*xeOj-ie}n5JvrRmYazi%;bqz+Gi|Jq*NDB3{#f?40Y~HxH#7H8?0jg?*W)@1IPW zE-#CGR;UTeH+yolxA4UEv4lsOB#auF`1HZjw(-9(A1v9bKieZ@d&0Z!TxNT%b?y<7{8;ZEF#B>bH2M;h`C8Jitit)f- zskD(rVd~~-+Iit@Jcz==*usW`Nm%IE>Uiac<4$)62lL))fM@pnvfdow=6d<{#@hzw zy@t%N?;2g!%B+}DjA$$3Bc3ZA?2z2ZD)+g`XBjCTmqv!oU6pSyHKvzrsC}xOs`nje zo7@Bnjro@rIq*b8_va*6L+5M_SL={Tp#5tCf(3ug;0w))P|Zr! z$Nzu>KqNV;d}y@5YuDR~1`mMi#UqRHu8DVFI10wJ*WLj>o)&#nY(q9{)TL!m#4604 z_oMOFRq0nX{&!vde7f~oXkna9OIe#_* ze0C;i7O!Q~`3mS!7x#%MV?0`6#_CI<^aQc!-?ctUN~Vg8cLUj&7Z1&v z#*7R>7#&k2oO}Z8hucC&_=IzTvVK#USMF}Z;Uj|n(A0bpE{W6<{?x;1ri!;J0H1s4 zg+C8H{3hH5YAD?W$Hw3mBl&HkY?T-D?)NAwsxYEY-WsE7u+xVh=|fGqWnj(h@)? z+#@pobgeLbIWK6K+Ivb8CvFFd^~D=xLUK@Haf3iarC?Q8R|{=&5D8{_&W!c5#TS-@ z{!&`Z(g%>^qjg;cY_lGe44#TZ(%`^Mp4y#rAU+lGpwIWY06?TDaEm{g>p?J9{Ro z)(0UWwNBla+PuwLD5GMIm$tACfUl^N@c0>5SBhL!9 z>CXI=j1`TQK#^{-elbATu8bfvDj_Niz4?_I0&bbv$YGl{^N5`NFxBY{8Ira2nU46u zN+rhqZw@EuyCGc1cBwxj-hNj4>BX8gv1+Bqcrj*?>*;((2exLA#xW*k(F?*f&u?9l z@mVbT9!Dr+ohJ!pi?7^vH*LoNBDK|w_bd44&aUD> ztU?H8OV4Ls<{cAUL^i&7ekFPsZbr48`6AnCS8V7Ykw`g_a;mcls_bKZu?Cj&XMzY*VJM^y%_3 zibvI0$$g>m>CE`PgQ9MnJ;GH2_rr5=x3YVjS0qbqQA*U^J_UypB?o8kmE$vPm+q*Q z?d?#!J*X^Q=4zzexCS=rZ78rO!;r zz@fK6-F^%5a^$oigeeOuL$QFU6jfo3fy!ba0I;XKtd8{SU*I`uQSwoTUx|b1r$PE$ zAG(eE7=7jK&P<|5uS;)**H!1bwv0y489Q*#FTF!fZt*hRdjd2yutDV^l-sP!`gz{L z+%TXc$2#k%GuXK-gfaJ32PBHAL7FOvSVZfJV=P?h?jDloGui`g26VqJ*Jo`xQq>NO zCf*ZuEhRL3C`AllE;Pc>v;Wi$AAp!GF>`7`aoN?syByYdZ=yXIWheUUYL1`&A==9R zNNgx_D34ttIBY%yrC^KKt)i-0)$|v^RosI%! z;t3QB6Qp$C-d8C76XV)YxQ7F@NTD#rtb>O{Kf{s;ZHEL9O#wBuFYnJe*T)Q{e!aX? z>Z6ptvA^y)@#NY!#bNg}#Ultf3`Y;b@}U+m@T8M-_hW1+2_b!*CE23dGt!FRCM+be;X(f>9*2MDGIwG~Tf& zKXPSo&)phMx#Jb&aa${ApBFltrYa~QQ{!yUWSEieQf6V^F_hjl?r0r4m}fZW)VC_$ zIDG`%(gfo;OfU(6VGMep+-U<8N)!I=Z_ky(a^@z;#J3z${-<6iC`5#dXm7CeEGOzq zC(VBICVBCyJN`CIgAjKLqI{5TyJ7KqiTmzUMrw@T6X^3ex+Fs#sblnw87k*U-^)9! zOJp0ufY9Ha2Wx?N2+E2H;hhv~;MK(# zPnvlMR*FfwZ`!{Zr6Jb~L96>%rxae4it!^+rH9>sn$wBtdwJ@TYdHlOpG8-_^0ihn zZ4(W21GzkUR6Hp&Q|Y@ndfX-6S=!~hzhaG@>L#fCO{DOa?Q-qIQLO!d+HNLR>tWjP z^6X)9r}i6VDe}qhNfYu;eh+tyJ8$gZ`#kUpf4E(Maq3yasyX*Xc2- z0Nt9t-drZy3!OM0MYwDxaU9O(OV;rUY<_e5zVn7>YZ1%xQn->Q*~I3bqDqe#g-SO2 z)O%6mwW6oX71>*?J+69jwWBIgm@nA1Wu?M#V9Qv9)}+7gFtnzssl70Z(o{HT%m~)U z;hd#Z3VnXvROPR|uGR=mQsM(B9>~W=KLVSad1QTtYyI*q#`)}Or16PL>u0m1as_|Z z<-t5yz0B$p=C^rpU#AXZx|aaVXrkm{e&Q}DdAP3>b&1^RSs&n9TyMv>&eS0DSatCB z-l1UyVF{*uv+_h_6G>|VgtaJsuq=MZfV+ZMKB+F2FYZRDTo1%^795A)|7-;* zq1q3gd2AI26h;sBqk#_h!T9$unZ!|HvEE@J;0Co3>TT@a3tKEQPpBzi&HMKMKY+v#!kKt%??WaWHyVDW2nU zP3TGpK!h>>+D|&i-4p4oLr>j{p>z zUqujdFKj=Gw^Oiu8rPxoe3lt%S$EH$|BS0>>gMN+^9L2p+t@Q^SOvjt>-JV1xK+>X zEe!z!5j%~F!61dT{G{j>4JZ5>_}MrPQImE_3bW(V>_c58ta2nIPebcB0bcC{3zrco z_Sp(2)7S8rR?Sa{R&2}}k_XD&BGS$V#5`|X(#TbR)+w*h?}qFW?@H{lfOWjEgzoN* zZS()|8aJMMmY_{qw_o4&?Te@4Ar%eYgvtsOoXx$Q=po`m0Hb!C5$(ld8o$Kk+K<6K zrUBJEv`&|`5?^$12D;mm?&yv@=^5F)x^WOrI>|R82qb&Fe$iH;5nA_(8QkCq{#(QB>)}gzB4#p>0I3q z{{s8*D~>4?Iu5nsUzABfi6i8;)~I96IWBf5Z48>-mM=a=U4=eWYeNa1-pa~-`@c0j zo8>lNZ^&5TC8${1-#W3>=hNLORgr{k_o+qibYgd$OQ!Yl2Y2tHS1Rcjx;Mcg)1dIX zn^Y>DZno(NT8#$2T;ExHzU$itvdS!ge}$O+Kxx{Cq36Vux$nD-Wu}#O8d8>K!IZ z&YAbS%`Gg#pQylJ5O1{$4l;PTUhGZ33qy5YXQJ-&6R9??GtcyV{rG)t?apP5fd;fh zHkdLxE&TrMv9oqAUvZ=3BrBhkf1Xaj2+oR_)5+`|hf`$0R-C-#3JSxiKdg1C5D01#bXdHj~7b*YS6 z%~Fk=XcYLwEfNuautKz0hq4^txW-y6ZsMEFvV2P5Rcs1yLz!C^-AXW~B_-7Z#yKaC zZ^o4FKITjUci%16%Xr;cR+|QPSY0LjxW!+7>%Cq_O@!Mp0Okt3PXmgO!|lX-d?OP9LKbQOu>5lUX-uj(Ow0?ii606B2PiC!KkQhMpdUqzeKJ&($DqUCjuC$9Lh{=c2M`R|q z#_~#@Yh;H?wMPhAT(4%WYX6_@ zu7ZrJ3pOn4&Oera`E{ON9p7%x?x{G1an^$vE}+pMmgL0=ifhT~#JG=T{|EzI_tE79 zjSHSWSme?Cp6Wo|n<})WYL}i&zh{@B(AwW>8@$JNbBOlJrBL;fmu5*J7kCJeKKxi@cQ)4yKNQSph9fPnbdV{rV;I~4_qDP7Di)8vAqIFYp8o-IwocHq9;U_GA(k?;;LD0PSf^-yS1W?e}uXA02Y|- z`^H3LpW1!hFSko(@j>=JNQ_Q=vgA>cmxtV|+Dm^APM36FO6r<=iEKI!kw!uL<5i82f~EZ+zgBsU6LOoBN2e zv{yjCa=>+PI)v=PN0C%+oawVE^IGFV_9Kmx)Lyh&63>fG|B{EiL$U09v{$_hE1Fcd zZ&-Bfd%jNyZ)7B$7!$8Xo|Rl|V+hD>(AiYLB?l!ZvUQMrzfPb%7UWUf&n%yRPXO{` z9{7F*XFz|ZfAQ=J`BX9i>(_EMGOC?@7N3IE4pQF)WN&)dYNm!>%tPLyj>PT;Y=qgx z`@JD}eg4bbkVN{x5IL$<%jET)rM#!`j!=CpIWdaN7U@0xPWP^VIGd+gHG9Y&BolZB zFy&NVE69&ByHU6Fv?TpCV_%c2D|ZDyeDvrMe{^X$2__OB3YiG^Jlz;5gq|AxlEUeR zHac7|b{rG+en%KI7dM8dT|9esg@)+Z{}FCFOLP0!gJsPj7THk`Vgnw+>FvME@Z21f zwuu$K`ya!l@rR)QNMHWn-b56CrdJ1+>;+;At#5motx3}i3#tPwc_O1 z>RLOYb4mv|-+LRdMwzv`EtyB9e~i6r7x)uW)FoZP*9{CKXcGnU*Y44h-(b#gV(Z2o zdhEJ5vXAIa!b4KX=MsZ-75hAxva!;DM>7P*x1rVLl91QPic&zgjo|y0NPz2HMNpXemZD^VH-tsmZJm|t&FK4*`=3k9O z7_v#JM9Jh%Jea*N52}qrBvl?qzYg>6e0ode+ftQL_6|X{;k~%D^>o{ny%ei&3OgIsVVt;J1!}%AThwctE zZXg;C1@x~~|6(K`5TSu~t2#(3F0TwV45XF1BGpPp%UCiP!ebEqGuCrw?B(8$UCOUY zXeNgrl3cXx(CG_UB)8yasYLVN#jNYE=Gg?X4SNf&7qXmd*c%C1O~@PEkqgzfRPJ$6 ztIc`qKgBTg6RXT=KYGx|mcHFGPowc!OemP9*2d@frq2JqM5b^!UE%<%KaI zuzk3Ea7Ai8-Yr{fQWA1E3-qgHc01DQ>+Dbio<*&Y@)KyboOow#y+X=7l9@En>g}p- zYon^?YKzEXz(cBfF&eIHJR0&m3eo}@e- zzVd{%)o!a%&C^IwxSy*PpLEwnmUma!<4bd-dllEGm0rv#M*REYmIT4(9gyqGXWpCu zc%UMS;&E7xfUCUxfdlS{=3fl??=BevfR9+OT%TT2!MS(9wN(mZcih=vumjjjwZtxZ@Sat7ukhNe7DOL0~<|@T?mVn z{E|597*+&E8L$8aY4Xxp@?+CRS&p=<@l2R)l*74{oI%k);VHLvPw;$RCb&N_OBplNG4Ir8tm2J%+v^xeQx ze(?iNS66&z%`8;9I_sj|NO*Vcv}~qGQ$xm?qGR)I)}p1vzVm(!M=8XTFd7(y=Ablu zr}|w$QE97g@*roGuq?Qvttm+coNTTH&|v&#Ps2ybge zdl*5d)y-M)O=0fJ)cW?J-cc>zHd8B6kG%hh*R7c(L*i;HHoqL<-f4-eo>cObuOCWyZOf4FTu!{o zE%`DOMpKU^@nb?(%(d^b`wn@GHhHVAO*p^$oVO@s6QUL;Z+jVHOAxlVCo0B%Iwp-!0r4H5xd2dw96He z>d*Hz=AcxV`d;=L-)!nt%_dj|MyxlOdfAj;>_n{>5eK*GIODtIfd;G$nC!D2@?&aL zw)Fa_lJdM=vN}fJ>W{`k*p1|fDz)xD>WqZH1BC^JYt$FgYSIx}n$x2Vwc~H2-+2ym zw(5ksic&?9@>hpdT7})hA>o)woZVkTPV(s1YY~i8`P!;G@QHw8FxK%C?p9iZ(sc^ z{-*g|mU`sJs9Q3Gp4KcI?~|k0=;px3*eqif5;Bl^SE1zkyWBCAEB9TJ#|4w9CT%9T zdO3g5et8JnRJI5GI5A8(`H9)RU`aU#B})RGBL}r7H1nB}5y7b~r?xP@{LX|IrXobL zFk&hWCLQiz3*WC;R44804a^a#XzRlk7>sylqOf4eGk2A+itsI?y>N){f`8J@P7V&I4P`Zfn%vG$jRiT z`&MB>SBLm~S%XFSmj+eG^l($T&8tM#cS)+?4?YX8=w2^$egg@DNM<$Bwy`PonwN|M z`F%eBm1L>B&D~-f6T$9VYd#XgVG?hbxQA>WYqZ?av;hiIm*TZdmte8@$yPD4RADU% zYf0L3@=>D`fmi`9vt{618R^Urjw=;{yPg|5VKP4b*}ck`^Y&*T99+7bHa1KzwbJbr z>7%^(7c=tp7pQ^ULGR<#e#xtwFkgaAX2-A7O-n+q3!iJ!bFy$Flla;at{`WU&pmVn zkLd*NgioX9_MXk;H(2$>Ie2tD61)}TZgKbeNB#XX9F5ZUr0A^fFqzvw!RiNIMz)K( z<8i}*F7kv8#%7LzX#J|BZ}-ZSu+Z$NO_Dt|RWQZuq+B2> zNSY}iOwDrrNAy_=rUz6=DNFAB3x;N4SOe|)vE3! z{qbC^Vvx_PgWOJdNqJ0_l{RlWa5KGlJ7UlK7HC~m%20hWdw?~9o8o$z>?xSe+u>LR z(eH?T@YP+`Ck)f<$h%nu@C37B>ZYr`<)w`L^k<&dte%nP|I@QanjE2P3v8*OnEg^X zX~Sr^hBuU%R91Y-nYq+T%Q3KUUj;pX@WV`;D5(_`w==<-T^OPjmh*v)VngCjRB9ui z4kRm*yVr@1P;}IFl=Gs0pf68^nl-2bRqyWPYyKMLf3b zB_X|#_nk`qsn{3twAWMOp!@E*GM$}?bLrh*vL-VXChd#&FFgp6AFI6e`Od9#meEsg zQL_N3nqry+l!#S0Cb<7T@Bb_$MuAEJ)f(u;5h$}%Lb6d{E9@V-!={h9z`1^K1BgGs z(L72?t12!!S9K|p_VZ>r@Sa~c>33^tof@waF1M}JH2E(6bYMBOB_etj&onmxUw^5BTwhj@V(iD8QFd_Xz=IFQ26<2$p_qOyxn2{dl@QekQGhVz8afrco z4@kTAT;?;#c(AcXh|CVHfhXz3&5sD4(Db!*sijbN_5+C`@ichb!?Y6*8Dv z(fmI+6J!4kdh)?zdUs(P$at~vQTuV1?+{&e(Ery!o@R?$ z5oe&E*0lJMAHx&OS!WrhnvTzpD3j_rhjMCENP0HccE?PMt3!rJG&VxmPuuw5DiZe( z6pEx*tI7E!yk=!JLw@O@)Lx}U{!-L5%zFpYomHI9ejcB;Tsd4Pgzq*Muvf!5<4lI~ z+p6q@pe@@0kDb449I2Gwg6bR@)*ocV%z@5-L~Z?3j21*WlbbEjB7K6q zsd!6Ou58r}Tq6w5xNxVOv&t|EkKv2t^YJ0sXfOTUF(ZYGeihzNOH-KM?0TyN4k2nWLO>Mk5=r5j^ykIj?4q#n!b;_o=JS!yd6mhgO}g=nvbNp zNmCsN85!T)5M3g1#nLY^HUGh7f4nIz4uyq9BwppL&2O*r6f{3o2j)%So=TE6RV}}r zPbmd><~Ap8{iJlXnCJ_rXoWU`K^PF_o6Kjd>up3cR0tkQD|y_zxw^HW_C5|U^lzBwQchU#@+0CUCDmz8o?Qtz*GO`nXP1PW$oto zZ-Wsh?WeADf#LdwhSR~Pq%Y+9{twsvJ9d`dN449y>XC~o_1+e$p3iCJ6p?K}t4Tjo zOzAwGcFS6WPcxlpdHMegR}5dD_tx~1Hk_N=yt)#{Gov;*LDnPr`b%o|?mfxF-csZLZ}Q(gk`;CfeFv%VhfM zCEwO)^>gb2o;(8hJj5LDShwSQ20FQ%pbs<87M!)ry$UnKkGv>9eEP%s;;`!>*q(Q< zc4c~+7b~zEa|=0cAEvU+(F6N{;+=KNe%^2W@xq>#p%nCx2nvq z$XO*5x-ZWtNuA4~ACMj@ox+yk?keVdJ9Xu#n>SKYW7Zn!JN~+F{Pkdtnogs;<}8Fi)`8PyS%c+?=T*HTu(PSIlAQCFnlJ5B$0n6wD(7(7s;#>-?o3d<%x&*is$2BPB%VKRBZ%%`CVyRf zSaa#&c{%d1l0DZUkW&rI;^yR|yUH@5x5#*hynhcmv^Fehbc=ES(P}}FF0OQ?A;#OU z{~+o=3*L&2@SB5R6+Td9J|UV56j9^nzay^TkG)-J9MsGpxN|FtBC)&0ycPwsu)yWx z4?$oCmOxLPCD)z1H$6Yw8A(7sp9AsA{|?$IY69ltW?bJax~`PGn$wEIWL`edSpf*E z&0T3z9321^k5RN((H2TJ6A)VAS2I}cHiqM4tbPk3Qi6}XN+G|MV$lhTqhWJN?YpIg zG4prhOsz)T);XjW%8+0sX7d-7Q*`P7-Y+R8bjYe`{6s&~-S#w@`<}U3I7Q0PdX#&6 zH;aaKD(zffGR@4iPtE#l^Kd%14Px-f#RfH;(-9W`yvgd_`s3gdn0!kU3z#kFqiA8_ zFIva}wZ#6IS?Ior&iQ&iee>tfqZ3(mGXI}t)Fvv}g%%zact6oBUr8Ll6?)Sr9~By+ zV$K0IPJ90Si0vYAD=;rP?(|iCGPM|~Q+Q0%bu>kjEBG#2%j=)G;cq+b>_KAf+{UeO zx|>N9JGWV&aTPyQBw&MWGBn$?*qbt>V=ck9jZ8+ipq^)H#h3(swTd$u9lNf({DMfi?yqkQALhCNGy ztU=~V+@XE;egA@de6hT3I)B=WvuOd01Bul_;?`?dB$ zrp|S^-cbtwldC~60>GKu7sfVoXQZHV+A|uhbsWdYq`!MvpQ(|x6|X=F+1DaqcbfGL z+im*!QsJZ-fOEq>nw8L@v%}9Ke4xQ_G>RH?2~KGz{pT!zfwYeLu15-zAc-(~G0;6+ zPlueZ)DF4w*9e8YXwpS7wJXk&R{G>o)&6aku9o^M{@vK$Vv99Wdv`7kJ)~=y(K=TX z#a;15^aO{UpV2v(UT(A(78dA!y>7LD#do}`9vC(GGA47qqt+O<$S2>4KC5zv%+Kp!!#t z{sRTum{Dyg?Q0de0pF$9?!s9YsIjgIc2!B>KV<+UNB21L%?Z|-l$qkZ}Pc zTWN?|9IpSbaAI1qx=yP*GMJPjgGi>w*SLva^=#2s^hn~YB%awfA1@T<5v=+UxQVNJ~j^&qMhum)+`Q>>CXi*oWW*4#z#3Ny=Tys=n(M&6fb#Tf-D~Pg`GGLhfD{2B;?N$vDITm zu7DI80Q3VjDVnf^j^gpqgc7QpscTw4GTxW`biuNSgc9_+0r@}in?INCZcgCg{-mAs z8CFj}bn_hLrsKiSU)gdaY<5Gv{P392$SBTHDco%7FF2GvpE;r#NBP23L+Nx#*xm%H>I{jgL+UDpz1 z#Q>WmOc(wpdZG3xmib-`vuXo<&Ar~K^>`}YQ)i9Y_W>Hiz!-{QPy zOJ^2(fRc)S_(Rq^eY;ytGaBI<>p0C;@sbeV%pUS#zlYxbxf%sj$6=b95wy%}<2uwP zr>|8TwFDoc|4xgfag8P`yhhOOgfZa81ZJJb#oEg;9^sp$t69z5Qu01D1ESwnZ~n*- zp=lN4i3oR;qF!PTW0%f9&s(?P7k{SQdQ1xtOpJVH#&ci(-Taq#dfs;HUuKi|f7dLV z62E1v)HQOyF8myzX)*`*73@AR@5tnjPGi39v~~+7k4~97!mC^}eD{z^MKCqsnK4T{ zCWXftfycDK`gJY6pZeZma5qOw{+e(yCh8_?15|nGH)j`7qU{ z#u+Xm$AL68mQk*+kx~(PR)&5gAjw*Y9T07AZa5a#w zGE2;I!U-f&ItkhLz~pp%a~GXPVfaRFIKf(Co~BDZ8IH%eZ)iZh)*>h#e`%Fg)FhAb zh4Q0-_*%rRf7cj5iGhA!8MitU?@!`vhaHugJZ689w(R2Ud8Cj#a=t^aB=KMkIGXQR z#5zZJj`=n(^3Kye!2K0M2(8v@3e4Yv_*@P^#+r=nJ>5h*m*g$9wXRXUr871Ot@EL!Yp(9D)}G$ ztD|?ma_8*&NLG`*IJNA@-*VC#5V9iZirTwMYtR=J>vfN=<95HEs|CWVF!)&r3PB`i za{66vZ(pWh2Sq$Rlmn$~n`@N+E74eqP#l(2(3W(56P!Qsw2?FDjQzmAj_NMrju<{9 z#XjVG6o7T98q`IFs(_&6tvb2M$dM8%nvl8t{5DYCTtj^u5o1@I?GM&lo~nM)eXGjEK8LolYssxnr2U-^wdhHkPW zzlaBEoArV3M5eW`z2{ZJ7%^v`gZ@ZBJ@ScywbL*MHae-?Vq^v90OJ?_e=EMV*wOoh zMH2$viB?)eqMRh25D5_aZ8u0Mo)ZQ*zA@W*mq`^;LcfcNbJ8YAElfOop3W?ZEv@9k z8Qg`xsXAwb^PYrL@7-Du97V~W2tO@c_JV(6=Ch)L+}`pe&J%{ZdO{NtpDPSz9p4V#(elAg zbQ9q%gcCV_s0tnr6TiPnEOpxyRF=R)H)#coedBxZ-F70kv^NZ1l<3A~H@m0&25FLg zYhT-?+3qN!4FeHI9gCPs9y|T$Ysl%1v~7n5GX$a{q*?#{Binb%H|C3C^Kw9(fmL>J z%Zs1EqPgOR^_`zf*Fq95aB zTTJX*AEoCdXEsPJC2yi1UvL`d>xl2)CWw^%Q|mZshEp(jjO;{Ce-6;s)&>w5KlaI6 z64W(H4w5wqA)Agtvz2&fN~lTT0o41ja%Q~{nq|#B2$AnF;@2`5ZAeajV1F zdZ<*8Vjv4jp;+rg1e<6bsIW5qNk-*rqAnP8X{wfEG5#6(M^MvZCPa3p33R|l)8@v+ z(L}%#PPVpdr@^*UHN^{~`dxh;HE;75I$i)Dw&}%Q?uH@!%-Zd9;HChWUm+V_kZb%E z{l3VJa4Apor-ozG(SL7EzZd+~d*F#H-+#A4{=topcZdb|Aq$=kCY?49!q2Nsi$%c2 z@k|+>{2$(f6X{pH%?&+l=cg0tp#nh%PDmcZrrxXh=Sveu8jP%WgJPI|;l|o|zR<7vG{Z<*Md$2yc_Cnuvm;S{!RFGn! zN7v?a2MGRLW-B*ofer&Vc9S;>lS*2~)a=7orX9f|Uvd^PH8B&xp1u3aX2@IHlqax} zuFFP0?!)#s&3?KE36~;c!zu*7NQ5=2!LugHAb-B4tVeGOv1`r{Q;FwHgfAtBikWnt z6zOgk`n?-Bau(5lQUK41y{)z@D=RB^>T}n!2-B?~`z{}U$uTxYP?!J2hFH&DTT8{(0{_R z^Pjgsex@(Bfyq8M#M19)Tpe`Xw2E{MZ9D3=_xmMelRa_(QC|x6xQ2XEg!Y_hI{e-g zMRxQzha__P?ATTuGRb#>Ct_wLFTC!12tr$!)FUrI^!mEL$2mkO2R|&3uJ~i8p85VcA?7 z<2L!(C~GLlT0+7;yn;SL5la8zneJ~JiX-`zcC})fA^c0pqV8)EJ#G~9U3ovRZ&Ky6 zdpwsQ8^MtLif%!r()(i6Gqf(Rco|7}QqoTgppr2W7Dk3#Qckr^&QCpg5~N|G?e1bA z&-#6G>daUEeC*mEJ*={-GJoK>Y0RtG4#1cSWPPHz>eOy~5Ub2H?TTO0!_iJr-FkX@ zE8qw1Zszd681)ZW**!hQn%~_5PM#iS+8R4jygS5o8|O;YjP@qTM5Q)l}H%k4d%~0X4FlP`?D#b8IE?N+?62otFiX zr3cEXBb;)B2+WdOg++5u$!%#cdtqh%mZ6qrh~0$Tlf43M{uou_KP5@+hkcog~eMcid* z*PCZI5ZqS8G;E+1F)V^KtO;-BX#6oULHs=TtiCS*)YALRIJ3Y%X)W!FjAWuz^k1A} zAw*vlSm_Xvl7P{A@ZAI-qnJQPwlU4kxNR`eiL+8w-HZ2p@QjB%|EmXt=+xauv8!$S zl?lJ5Hvcf$$5JTB2vrpg0)PL~72Ej8o>B7#KK6jU@hKLAZ+BMNQ(z`lxviB$wnAKC z(h%cX^Y#t$6beq++C6ZaP*ElmaRIM*7PrEtR_K@sh2Y9;nNIY*H!^Rw48&)Yu=0<= zoCZHno%G>F-tgLtF^F9KST1*1+NWZ_K0# zK!+K*+`jE+%l^D|=l?F!{sU22WI=%y6I`MJLxn9S9(JfEG8Q=<1$@j00A(-kf}%&b zAL3jh2n;nt;K$7hP9UAs?H)U37uX}pP{)pw?@d0={yeK+&(&NJJ9u4osvR4;TRV8w zs?7TfGC)98r8_3-chKV>r`TD|{y3DM#w>RFdxy6y-28cr>DDDKYq-(AtM;rUm1JF! z5Bc2S)>P)6wp%=Bp|(L7QvOIoBn#5*Jo2J^G((`XWv-n5w%DKI$;;n?64mAh6|Z@= zRXYFbKPownV<|`-ws8+ghSjb?WDRinqBh?m@_a>bB;=W|lYfhgA*iv{CF3}B^tuny zw3+JU5TGx>>F7O&z29Qtu@1_iX>(|EF&zKrOJR=W0*)iC{QdrBLNB{ESGe0<_9qA( z45ji*Ju1fzm9+wfO^$=02U)s?6Oh`x#-&Nfdzp-Z$>?^gX=k{zP$jxx=jD=W&|hx zO770<=f8sztp<*4wn}=5aoLN%!YmQ`T?X~Ja&Yx2{i1b8_|?QS8%v$R8Lox`F(Azm zJm&2u^2bY`GHllQEzJau9tiVKELK=FcSJ8uCO29V9fGX)mnK2Ac@7f<4*CM4jedG7 zTr})9(DYKInR_LNp}*mHsQnA}qeZ=bQh|wnhn?hlmtX%5@;HhbBH?FERRs03&71bA zV>IXf_saJdT{(_HV;}&;V`Qo2-;Z)6l3ypH_;w|7VR1qS++@|uj!-4QxqkE{_65VC z*ApncfsW_;t7ht8w@lkgJQ+PhGk%?M5Fq(pxt+tp-jXZ-=vM4)*T-3R2ksG?>q`mp z7bl6i7qv9P-g0<;AD_&EwjB0ub*rk&whUZIO{K$YdEWGKH#-bEu~Adh4v-g)r5Vdo zMkGc3UN?1eoRiNQ|8veVd5?HU#4<{v?1x-KSPoqKI?i(>La!$qOt?goZ}AD`9m`H% zi&l7=REy#+?Wy*A2@X$%@mJObcxGMpJ>M^1u}!D0h+a*A?(N$Zoi6$CzxQ9@H!@5G z7z&j6HTi*yO;#b%xb>H6>rQfl2N2KNrt=?v8&C#i^KHORvYBW`U03Bg)VvMz9I%%s zO1<3@819+zbT>mDMqeLYA%Q8f?;zo@qtoP)F~Aj5mtAS$-(q&J|G3S`Zs{s1%@JTP z$|^CY@BLuW)`WU_w(NI$DiJHFv%UD`x{2|>YV04M8~!MHy^8S){A06T6}x7?rpcx{ zqbT$Ia*OQv7LjEuv^(&#!CLCXezr1Y0NXJ$O1$INx?IBK}y@m84@%=U)GChkHz*B1qywd1Bm?d zYKBPE+ux(x=hCB>;x>DJR*hZG9zkTSr>X(XNGg&!Rp@eBMB z(4fVP61tL+c*Si}D2*|2|6`ok)5E2EO390XV`y|?-tV#VEvMRb7~?Fi-ki=)L?RUFVmb1&Z$hET@smDfLU&z(wjQI8e7vbG?I73=N6~i%@T1K{ z>p~S;W2UfRFa#Ny@&ws@n_&3Xd(!mOTrWSsdnq{!SRHMzo zNeB-duTlG1QKI%2*0G?W`-e3#WWOtGcSpi!&Z~R?WkPi&i8GGAT(6!c{A97KHAK&|ccjq7t4lQ);O0_Ele%uaADt-D)uPTn4&YH5_2VX`N7rgPF zuZ)(n7acZ<%X!zEJVeqaPJZ3zG3Fs~5+V&^9(h5{$X{LQSLWmpSocK}_{Q7XX4vVT z$9EI=Rqn6emuUL2En+;yl{roR68Pz!uos6BW9E-p5O#Rvd19nZMN`OT@1{38_w9o| zYv~sUw4Y@oQBNnapJDdIim+lr%W0Tu=M~g-B5?6{$HpLOqRIPE=}A-@Dcb*&$XZ0` zqSRrQr^$`VS69OGwkF7ShSlrJbTY)*3N)TL?kYC>c3eLeK2bb61cbSlu@BK&>%SiC z*L)%|MA2@S!q;)&5$ds7E@?_LkuEq*EpnJemD)h%GNWOgMNo50WAw%ubPnWI zrq;yS6nQvYAKf&5)K`SL?nD)htv-0O6iTEus6%}VQcz!|tVyvK$Z>FJxT+dU=?CM6 z13L98IK&-Ni%-srMmiCi_lf6~%t&08u<#nnkI5I4)cRq~RQ|zenLdMEPn2FB=#js! zi^i6-Ptx1`%#Fw`hfPqfu73UY1dx$`Cf_jK)p1kq{(H#=X;3Qh)}lE5FC!hK3^H4f z9c_1fD@SBnsc`?tJlggS8qofP-hjx?aPIj^#@(r|Dw~{)`+x~u2|nnm9imkLgIjs$ zF6R9~iqOPBXXTKfud&5Z$>4kQY>SKdzW&&9hKCPh37HQ$PCF-9;;u-RI4PS9rjefK zsG82I*b9ToXQ(hO6eE#PLFfVUwe+9-(#J^3Q_=$fjq=!@YV}-ko~*&Qw-#CmFaTA( z;cZQRG3!qIc7_l6&1D*F{IOLGeOWDYPkr5vM&tX&LsfMQXU6JXDC^=Voyrp<=0zzz z@@~P(iz1KR^G>mK1G79Sw}bEjp4uNs4(a zHj7YW7l?&NQxb}ud>Wt*W3Uj9Bxtw%bcL$~ z-5g0i&}J!dird=Mj1N7FYnc`DfVRm1obs?R;(Dg5q-?7A*xu$*#A)v|- zXN|k^4~>C;A90s4JlrTmXMENxC?k+PY-77craXx?;eFhab=7o^zvA^y^2v+77%+&3%Yt1@`QQVSu7p}SSj8+BW}Jl ztUN`k-PUv3`2P^@3ise-c=SXl`2AAaRo8Y0q<#*-CZbUMEQ8AKofqOJh0}!E75}~m z2(VTEl~_V(Jx&)%MRZn{gS=7ZLk59ODJBI(m~2wxH4KyK7(tgMr_CQo?<7a`w?JMdvj(KssWUBVr;M|t3hm)T$vJlIArQBLgMPQeFpiu`iG{Pu zoEEb@#4>mLY0DvWv+k1Fua# zoJ6$e1U2^kLhZ_e$`v!}#PJiFdr#U&_$nU5<8GP|_L*kknBN4>s9V;AodH>4ndoV32+TCIKbrXJz2Z@xoKQA?w z#R~8T=Jw}IUz(iwHLci}`Z6zF{+!6!0#-}_BQgNU05wSiOMi4GsW-o=X3+evih6=1 z+<&_*qK0$v7~+23qOWoW=4IuH32IonLlYJ_PDnc%NEts%FWNBeYjUQJiPw2CvM2M8 zzRdMGe@N7DGm*aV&OkJ&1`+I692mV=Q|X$K2NyIlIdpTY*E8Xtxv3`_^e}!+7t9K? z8IzUZ$bPBk_up58_@??Uld?bi4nyklwj^%PbD-=g6`_NW1Sz(G-)o8@lJB3YehN%7 z{L3S>9-y0jlqVgmEl2!%o0XG-b|p~r-n~3b#R4*^VA`=eQkeKBy0oTJcZtJ$G8yrpY{Ye>Z$pYM5%uDXi)_lb{$F%;bLMi^w8PY7>!s+oZbMB& z>Oys(PaLHFpQp&Cyg^{((!pQ@hZN`qdtm;c@z}5A=)UXE1kqyx8Ghi*F#K?upR-tJ z`{#du20K`Y^x7V8L&VifNXH;D$;-r73lI*ab@sAd%Br4vr;2RW)6Y4#?5d~m`Ow1}4; zIr;X9*DYZ=I>6D+N6-eEE~H>I!# zWn2b#Vo-yLoiU%FDdaZec=dKQ54L8ZX8vccg6M2$=x^V$XCia8dd5H3oL%Md?khO7 z+h><@?G9diJBper(b;h*giI2XyUz7ofIwMu{JO|kJw z9_y0^HvQR*8faG}mYGR?NTDqDZoEdA`)42chv-0zCuQ{AQoiOPc0-WAFfYx{x4YF6M;hON9DbN0KXp%GWGA`+d0+#OUR^)R#DENYS#zZ> z;e+Bc47QGAKxpvKq~*m$6Vu0stN?M#=>1*?B*7E6k{;PvAVfrx+iLAtSPs4 zh5uTuNg5nWf@tiBsserFsAg=yO-%VXLZvH^I?LE~#FpgCP~yFO;jMehq~T+(kE2`ny}Byt@_--FB-5=7tfRxDom)K|~fa?Av+`?Zy#=V0`q|eeC5fq?h$reQs`p zOFcgVh8OCWEa@`DQ9Nu}_v$fPsNYGLz&ms`T!j41D)Qxz%l1GUY@0bAPil)$-7-B%Px{7UdF4#tsmtG!CrW(+;eEYjBMqVJTM}h@cL*F@xXf9zH<} z>eA<=d2E>9QD`4+M)vm4%(w@pq{^6_n)bvJQzKw z^?F&4?l2N(fWT6LAeTEl9~-n{-=5IBU7(*s6>Nc+e4TzdlCA&#f$(v@3}PhbjR z@|nrBiUl9iv=|p9edVImie(^hKryR$e&q9ZwA3k$ z$5FfE1M;n%706^f<8ky`tC&XafS2WGN}cmYkCPjCa{Rc>_b;J{fv~bYZ#Ger(}mhP z7~IV>bGU+Ji_cS1J)fB z%&q;0>oJmen2*MNxdK{Es#^T|&Xr>`{l8Zz%knU#7=#ii9$qWve1!8l+=QFA?}Kc{ zGrE+^IYYE5^K%5gRJ=;RYCrf;u%QC2XKd_G570-oa_hmmQt_?NE+$C}+g7Yc^fQe? z=nMe0G4k-}{;YVuQj_Z>-}}WIVK)e0_#?FXIc*8fF65&MdhqUqXL(NSmutZnP}Iv` zkP&84$e>lEIsKa~@A|ItlQy?Mjw~hJO?efJ*%9Xcm&Kc^6Hf~4r%-uMGuA&(7M%~R zR8z|E{gNzjJE)*}6{@&4bat6tpOk={p?3Mf)jv`(nq_w;*Ra?ya4M)YEzbV~PsP{A zv`YH&ab}yfm>-!dmCvOOW1$z{NvV;*<->#?1nIlb(3@iXX`QP{TmBtoTde}MtfI?; zaf6u@36b~dH~Fa~M|h%4737f{YYJHIN|moj4VF6s(85#YE7+6uMy_jcM_MFqcx zb!$VsD}ZW~JM=}}3)jHYQH)rf2|LKm*P_XD<)VH279^mXH)J;jHL)Hjyt$9#u; zG%lDC+%wk_BX!4~PN2UKn(HaiNhmyS9!ss~H!=AQ8;tHo@K*DY(Mo<-;^BDC^kPdT!fK@4iT_@$qPWMMypbZBWcR1{NMIVp zDlc^lyenHJpXhgqI#7ISjh9|HGX~!25yKYT@J9yqJHz0`-sk-`S&4iuojEy3awL3~ z%Y1LfwiOy=+MzE&#Nvzp$B5B>88HTCLzv6oMx0BmCy4yYyK!cv{HW{t7$}Tk18NpH z!;0lSO02g1QJaPrf%ayYE9@~G)RK9wMEIyo`0Y}a1k3@=@7xLBv>AP1U2)o2zP!la zp&p@!;#L`#Kb;OGLhc6~KE2N`;Owi(EoA|LPW-^Dq^JryCj<>A{ z`GNZ_>9o%gZ2Q2dSwVPhF>yrX=M<)Sic!N9mQyL(Q(@Lf>Y-rs0)md2oW0Z|YW=AM zpnR96=c+y&3CWmsTI}VE9Y%}gmVUQFGY0XZ?g9zF+K(kAy=LoEjvVJ@JMQ&Db|P9@ zueN7Vwj~lqC<-8RaV(WUQo#|xD~VXbxzT0MCYZ<>E}n&em(ZDgUwAfgfVICsw|mYX z;vO7|3YXXfK7>R0Hasep9Mcx9YDeN<>7_BIZ3EM8}RS)2hjy~57Na27ynIX0vRU7Fq5zQ z`Br1T87ADC=HJueY~3XBbNw1OHoW}F$}}oZwa%Ewi`Qg6kWQNv^-)w*5#j}@@4(U- zRGERA;I=JZVE@#*^O8n}XQjgUGyyawgsumD-Tf`E=qZmnNCj8>QklXb1HyTi9XH{G z1KvDkvr-Ta;st)on!nYKsYs6_tdk{D5e zKr@N%KwrUs3Cl0f#==E=LKnyu~UqNJ5PzvLDD1PE0!cA&HEk&@x=^r7i@Vzb1L^3&o*o?q{g-PfU@p8FS@b~rI%D2X9G z1^++Igfcp=86s1sT2AjgB}4B|nn}S1;(H85{9a!NO`qqsn9AT%2hW_v>AzW&!4}1K zC?yoK8Xowx!Rua})r&Y5DLN_Ye9w&$RoFtWwxW7l3N5GRyW!|f8+jg_d|&tBF&SA!mgxe zG^8(~&(C^{6-@r`uY?OtVyO56rUP;{uD$+v+nZk~_XZub@;|I>9_L3%VC_TDjWzfz zoQj^;W|D4-N#$UwB#Mf1M~-SQek+_!m@6Dk)FRTtI!)HT=j z(hZ*GX8JY$8_M|}nf`h?zLzuF;riWca!NNjpG-xc?g@iuXfTZq)0AP2(du=?`S8@}*D zw>hT^c{@=cf&3upr>ZD|@O~Mvikq5lQ%M6r+TyGVkI!ush(}yb2p&dpneRIkefJmG zrO@QZ!`oT~mhaAiDLjO8Z6N=edx1F5MS4GiUqIc1nNio)OTtdLMvePCIcn>=SETg1&^HJ)5_ z8~M(-esdpIc*Ujr#>(6;JXLvPy>70W*2Y)25fGs{^Xw#U$jX7;q}c=|hTbE26PLgE zTCvo(xnG4miT^@jGjmqPEHEZCRR+`Mgs_}&OW9d?Kg#8nOSvtY0TqaTkd$B$Qj^+K zb1%h@kiz9Ziz*+n_E!YOK5duiSIH!qY~aL4G5I@TYJY$zq zJbZcs97}zVV-EKg%WRU`@3V8J0&@C(_T{(mc&}LX`!1ApT3s+owpMT$y?jxY$0hP*9WPzo ztlpCgvp~|JiXIb11E(M%_bbV&^`1XLLtebZ#Y7PA(`D#I1>|~f!$J>m^ zj~dh@_*x9w#*D44JZ(`KMjPwAOUFAH0aMEUWg1)aD4~pTouyUFkesW2wmtV3f-->sH6=xK@<0u*RYJ{#|8M)M4CUco2SA5XRe zZ6$J@eYyUywCBH6<#UXKqrcbUF*~M?zC&dVWJ4ulZL=hhd!0G6y*ES6$Ic~Bu-$sA ztG-(7^y8PBg{ZNbhWI`q`%;VBw#y0&to(y1oQk=7*@GMfWd}V*4oA$o87r7#-&Rx!>hbtHr z3hgb4PG}c~1VU}|tbUyTP-NPYE4#f#*btdbv>q4y`c25#^@kg_(eJ9K zDi>zc_RdajfD^0d^REZaW@>p(dcBc+$gi#5(*e%T*Cl^Y4IUdv^JyBH+NSV#jDCqT zczVYkBMAgih@%pVgGf(z@lH0FSoL^%`i)eO3cTSdzdaT7`55HYeTwvYY7%t*>7Q+TKXhI!o^dv{0=A?Kl457oZg>eQDaD;X2IE&t^!8j!_);(W zh~MJxVLTN$KSv{`(LULII|6)sdrlM2kXrD~m<7v)zL7^;(GhXZ8F;aFZGyfnsS5YX z43b^4_#>6xyY!dbG7PQoVIB3L$1tu4Bv9r97sKtJf=+W!;w;afg#7T@9xMwyq$h|(EbJaA#FGj7PX?{#Gb2geX zW;eNNbRt7@Vf$>(6+E@@8pQ<;lsIVS8U>zx7s>yWlMrwX-m^w=lP@v-~HfY49Jfc4hvZIkSKFnn#J8{&_d!R#fQ z=a(!MXR|T*0rsL0#!Z7GJc+pnZY&7ci*2c*0MT(;r@*j3nWvqH=&Loy5B(hfhgzRV zNlrAV0mF5`4K$vsG1yst>Q;>2!MI~|Z)Jn{<7gvOo|j4&X4Da_NaK5`50!JB<2B78 z@@XCvVU=|(E4~QDOAD!zBfeD3JHE8}ap42-L)K%DIp0p50U#J&Vcxr;BzB=cOaTLK$KNNN7WwP0xo`i=N@TlZzwOeu94-Eh_`;Y) z_NQfSg{wn_wMkS$v;+4C4O2vYXx)oce1)*Azr(^Pl&2bKL;`-cE&)%!SvcL^mg@37 z`e?C^-^qJ&P@3nRUsoa~jmg@pf^{o6hH0c8z193$)J2w@9i@4=niu^ZLPr&kX9bw3 zZJ%Z9m9iW7!lT8op9V&!vdG@cX0>x=TjRJ&{2C?7(jV!CM7oY}tnC4f$sVyAKk1Jl zf7rC_weI{a2>WAg{(z;R_S)y5qU$}wIupi@zL!?t(|rjd(4_UB|M-BL4t{y+hdj5T z9=s%_k<0NlY9uv^Y#@mhk~KWyy9N$#(hkAAGNsU0d;hSqi+dy`ke$ z?FxTngTEg0KPH@ zD-qL8*hI|F!u^^J)VQ5KdGeaV%&wuF9A3`bs|_?pFtN5jx&LjPn|Q%2i>*ih!`OT= z>+;e0IY4wO&{MlgPY|dY+8xjq$V9@4b7rmmy~0)g&7$YaMyU`-QqHBdIzOX1ud%Zb zYWe7Za@b6w_>9JR##XR1Q?aU7wS>5n3-C(H5x!{($c49PDF%W!vFttq|kZN|a z5bd>hzVNla^!bhq6+aMlR<|}iG|@3jbtHit%ZZWFA47~SRXjFCjD0p?{;iiH@WlV{ zO_VSqLj&{%IGkboNiHSxi`TuiE~7Z=rCw^{jB@D1jkC{Dj;hBDPL z{;!h;Q>e@CB=+)O$m(Z!aJ{ook0xnyeXn*ZgT7AVQ#KuX{4&X0iY>Vs2g$4uDSGwo zp@ty_&csIwRn)>$fzk!JUl~{swCWIk)-e&Q5O&ODNrjmTMD0yz+T8m_O_Gn3f}>Lf zzlOM{P{!6A1Fp{ZCjeKb?_uXOImLAHFcm0W6J2)9pPk@9K}2;(KiR)3_E%m~@0M5+ z!{XauyxG@fY>K{@(}Ml=azRXui&8kx%>dzK)< zS&=cbuST?Ug1 zHx_3cR=LKD=H`W+VUc_B2jy1b#wQmqDi+|*a7RI3O@@j1k-}0iy}K!qr?KLE`|+Ea zk&i-5U~7avX5v;;1t+z=goHGr8*yA_v)Yucw9HYE_jQ+DtI7!F52+ssFsWi5K_V)5 zHZB8GJ~^Ch%SEWo#*)w(w1lBvEjI*EqCKLk?;SVXLA7kwFfe`{=|d7~Bt+pl{r&?{{N z3JzOtf7|x{`{xkAHm{bN-t$5lkCnU3M)Q4>{{ia`4w^)77ekBD!rxGv^f0LG-2Zz6 za@5I@5ZGx~MdCmy*kfnG^m=olLJAvOw~TN(mnLOU0MjVY{DS5gtT<(HTK_^hhv@SJ zd?~Zr!t&zE_js%b?v(@G_`J4mlSRs(CG^7Yw&T2~e&RXlG55qUjL3+rj-5m^+*H%0 zlyheQub>nOftaP;(uLG(0h!qi&R(@Rjm!9O7}q_mH*=hv%QUlbSQ?A1m9i?SRwVD8 zk}3geq|6lD%9X)PLDk_&PJ!7I3TA3G5|0ahXbZhQ@gU@go9w9=+Ls^EqVO(zeot z4F($+Gwa3T@zbPUoO{7`i+ewrKn>>MCHXy>t!H1uqKk#T1#awvraKy#i2HdGHOTir z1f4YQ&jjE1Dp5ckm#bpekKbDBxy6e0D1%SrJ3-496VCnDz=_RKoj0JH{Npx=LFItG zYmXKmQ$aXo>89P>y7U|IwE9t}AO(DK3bxnojLn(-a-af;yu6UD$o^z4L)*xCjhztZ z%Sp|ZLCxG+x=1p6d+}C_$Ll?`eC#Q+gd6m^G_U!hn>ycw5sIYZt}_TE$)Vi}&dLpI zrT9pvF_-phSgn0AmU`3|=c2#g)6q}kf9*k4d%#i{)}r1$cH&|Xw<~;^i$`t!t2&_k z&DLXF4Qsvdiv&tr8M{Ge)cG%u;o7G^$(V*uzxXVZdezo{4jj`x93`nOWATyKS-c(0 zZ+cBY?;S-mHrSmNb7VyY9SL;n=dZQ z(Lba>LuFihYt2|`ll+`OO|+9XmmK-+!`-#5_9I*Yu(yq|>yRX-0OCBythhH8Cnej( zXWo6uA7GdGf8gvZI6UCYx%Z9HDJRyCFpu^$ zwSJF*$ckui(83~N13RAT!s=baNRr;mj)TB-rd3D(vm~M2Q+UD#IQc>@muFe9%!@7G_^!Xk3>XuyTEh1#5Cbc_cj_3(bh9Zj>KB+- zPRQ3Wl*?huM0L=PIwbbR7DXKn|5^h{C*l(Z7oW(?rT;r|L519!2ej&QlU|T`fIq8m zy>WyrVUa?ch|pcmhe<)^Xu|OyY)r7Vpu%L^I39`~t&1D{9M9H~f6<&eEUP z^|AQ*x5Q^CB5sjzZ! zJGs$R<8z(vcuMqapK101w z{%9gP5ja@-FqHJaarsYigh*5zXUbSuhd%J_DhAU1s?4p+_0UH3{tI#FtzYT0UTY#- zC4KW93X8lUEOGuNEg;Guq|%zc)A%plB=c6>=<6JiX61>SFNca zPjl8h1(wx$GF~_tdkrwF;p+Mw?weVzU8a>8lv_G4#9nS61u8vTxxy?$ybBI@r@rG} zi)ElSYrq&R?qJbFk;DB(VoUZq**qFb*xD96%Iet^+c|8a^P1__UH}@`j7F-GIE(F1S&!bScIxNItVR7feCCqNJpmAh+7e_p z{T}&MGW5%w!hRP_=uB0hdgm%g_zh^=Ael@i1?;|C#^;SCM~zWhy!ET)mM?3o{XTg4 zAVgyR!<0<{?S-5OTfOLkFUdaLM-0F*2o_Y z?(qiR^i7t5e|C2^U8a-~p}7oDc-=oU;{0AR0T0UJp78&!Iu|WnjF=^~h{!2}J84UB z*S22h2JAg-7Mz067LA_iJW_G{()#s&%Cc))!fbV8p1AKqItPurP7$1QMgN%DXJszTtbV8urg#e zv~j#GB{?Q8bsClscuI{Kw3q6d8zLouByNk|Sm4Pmm-}ZG)^dqMD43A#Wb2tcCv2P1 zirQdVAFpIHU%&h&X?2&`MTy(C(1G5bG^b0FBd4V_$ADo(Au{^0p7# zJAZ?04^Z)D>uSQUPh}{l&o1n&k|*YN72byUmd(E2pFZQQ5l1~q@(hK(IK^UWai3~-Huyp3sr4!T}K0XUmtwO*mq3!t1T7uyFcb5hBeU9Og9FxnqU`( zBMxf>Gu;OpXlux6vK(7Vq3yrRU0gWDpX%u6CP-p9O-bFZwawn@U2ggR zi2LrSCf4>_6$KRp8-mn>C`AOM7lEhcWz8B|X=wP_s0VaVmJSq;}I!kLl7u<($_M%LTY9ma{L}wg+jhvBdLt zjaqRpA8fiRD{F%)4(lFTZO^ErZwHGT%DQ|KH)|*xKI5ED|2);AH=S~P7V4`L^}RFk zP=@GMWc78VA_(vi8#z$Qw+b7{^ktak=9ke2*R!tG&%)f)yQ`UIgR%F_8r{b( zF{-39d3a%aTcIwHp;ZC%@6{E+BnGR%V<-;Rfb-v%rmUwSg&?&n{F+?@V}7N*3%y|6 z@4yYZ^8jk8Sc^{gZLN5}5a7H3(CT5{^qfdX@52CvWh70a@yUr3GBvoBKm)pdS{dc2 zB;OQ;b}P5O^W9{ro^q=w*&-eAH(Z6n79!?-yk+)``u%=&m%2@smu?%_26fx24($|8 zz-ng8S2W|SinFffG&m^f+)uA)+Jx03)}UD%eh^|sR-bf)RRVd~zezsi=T6)H=X+S% z{!F9U-kwQDhqJ(*3qCpKptc@El-jL*bF4pf1<@&L=RVLH38G3?s$P4>`PoRQY0IU@ z*8j4l2CD`j%FM=entNh~;Mg9_Et01yYWE~y5`#38mJ3qhGJ4s0iRU1`XBogE3sSpdmAFPhQ5UT;V=F9O zl@30xPH$ZFJ+nK1qwHM!^WBXVLI!TE<^m+IWiN6ZA!D>#r}erA!#2Zqg}~nn)-Zzf ziKrf1?;F?#diJH>mLbe#w%HW!lSSSo72x!4#BsfFaL5`d_9pJNv<2#ts-uv!HjX3U z=bUNZfdg0jx3vw0taw%7i|{DVCiY=@!uYI*A*R)PB^ZTY;y05Z-3cU*f#Ns7G}8`c za+tXyH zY+OU3m)6fAB_9-i3H<&1^?Cic`!9=DkW?cJK7GW(aLXEMD2afs9lv8rUv|JZ9N;Zq z@;9jmuXwGbl#~mHGPxb8TNU%Zt}}}EpW;z?wkVmy>TIC6+~@OkVdOtk!PMeObAv%u z`Nu`~-953$t~8ApyiJKv?Hb_o&BU(s&Zy+z$1;Mc_o zx_v}iRcO7jKj!lV8eS~kV0pCZF)KQ1c=$tTJ_j~;yEjDd+2eF@kWUk%Xfih%Qq7Ns zyj<6RF>|1H49W+GmkaiGh5_OwX0MY+(|p+Tc38@J+Aq&lPf>x4Gh(2c4;`2rDHE`}{Gn4V6T;916)K*?*o7{ejf28QT?gO4( zBQ6;2-n>x%ML6W-%e;cF$)rvNi-2Rpfm*xs_%Rc$1L8QnVWu9(h=89@47mgdQ=IKw zD;sXz7aO~5<6UCKcurw5TPA>_c;Ct*As2Ky!XGvCZ#qd2udmOhpp65^0gs5kAs?#i z0B*v1_osBxpZSG<*qON^n8RcY0A%Y}R6yaq@K2%(LK*g1Z&E}Pa>*Hm%fNAnnNYe% zTfG@uC2jnEHdJa~$i;y^Jb?re%zS#=%h>GuIi=t;vu1w z>_Zw5GEm&nnv6#g6S}qjj&Z|zG}Gj)PpJX}jeCcID}!xuKBC<8+sY!(P1Zyjum^1C zq*W1xk=Nts%yScTdfm^`$;7UD0<*O2;%7~L+mo#|WR%}x+9*dbo}>^CKbQ~*eodm> zi1@&mI)RL*dFJ7L?0e|{;gBmo=v9)hyv%pW#jLp2TqM@A7k3~P%_^T2(zsIA83ZRB ze%)<#Y1o{_))FHh9ZFz&?Q1%uzEe2ApSX5JV)YL~ z*Sz}#0GV&g_%0>=Pw%_=q5RK!*3^L_<{{Sjh>4|LEp*=54XVzcA5w%{!UkUI6Y=Hu zcIvR@{5ql=t`^hL?;fVDgwcLjSLz<)IP!j(0$~okK0flc=_32B7KMB3v8^2)IV{}h zk1prfg-jj&^yc!k%L{r_g(AeZ%B*Uaz@CXCB&T83`G{{jG2Qm}V?aBJ2r3xDaBi&l zwz+)7kZXe&%9Koc{Dj3CKS%0fpT{O!E?jY0CSZTv=sdhiy}`ixU`EI)k`^7NumDTx z6LU1}@_`2W^oT!vju_RN;6KM`EoiZsQ~48KgpE#JA=NKLQhLf@OuaSkHk;E*6tbu; z)xWFRL+!GXt`R-vyv<}K7McVw59X6PAD{iHfAMuU*P?Rc^T5>c2tUjy{FiH>_z#KY z_L~o@AVwVCdQLMZvaFXqyFH~|MhxyZh}mYfp;s2+Vjhz|8xIdezRA&1(F1<~STb-W zaJ-2`n4b$~&B=SbXXo&3DPf(F(yNf5D9*8nH2uW zQ7nKa9qMCou$NVVxHfm+YGol6>ju${?Dt+^@m)^pLV#rgEV(NM=bh55=!4Tq4U+!R+n z7$4&~$<(R);x*Hg{;i%@_K7Yk(!@xT)Rq%o}ds$-*J6qQg$9Oda@h4TSBl3k_Gc4;~{5+ zm6|5B6%MQL7raXr#dB~g>zlh{x8YZA=o+g2s@XfpSPU}%cobbTy%R^1x(O%Z`|2=i)Cn41Y}3E+>5F`u44suqJ8?nz8%n}fXXzji zgTjt*w%K}42tc{{TKbNDl8D4(r`idb-Bt6z$I1ZGvlGjnVVMDg(r1E|m=cFq;!c#3 zmveE~!#CDB!qX}Wv=%^NuCX{I-5dV?JTi?kqidBI0^KYX*Pi8{G`jlmQ~Gu|-1krV zw&}ptzj=U1|K$NL#JYX)h|GzIoM`6u_+ZnwFK_O^U*L9uXFuznx}p?XR$o!#h8}oP zQJLfLUZuXOH&F+%SoGjCbN(BZIC9TXuQziuMG`uCcHa$sBSa43nHN=Ok-cTyCyhSi zi^{y&FSK~(mZ5}0<5qh*{6nVw{J1v$B`T*!EWZ2QyQ8e6yQz>74Gk)D)4>}YYM-uB zqddWdEKta(c6JbfgWp@xYlV11cc^qj3v>Ydz^H2#&W8alD^X}QF1qfmzMP^Ly?m|v zCc)~b1-g*@fa8K_k8G~gHuQ~}B4(S+GN?l4sI1grUN$EEG*`agMA3LuHI>@5*Z)na z8dSeu;8fpGjOehrQ6bXNf54q|_uNfB-8kIzRIrqZ4vEXV4UZnq6+;DQ7;zzKk6Z4V zPSiJ~$5t#jPdc~G2M6mbu+r)<*VyR9&4{Holo$!M8e0Ci2v5fC?+ywf?km(xpJBt# zFQ>F!aS`rQgL?(K(_!5}zO7072TsNKDrHFzl*2ctK{^C|PLZ@?LcuXiY_M*L0(4Qq zZ=P~K))oeKdRMcHz{Rl!lVTT@uO6FD#$MAKz>{okh^n;WYqSgz6FNeSL@9 ziPOtC4Vg2~h=Q*IvsSFeXwHnW{3aut{yb$TH=Aw6{0skhdETKB|D#t@?To_viG?Q< z(StJA89=|TC9Xd+$c}36V|a>l$rV3W1!18nOEw+^xeQX)f4pSwdM@foa^L;!!Tzab ziIDpJ&o23DS=zYr^8^v+m(K;A#_(UQ5?&MUuV)Ba7w>MVr_xhH`fSUqJ<|Qp_hWy+ zbSjp7E8ls2ho0QikgX+YxNcs=n+{|YpKXxTiRie((J)oS+To?8zcJ}|EHCYWlr7 z`T)2k^k|8n4&t;Qp}bTfGErIo#+18fkY`GWZb0w&W+-7x9dd`M%kQnUdG;yAQ1S~F zxSYdcT;yXZRFGBYwM6y!1@A?Eabc69%pg+p6N)f~rtf%`QrT?=QyhR6*w}rr8~=YT9aH|AcYVzfP&m zkH2n}{p&({0YqBvEK#e0w3xFptcz8yH^u|t!@2gexUf~4k$vw59hFL?q@qTWU{cOr z62+4Hc78DWJ)fU{PquB0X4J?;NtF-withu^-r>3Eq9eW$L?cAQQj*1MaqxlTvf^dA z{m+Y96p}kdP_!H@YuDVi8e;L|>irGxm+NbNL?If@?{{fzu*ncE8A2^hpl8?d<<-y3 z9E(7clS`rg<)}YDyb&m%e(1utCsM?RFhBfn+KiMzX6t_$RnT~q6w&mK<9b!RKq~<^ zT7MXW`>d72G71mrIq9YAoHRc1bb^)u&COE;bg(^}o}!0t?3Z}zd;1bOyIv$|9uD*K z%11@J8rm{4Oa4kQK1|0;DvnJbI={|Ysd&Ab-+{e!1`p_k6Prs^CVRNBay=^ zp8N=K^Lh%}clpO9&))b*bJSsup3uXO+7VZ5yo+eZ_bvUva_eN{I{hqC`@ zrbF@w305;V^+I%}+R)C-vUmamXO5(1uk zJ~`>+XbCARNl9bxIOQ3cWcV9Pq0$F(f6(iijvN0aWdP5L&yN2kGQ%57yU8f_8=;bq z(Xr&JYUULk>sC_{kH#OziwTR?y?%1&-EtGcl-9xDegpI|Ul~`uNB=<}pKO|#4{M2S zSB$okRE+8|0x-ae`^72Gf^Q-gDt}Z*N_`?A%&qg!=yD zmy`h2n9*^VXw&_&HYX1W-;s~&g$=swv<;Q=k48xq@ZIfZYT2*r zNbmGRT8~tqV~`6i!F!1(k!9|ue@JbCozOxLP;;n8q;r0ENa(KS5&38N&buW3Q#t>q zcjEuPIdAS+`*h4WbnoEHR?X%l)g9goRgPUfU)MFrE%u)ZC~bUPE67vugSN08a);k< zC#MaJG4P9sFY=VkrWuO$OW1kezQ0u7{pq2D5xtNB!@AA%F)pz;aiTvl(=6SWh?N>* zKL8Y_3M$Jg$%gLD0|}L{8ICDWK78@{_~da@gNZ(JLA^Oo>Sv-vbV8M2np%3|eOB%A zsZVIMg@b%Rw{7w5bc4#gpJ=m&e6@_M0n=>=ky6L`6?)jcXpmw&c`ZD0yG=`-Hlwf} zG4K}t9+8Z@{q1o?3EIqixgTd?--_A0z@PfSxcY;gf2;1{9vlW5iB@p<6|grC{Q3wZ78Y z^$B-yZv#YE-3^?KY6bCyp?Qxbz^XZ6EE%Yz@yYS4-F|oDZQP*xc9{e^$<~n9VeQ5bwihL<2O_;{$)$%^Ry!=QT^Xo~^ z>pI9^#KZKQq_c|;i|s!cDdNhAbS7RhQjN9vAVSutt^%6?3n^o%$C0mXaL z{kt`l(AqB#H2QLL8lF;XU#3OFD>{nFvD>)m* zx>&r`yF2n-!>>l<2{uTa!J2GRz5dT%X-G*Jad-uMaD&Y+YcFiBUXoGFITm*eunWyR z{$Upa;ub(*MDIlN-$4c*BF(1%;*+}#R9ca7TQcWLnpfncy|2XH4f{;LE304id5~%d zP3`z2PWZ}%n!lobCK--RPLg>H)=8iVpj+HJb}K^kOAhLujaDL2CO)`iW$dOQzEYkM z7`!p(phi|Hq+lGlduNsV;{67_hxZeTLrNYCylM#Cr=u`HBI{q!EKIz`o8Fxz>7XlK zYN97wigTbjWRJ)6%_CxEh2t{x>xDmn-A9KEw9X#fz4w#q(+K>;$(b&lheKZ%G|p?$ zpN5C%pWHX`6S$=D5DltxGK-f(^marrGmhzN9euKnwz+%L`07g{z9#KuBpdH_QVwx_ z_p2j}s7(A`UwJdK?+1_|ooagEi_r6WHZHy*2s-z@7lA=a9nr-<$#%;m5Y;b-{S1{pg<>+Qj|Se6r-(@e@+Qk1K9RZ1#W`vcukyH1etUdknt02riT1MZ z>M-Z>;uC=)&~kL~C*Q62gP}!eikRdcUeCcBmH>-mQtd8$&N4-%Kee#(^;Rd)`HM#%&N;#tq_$O;F*qb0{O@F_$G7D#ZEIPO3LE98zWMegKsuTJq}mlhY6F?T|yAK zup7_bP6*6)RG9AXjL;qGs~dpU7p8yaqh{nk+&^MveShV<_|H)|b>X}}T{z{Q;xVUc z*Vx;tdYrxA;U&L)4`agj^CO4{f@)wGao+cBu-Mig^K(G^6xY)BnyvdYAM+1xzF$~O ztFw}LLGX$M%JT>2(#rPka-7Z#WRh+gu<3}&RAut`wE9r9q-y%7#X`tUhX)xQJXrX; zo<_o=j!3qRs>HoG;f$AGK7tFb+Atn{bF4AWnaLu?A*ID2L|+vDBh|aMCDjIcj$2h| zN|g$+mqLN}kTQ%8bt~!59;t<%wa(UQzw<1RJmccj3<=PG$#(6u|B zwdEH2G8*HOb)9PlGLFlC>GsfXi{wAwkO@iZs@cF&6$BTYi>2?&8N@F-cFRBz!z%^z zUfmVS8yST`21!EhiF9(U2DTaSN}`((Poro+2NP@1gXhUdnASh*}54WZ&T?M6?^|cMS7C)#U#{ zD>)5mfLX{V=y&VBDK^5}cT7Uf%L#iyIeylktr0x|JKLB9eIAGU*E$Ca&PD3IxoY~% z+>&34BVRuE%W`FmlHztN#29fz@GO~=g+rRCeaU~^zRXbh8KuIXym-I$6AtV}4BQO| zk?Q8ho#5U}JmFPNyd6zH3kq#grr$hhItDs<(*W<;TEW=(GWtxzQ%c23qYMf}wycZtorNh5#bj#b<96W!8o>B9(XS`a!C z@nC?-*|MB!|A$yyHO!F~AxA*qdcke%idt7&avd6+^*oD3Y!8|Z$9F&r2%d3dbkHva z8X0lh)f@(E!kSO+flfs2Ewqr)u#XJp-R@vbV{uOUA~v&4GIy;C?)kK1USs|t< zzRahLBx)4uNDC5KJvx9RweU&LHY=fV$d8HJc~)Z!cw9PduN*BaUni>fYt7#hgq43u z5FCxF`h13)?DLEUe|Hf>?)*i%jQd*x^xH$C`I?u&U#B9MAwh)*CZTP-wd2XA;qZmD z%u8*Q=XSTK*N2+mBcdS>z$*F^q+>4_a(CX!-r%nPlbs!O>vZ-R zoXk)DE*AcN84x*tsN##gGu1jEw$+(dv+#tI_4U%JKKZB$OpK+a^@g^vbMZ9@DE8EF zDuyR)^}Ryy*v^H9ipD)(xbwP^xl-F;Ay`sdKr)Xs1j4f!VQUzbOvXMvWNX;DLXog| zKZLtQl)3a|W>CT6Q&xCdzlQnf1yJAmxJB8P6N#T-9_M4XJ#+m<<6?r=LqDdX;sTFv zV~X^B>QHLTOkDN+f*8=cOMt&=a94?Au7)J#8)p5WyZj@rhk0OXWj*g$7%zI@m_e$q zWgY>$wD9VvSZD)u*6_Z49toB6m9+K4y}2CWlWzSD-tjK9Q@EB)9nCRSgPm-s#hDFc z26sDsRpmR!3fx8^!!E7k6pi>I%fN5aVa8Q}Vu!o*+;icdB=j_Tb6!*dd}z}0YR2L@ zlsy*TGCle$;tq>+G=t5s$=raEFzHK2tngN6WQN!Fk)zb!gdr5Vt{rhEo z_B`*?cU{n(OvIa$=1gt09qqAFAz(S)^~@%bSTz}jnZ*HC}n1ULFC_wG_L(^4D_4V*6j4uG!^hJ zT=QbGo>DenNCotyu*Y9+HQXymbaQZF_$FR`TaIO9|ALiAtJ+n7wiO8!JsV$}4S^ZA z*C{nBhNh&hP-I<)8AXbF4|9TOS-_>A7roGX3vCK>VR0c>Q}z_udN2j%n$;7gZLx^2 zG&r`v`lSd7=NGh@{`J}kTcnRwJzx_l5`fb%kA_#f6Te!zOEZ4gW<*HCBF=ZUL_(jl zDd7dwH9u)7U|$jH6J$sOLJJ#-#<%(tc#h2pw;MlLI7rX0$x*iPllBv1JLs|HlYS;u z<|#y_V_|Rb=L}tWMPLqZd1J`w}8CYa34P! z&PN@d_@KM=g&+RG$Re49{H#y4&Grwvk$sKqY2qhN?pDE^eL(7AuV{W-HV~6?Bx}Jb zMf00^>2XS;`}Vvp{m;c8@Q9dYs{xV3~8 zZ(6&}O8PASE}ay5qs_;*cXARKxt+c-U&R*cxNj?6V1FqarXLTPqkZ!<&fR%+w!s>7c=TQ9cfFCP0EpPp6PU1n zT_O=ceG|vOl+s{bCT~5Zp4zasRuh?)+C913@*#qu*Ht=O2WTTy2=3!q92 zp_--C^MGw6?X6#Z;74|SK?<^jU494~9^;9qn7Y!`hZEJanhjE2OgCr{H}W0s8~yY& znEp02n71Zm?8;Yk2tTts_8D4UdR&-EkGd)a00@?!lDGr!0F4@H9x||yP6+W!ZtC?W zkM3-H>`6@*UTpLt&s`shqA^`i}(QiotkgJ zxcA_m@T&VU-hlW#iIPmnO^?@4-$;1n7eWmLiouAz%HJ@&(y0sG`B2I~QF*UDfQsE* z>(n~-B<0BN`eQz=FTcRu5KTP2+UM_#JdAG z@O-46#xRFZ9v6Q0p|4@J@QcRcZe}veyew<^%M&9rR{Azguc#yYEwaNcQ#;&u1`8ea zB@NT@?(xZkiy0%jX^3Zz!MxQMDK;ggW5^}?ZOkSP+E_1Tkcc#`mx&^wxbw||>-#bH zAmFxK#L4V#7$BBn;yo$KR6|(!@%}0!zVjg(E~RL1c>dEA0c-;9og-#fG@kG8`||?m z=>w$jBk^HV0987O^;vu#kfAoiVdsa6Gt1~Jn|n1uu9kM+eSNGrwLa@8gnadh+U>2p z-nwif_H5oaed2qDsLOF2Ju!E?oA>Ui^BK_(ydgI}+^h(dM;|T(H%UY00mTZJL`uU_ zi1&8m0=3yk$UIMSvqvhd9awH88yPqpCCvepF-p}p?W2c17s&zu)3}AV=F&LxhUIwp zNB%Bm)>|?MDlN04VsrFICz#OrTK_qwfx~C%HM5?uS_}>BBI4Uxj#HZi>LO$5BtLem zaUpUPZN!b1vRV(VGR>&)fwH6VdBHTZ7_j zcr~orripc00J|6sdFvW|vE{#e684b&UJZ$`s<611U=`;bN74Q^wOnNguLg?Q=CxYT zmC;?3p@%bXk^Oqe0n~Lpg!6!c7`mU#K;lFumG0?&E;|YMw{>dt(JA2M+ zn59j0OZPc)O9)o0zT`ceekJK+&Xs#rf?}&$!LM-5sep^+6M<+dy%)?+<0B4Uf+BRQ zs6hkae1eFG6EvxzLST(dOryU`hP1#+L$Ot-@PUr3TnEFU&T!zjw44HTz=M zG5M+S#0n5eqQS21N?U?U1hcf{3~9oA=plk%s<&n?bF@~#ywzda?grGeg2~K0c#MWB zHuZYLn34T^(Iv!g+kVp0c!;`@_QKH#YZt@OF24-8Zqm|h>|0j)LH$dbxRAa5`dA+q zZv(NF;=|jW1D;(HtBGJwKRwe(9v=e?G8NV|Xw&ygHq9EK`&M&yk!6k^WLPKp9uP+S z-W=C4up{Fec;^OPEd(`0XK5~mx)=1aKA$pe)F#ZpWBD&q-TEF^b|tN0Ie9)fLyDVe zH#DwwC~W5@W}&!-+z9jd0=V_V4jnzn!KgWrA9S=Bmz^PzqC|YhxL|D{z~AedhJJ|h z*vOT^4^ZIaYBsc;H-2fEC}@#(rN0M>Z3IsQc}f0G#Z*s~Daox1;s3_T!`|AD=%w!h zJ+8y@E6lxG$essCcj4J)+XG(F%w}0SI&y1KTc|Gh>m9elylp(Ez+5X~(JVO77mD$h zuSmzX*7nAZ^Wk!ZZ6Q`T@iCBndP9LGK8`+XvIxrz6>uTN=$f?`$2S?nAF|p3E=PahGmmpGx~-7X z+>!$~{_9cn_b^l4Kc{^q;@VIEc9SI~&`&hHk4MxZnj2`Ujcc0$5fn%oGE78smhyu$ z<(mEXKV2KT@5er^knEPZG?7H4H(#t}Oa&29J0MZ~Noz&`k`@o{BvAQo36P5SH|^o?R8U% zk7HHFF&j40A#Hw~a^xJ)ckse2Ex(9st=0T~)|lx@65~-Z&MAv8q3hk&@gn@;u7@A- z!(S98>mV7~1gmuICc_a_uHVF@j4lVfKxzn*BxK#)F*2)07x;}0WPs=euL4LWyDlmn;7hXq?XL*ql$`>!@p@xoPvP zf*5_z6QI3lx64P2mS17wp@}~o$O25pp zqN^L&aZSutH8pQV&;RRWePb$$m~3B7{Ybfjrt|foC*ci_w40?K5Y@O*D8&$APN{g92T9_m&Cd8y(BOVNrWl`jA@ZY0v&Eo!yBACcD$9 zwUarIG(1LI=MrZFA-Z&lobhH^$O#A{+4_Q!8Qj!;tF`(O7BxUarh-H5vTwZhScZW!<@lkA8ULo$KwD z#$!+vm;ndU+P47z;~AkM9)+!szp`0kG4(TMg#6xCDKzRU@xA?Q7U-Zbd{CiIY~$qO z=aheNH->Y2J1aOQR_N}Q{!y!~Qsxoqa8$kd1g?&SVc^wEF5R6(rIrJm9fW*)bMT+( zbKA9dYYM44n4L6k!{_V`pkQHjA0M3n7VkpA%>8p_A0y}=Jz+;bFudcJ8RHUhkzGDg zlUR38Jvi`S@P#l*pUaW8$*+4Wv)Wjc{|9CQR-I@ubyca@KqO=cJtC8qyQg`gvyp~V zMh|;4@Eh;gLPHVWE_XYnqhuIPNoTbu^TB9JC$VUbHTgJB3gOZ5I2yKn4mLY;2t;F> zU0v$hZsHkC`IPg}z(~w;#&U`^?Kbj(aY5hUw?*Zb&huXB-L^%ytLNO}cGrt*s0)>b zWmxkOcju%eDDW)#WL0mZ!*5XtSBNDyIOwSR{7|WcDK(kuZp0j%h$T#Q3RwQiK=bs) z391C+*pKIO56#*oSP5^$m)|CJSaBL z2E<@CB5!8ICO(T^Jo(w+ZT4<+OV8SXi~?dBdlF#HLmJGG(T$Rd-D+c!(N#TS%gH|Z z3%N*-Z7korIY}X-tMVwqaUbTiZ6t9_x{aj{+DsauX?UZn5YbrhjD)#I3B#P5(7qe2 zx~uY6qA+y5rXyoYZuZ-f|Jw~B7Woih*SFo+pOLP6^95&O6(Mpi`4F>f{s`M2nplE> zt~W9vBD^d(<%fEjM(drk?Q(Ido1TPpf=qb&L+=A-NusB90AA%M>V7zkp?q{E1zmh~ z-~I3BfDXfXou2ecgc)K;D#PSoFm4*#Td@tgep1chv#>w?nOh8}2Dl$|Tyk3{AAdef zZt#exg*uGyDO?`8XP={0(~(*@#%9|o=Dr#}A*-gJ24h!ny-LT>B>BdcaNBP=s3yaC z$shaJ6l=sLNQ?c#-O$K%*1vG+v*XZRuy9!wi}j%{_0*(X%oc|%sLPO(I4Aw@5j-x*Oih5 zH7TkR)-Sm9Ot~wAw^p?hD|>QA4GQr#n=5m^aiW`LaLhw}QN5M8TuWHC0IA7vk?eKD z1}E#?P7c4Z(oTf(GAgGaRZa&zUn90*+w4;IpPR3_^vM~L;QtQu#;`?;2(xhM@H&ox z4n{Irn-&TxU~&APFSW^2ao_3&YBp)jR5%q7QjKZ^0B0_0R{BE)lRy`LX7Vkq9ue&@ zpO5;}b0xWZ0M44rVqU|D+(1S%eNOLNEzfpatFM6|KPfz=1il~hvgZN0*#>bd_d({_ItC}5k+3pPy8tuB>KMMgn zDeGvnYS7i6? zA1*10P;I`^%8WhfkX(q)5k1r%|G8e+)Yr2AgEJzdLwUsnu>;CTI-LBOioCVFsF*LS z1SaCGLMn0C^_%=&RTFWXssv~7`kO+$LAx>`XU`D3^Ae#glaCNausuAsBwU?1um0Qi z^E2wSL_j=Qi~O?)q@Vi7S9va-^1+|B%H`28G2lBHTWsZzopX2Z>gdE~62(N8k*Fy1h3HC=%T`apCwq3BR$k zi(qN8uRSV)|Khv@m>$n7i>8Ne>OZ7b2y4QS50e4|r z4{hmpjr||bTq@Wp!vTLh!1HHw<1_DnJ&&9I?Ri|?_EIE|%U{}iprB>>7MFYh%0{}v zX6D2YgdPw1=sepmb~?rfYmS5wFav)d=cxL))`=J1Z`9N~s> znhitfoA5t(s&4=>2|dyj4=qHi5!?$h087AOfM1Y%L=Zo=^aH(LEBQUpL4e75>7ND$ ze^+e}-(FlzLH9;Bti|fnDUT$N|Fmdt68OP!W%zrlzvHl>Ur(Mnx4mMS4lvb=SocTR zi}yQoG;Op*thTFJFhMlbjD<=Wg6oD#hMGm%d)k59V9;7o~cfoaszattp zz4%C<`r9eNdFIRd@UgISu)5849G@yI*Bb zl`*E0jmF%t?|i`-1qxU6cEri8X0k5n+>J;m#bYg$=Ufjgz|Sh0u%`ZDefOtF$`kC! z$JUPBXFJxfpzcH0D-dWytZh~L^7vYV7Ku=d>H!0zyrGJIghu7d{F*=DnJ~)&@dK1@ z17yPyaW0=k9CKWPkNWKJARhpqLE%n!u{xlSMNo57z7_wo1OgB9xmDRruEXqLb7y16 z2}2LuK%3aF3#ywKs~?Aw*+`$Ffc#LFuy`2$Ch!am>S4C_;`I4}~4TFK_;Q^!Ps| z48{3@;4vwMRnL5?;E$9N)GynhtpTIsy>IUa9EbjylSMwR`CE1{g8r}U;BWh3J1v2# zQrksEtyz!du>>jWM@M~b6GrEX89vAwWXJUs@p%uutVye@x~D!B=_kYt2iZm+4-=!V zf~33WJ~Vf0h89gGd>kv{^&X0K2|kA+L1$rdr%O`|QP<@15bdbj%t-c4Y5RcP@J)g7 zzhw}n*$RK{$Q~EbCpb<-ZQ`iW0ofq}4iSnA-&lId{+u?z!W?%>?YiHaXX(SNi{I-{ zZ0z&o^kIHF%MZP`$h=&+{$9epz{okGy7;gVA{@8Z=l-I1I0wF`4`mJ< z5~q@R)lZs$J5gWEy3hwm9dSRt8Qa)aOKm;+K+16RR`zP|U<|x6X7b2R)I!N?mikcu zsb+zC6xoFC^Wv_O1e%LJk7`5=(}@5m>e@(KCHixi@@OP~zg=Xi3J5iWDwe>(>~X-u z!HPMncwKSJa7}2(BfofZzjDVG|D8Am&!8#4?A-1`M7&tty(EfBz%3EnpMBj0yegl5*eem_SyJ0u@CNO_K<^UA$ z&bd>&E(_*5s~hC+=Ni+?jE`GM9?xKV`rwH`tyq?he7fkTT>rm6Sk=T<;kuutz0rY6MESjLj;En6ztA6g2woa0`;`2+7$&xGnjf@bYn)l~wzXJ@ybOO34zn$Zjb-ZlJJ00WFFMv}b z-~<3S431!>ngic%ssM?t9$R*!z{Zfi+-}+h6&+Yq8JJv)^zvU;F5dbOM zaXg8W+ix73$#Qzljdn)B1xTsq^NErPJ6neyGA0AMk+&PdbJB^H_Iz6<;j zR(^WvK020IqCswkkP&ABkNJ<$h;nBjm#;sQvrdU4hfoojNT)Fz0*ncR*g|E z_}&*Qttm(DU9~f(A?_XBg>!+V6(P$XpRT-cNA530y}NtSG`;6~d`p_g0@cY=IsONR zxShem4>XybMdgZSEu8z`A-(JRLvQ~SLFO(nMMHM@nl*x zVF_Nbx@8U6xTNBI5x8kE`!I0=}dhMoN{Ltaa%V4=Z0yfCcpcJaP*Gh>bGExEs_8iy!pCor$ z8FYxt|Mnk&J1Gz9+--UN&1m3XBWqD_*BCo@6>ocWyyDX#mtihGB*A>G&T;B$FOjC| zA6>G3{`B0Pv#mMeF@Bf0sLJcuGT(kKYI}I`1184#$q2SkgCz9!Gj%3L_nF&kjVI3@ z4IiQ^ex1YGlY zbS+W0YD$9dUWYjq=*Vl`h-XJ!o~ruEir#2s#v-^dZ9#KN;t9OQsn~$j<;{7cR8vZPD~0_q!*r5tKh$x3zz|lB^iuQF%!q#OHG=z*Tp?Fr-oa6QsheDS z7<%)X_Or+5pP5cw*jb}B((8?%3lpeMt`q`mK=^Kt<*RU1$i6-2 zRDJdCYr}UH;nBc)dVl@iwjP_-u!Ecq9UTe3j%|~9Zg{W0c4rL`RdQripY8an7U~56 zGKKCc(}|MVtjNwB*6f<7TnBTF+`|L2M-~;G2YV8H|Gf3AL43A)R5E8vIc+Fv#e6tw zXu4CYrYuhjhb>JjpIpFVm=gba>yAmP!?X?a@KLtfTIWI8n!?)FLjJVg2sZ&Tp*Fd> z2Z2N~E|T^7vTsDfA35yUl@#*F^-^07Gy7vz9K_>PX@b8kP;wt=t%jp8bK|*>%CT;5 zkgu(%Jzu|{i|@4(G{(Ad+(=~CdmXHvTahmTpOL7-sjFv^pNu7{vb8j4HEvh(YsK6- z9R;n(w|zX*?b$+WhevN#jlbQgkC|bZe&Q(K%93K^ZSJ?;Z<}sZ`X*|A_v#6A^#oLL zWj{C3{td;$G7>y3|6yI zc=?Bf;SAIDgD67g>*0~;!kDIcm zDy+z`uaMkAD=`kQ$Nw^5E!5ptx2X{*>W5bMtyhlo*sB!khS~ZRnRJ8lXFEzIPbNhR zhfUy>0>viWCFnArd!#H6#!OxKKdZ$+rJEVFVr2H zJFB66{`6M-dt;FMY{|%g30X&!p)j(|AnV9B_HE2!=6AGwKYgC(`8|L9eqQqjbLO16 z&vjqd`+8sR>vo@{>dw=C+Mw9gO$JBA+8N04fN0XAxeqy-o-8uLSv6h_M~lkGku)7|9<8p6Q-Bw*==O zmD*e$<{0w}CRR_;+-=P@C$gQneDObsa9->){Sy4kT#A2*p8r+=G9-8J&S6zj>AlkL zI7}Xa&dE@E2kV-IQ9M!Pd}`oEZ(<+bwjn`7yOmvSM~-fs``ETwxq1nMJqm5FGy)YNw<{o9dC#wC z+H&TOQ-6Q3mPnfDs?Blml-%~_*OZU-zQyGJdOm7*P57Mb!TjC3=jNw6#O^7eypxyb z&po#6Ge^A#1>ZjX)1lwdF4^b|sT1Z-ZG3w;MUhD=tL0CdvcwA#J!&%w)lVgaQhkO@m7P|sB)FQ=2svlb!^pAc+e!B zRSqrmMKTlWji?|lT$QA)nxa~4rb;rrY<~&}*T6!x7H75vU5Zq&zq{SHoQ;9(?%8sa zSoIw4u(r>`hZ7&lQm|#J&+7?IU?g`mYldCs zLehE(G>Wv96paiEv6-g7wi3V!E#{u%MB9)Q@WEbv%F_zRzI^a*KEB?oU)b9YTeC_X zw8Qri4aZ0i-i^xlLcbBiZ@E)c#__&Xc50+P@#f>v^%cb?-Rwx{BoYYvmAvhWdVJCS zT4)xj&xuOeBMW8s}ToD-)I^1fj+X7wskv3MuOC&rskj3r0A<5i1YJOV4D+gx-;_zurh->Hp4fdS&30nbnFF&Z;iS_dB3z1Mq>eOellD`ph8MNjJt3ez4q5i0*A zn<-4UjLR$QJlpE6$6dnS-s{*3fGeOp)qwTKeljE-K?2$VP4u8_Q_u*iKA>pNP4eFb z5L$!u2ca#e>BW#~8QwJ{X&72p^F}TtKl2gRjE(jbQ0zPu%9)FW6*iv(Xw-|`cY?+53_s`ex)y3 z6Xlc>ov>umiTLIjrEE9nICpz28U>4QM&R+D?Rgp-&hOJV-xhnomQ)rkMbOA)*|D5>+hhH+z0z8^Ky8ob%@~-}``bc;Fq?8%1g)J>xpYcJL0X`%fJF9jbwXtn{6P0UHyM zvvO*8M^GsZgYe5RtltC+hku`4v9z=p!wqTsiaVTE-c;k|2<7Bc(XjYxVwHu!0yf); zk(gZ$-Y%#Z=#jvgboNNbFO6P?N9m~&*QJ=%wv->j7j>)((;-8(vFWbD!?i|~bNR7b zSU2wY`OsF%Ku)`^%xJN*fDBf<(z%K(r75t0oRby)#vHs?s1ljySz|Pz=GmTYJz+y| zOH%`U!bkfJ=qO1q`mFl0V^wp)QiO76bN9xaWI`?|bMpyrVJ?(0{n)*q9=a&hLayk( zkpIe=32fecXaj{eC4`aM#4rKssV=vTsE#QovSS$hG@^MVLMm4B{9!JWwk|0R-9-~8 zp9kA}d?@%2joXj==ij}^9ZvG8TeX<8UX5QR`%_5GE`n4R5peR zuekJilj7N}kB1Eo?d_(~2~77Q7qQhOpR1mE-s3>{E{>Ot)N>(593avOW=!>P)$pIH0bZY{JYThezHGz6<>^K9?jIi^Zl zg;Ywu1GV0YfZvfB89t)5_)2)(+_8jg>`eU2CFGw zaslM0+zZm}BZ+sKC%b>sb*AR-x_UNIu?43_7ok*xDA~f-{=1OG8*rbCT?g!5#<18U z%*XV0F?YkS|I9~$66afh{UYO?H6eygWI=KG?Ar^Gg&u=&z0h_~36En?!#Q0DcoEuzi8j-7H=^Y85-0eRSC@N#9mf z5W!QT=@|Z zQdKnhP!ay(8$BK1(3L4ZSk57xZ{r(z-@GtZ-)NAZqo4IRY*YkJ1vZQK*O*2p8i7*0PuMtec-!YbmeSb{#Pr&l!X(;^ah^615+l>ES)E<7M@0j zrBr4!eQvkk;;M~&VLPXiUK#Z`v0=n8GRaxWMf>bYR8O>Y9+yL7edOQ^!idlH^BL(N z4>g$~Zx7C*lbh9>Pj1P|fEVLEi`N$=^!a8T=Dxk~_Jj>wST@8CLW=Knp?h*pt}l@b z^hPR-wGAqp4{N=A%fHX_wojJ(SkEu$W=I9^^M!24ea-sorVET3QqE=*ms2neMqU^b z;Usxnp~t1nI=16n>Ec=#_x|ABAVu05{)f7MyUddt2Q|7B+PRWMp=YmpjW;pad9=?O zrm6Sss#5l4fyaHjXBW?Ax*dD31Q8w7)df}>Q`{X%X3;+PO8c`3He_vT(_VbxEE4lqkM|4)a z;{tag^ktBFpBm2uxjCLJw1$SK(ce?vPv&Q}veLBfz&Lztj-7OpuYY^}z7#vx;=l!U zk&;U(G37}6D*g;>6>CLJWf&4j#NVwv{s7$=#Vh2IXw$!lQo4c# z>TAwQDKcQ;RRCejJT;#Q{-bz$*Gj^&PixH6h(yXKp@Kr2EV!pYBIheAo z*8cL@>*>nws0W?qxZQoss|7@Zp2DFDEP2mc9u_MnGHVD?U2o*_Fd>uM&la8Kd?fyM za2O5HE&yjEA9}P`KzgBpprd=Zgox9JuY7)-%2gEGG_=mqpeySPaHe#<5-TKuwC+#l z_cQIP7>S+sky)(45QcYDhZ2f2XIQhQewKafv`NY}1nl*VuN~ri6OBtIbK~qGkxzT` zrc{39af0(^Z#n9>a#snYMb5MkZy2;?JH+|e9s%}I5sv?yV!nTgKd%(EEa$QIPNIvz zO>%P6T&OkF`xMj5dmV;NPwv(9mjR$rq6r_h@fg`>3;Q6xU;QHXqg%Car{Y&-`AHTF8AKgMN zjjmFere8$!kNBd^PlrqhGebsFzzs(td*^L2R>m|zx(wQjofc+Z%hNYAJz#=p*R|Mw z(NV~7!kp|W@`1B(1qE=cZEcTqJZFiKZ zAuFu_*`o2qP_DEjmTNiTC|0`_wb-o5`PkIdAxD#AE_1+!q?>;ZMPBlbP+q_iqydI} zd2#4YdaQi)T|lN1nEtd-11YYUSNU}i`^bdTh&_USF+~ zpR0AH4^XedB=v8)TEM2(EnArvX8AZ^$He;PL`L{FTA4q-?Mq%0=Ui}k?yis<>U+d5 zb~sT(qp0V*`{qE`y}8l1Yo~7PwJZtqyxY&CEdx9)kq0XML*+KUbclxTJsykmg09Ns z<>`M>t!nxarZK>^v%5<7T-ST0nRAGV*|Eh!PS>r*bgP-?OIA=uCnG<;K%~jBDdH3Syp-77ol=t+0(VoVr zvV-+$7^mLW)tlNwxtYfX?csETppru>NNu=I-|=O~OGH{=Cx@Mq%b|4Z4bS*)cM?ys z_3ej^@3%u+}Zz~XA2Ql#c{Hoh%?%1LJMb18pSoZ-73V`0X9Hso4e zkJXO!lm+`?i_G^z{-1RIg}^+4)8e>H4z8>GI6s3u!d^6G>k?RmGwHeVp*W|<*fU3= zm$vbqC$pY|pctgu$h+-YXtogWk>Uf8SFX7A^^)kpg*j}F z6SIuUP6bfRZ`49dM3L`-WXQd3gwf`q+CFc2`Jn)bjt|?ryMR=+1qi9kYJYu+a~`09 z{(BSvmG+EUvdUY{oN*>;zA3fd<8MXx?nhLw>A|j(CdrEOQvKh295ITauWUu`@!q%E z{MMcRFev9HHbye({AAYsXZO9gYQil{Ka47(ZQIIrMGW7M5Tib>&KV{&f^(xx|8OSC9aE%(mQE9Hhq;?8UgLY5eIiXWIxM^!6q0 z4d=&3gj;laogV?Jw^?NMBl(|dhZOR&)?&X#Lniz?`GbB}kTh@?*U=w#RiP;WZ;4I? zpx3f#VtC-1Q5sCd&O9649~p2jb%uHYoHV5^Rg{ zs_W$APmT+u(e0yY4|90yR?^H0+MFl#k== zvF>l<^~AWI-|Y4tEB7T#Cr9iQ3YX#U%Q^p!jwTf_L%wZUy@=k&p`l$ijR2>sU(`@W$}7k zyWWduW+qQo-3)$R8X5Aal`aJ69T0i|7_S`nh85>ZBl99Q_tAN~C(%_H7s-B;S}`Ii z@;I#wfZk%S<_KjY=f)3&=)rc^3t0b>Na@E-n~%?Z@x^}bh8IgjsdLOZKn5=0(nYb_ zL!6>c6su}i(=U=1Kn5{d_2&o$zQlDCR1}HTZ6_E5>EY~b1G=$iz#NIVk|4h@168UW zciBpe%I1k-ZHXCiqUP}GPMvi0q6<7FKf=3w^2c!{le#7N#%*U|gJ-(J^K>>>m>2c~ zQ7o7tqP{`?3txW!@Dyd-;gy9*NvhP7yGxgfYq{7i*BAwB7tb6qJA(htS8Ktta>OLF z+oO4Jo4OTwsLfg|Uq^^{Am)?7-(gq~)H3n|MI3J+Is@gYyS7*g$-+{-)D zp9aJ#aa#FMeU}?I&#=%<>x^Jv=EWwU`D$*MT!i`p)(<#j43Bx=L+v1$uTo>+NXi5! z)l8QNhZFJO*3z?Vs{WmI43%En8}mp<$ov`u1vlt$)Y*4wcGJ(X!TncNRm0bkT7MxY z?dk@ygO4vWqVcKWgWY*ip?Sy($MVh-PMU5Fj0t_f;{!Tcds8){)W_vs%ZZcU<(zSh zdWAj`Mp|4p0?Ueuf5}N_6=}SN@XTqR6CUbTaoeHe#5gFE)Ku=Gikg}?FAG3vtY7_6 zQjj*XqEqUi(K6$7DAaTa>c2Yiq#?5w6utRo3rhkzBgR-iI2hLC3AO++d-(0H1L~@8 z$$Aq4gfMT&EQ=1Umm}{s!*!d6cE=~8Er2Q-jZ_{3Hj1187n(cxudX7?&?|E|K;mEq zHv?T5ul3c&oy7qzm1Y7(w^j`EDM2hLcAGWSgf9%p(+c7YV$8=n$u7Nfk6#k7_m2{+ zXA;!oT3}e_nViwe>!cXT?`a3vr4HL4`#o2nUn!Bk)Go!SPhGRwB_~{0_K0nJ}YK z`q|>7UXHPbG^5TBueuN z62D`Np2HF-^02DCJ@5TDJi+i)i=wf=&nokP%4e*uVsDO40Ntnm=`x@SHw(q^LEwQ_ z1;Gd6i=BD2f?4*3MmC<7G%^0z9gdmE7%&q8y?t<_Gy6D+k=dVp`Xe;7#?n6X*=NmL zyyrx7L=!}*>&?yEMO3nA(p_{{_v;ntQeUv*kIu=?K#uyqtnxzPH0>Ku(suMm#mZ){ zJq|%5RJhTt%N9jbD;+WjKgj8vc+*!dN`Vo;vqjR>V2)MLqH3Uq0LqMIbD~N|OOM2= z$-S{ChB43!#b1JLQ!JN!jhJUOpwH(HLb{CIe+n;#zl0a3|6k!{pG(|2M>K>sdV)pU zOHZLlqc=tg z2U<^K>6*eYe${ZTY4+IyP{In}h zFhpE?vqL@vCOp~w7;t0Q6lub=*NfL;iu@7B;+|0u;*Evf2eN;fxRc+4f0M*=xu0 zf7MjIZ)nRyEx{Z|k(LYd%ukgi*9s24$F{uvw7R)a3)|R9$j*2EdUZZWEw?{ZZ0y@7<5py&s91t*b5% zqbJ8(p@(82-`$k-NT>Z5QaY59BoENoYSB6t%81Glh&N$mmC(7TW-6$$ooa)w^oF*R zMf!55ho5o8N)vUN-~B79j~y`maK2Msf9eKXDa!j}IPF)3Le`PwVuRLZ+S^J$=@$=C z(+Pi^f4RcTlKG)uTb$s-e%(rQXZfG=VNCmK?r|XZ*mtgtR;~`_(2!we<-MCJ)=hhq zXV4J8;{sOId1)Qbo9>k!;-1t~nu{T}El-fwfD*ONSuk$YYobcDX)>SvoQHXN4p@`z zOMHNZ>C3+g`7Bl1R_3nhtCGCL(^e5J4%baBrWBqXW?=Ul3zndu?wVG8W4r%LTMx9; z2$<-u(Be^z4pQ~IyK?2b15ZVCM8k6$wV~+L4C#HXL_wW(5`WAe{la}FI0nQ-_1ir> z6W+a4k?9gWWqyl+GpgnaYjSz*EBe!G2UuC?)Mo2QPV>X|=pd@=W^lvzSX|P&Rw!(e zNLtyQcAdDC!Z*2fThAmjpf830Kgz?ctP0vU)_Ws(^3IUx_!m9`iCy#KOJC{I_o&Pr*qKaE+i(4K~T0ro$5|>`kHR(>v=$VpwMd$_LZHRLDX*zx%Whli=f zZM3!G#@Wa|yumLcTKcj~W&{q3yDD|c(bgE_1-5=y-bpF6OI}CkC9mvTh*&HB5X$}TI=IEAhJ*>1G2Ug4or0j_?*k`-&iLH#$ zYspK~%aomY+|W*$H!>VQ{(+lIEtvh#57_m)fBAuBLWc zv$1cqMe~9p8ePgqn}Qj9)f`f5{F7j`A8snVj@x!)YkGKOqiMl$r$s4yZ8{T1 z3TIUVUt?6lfRnQFXPT855Et|W#UG-&Q+gRr3w32QcC1dN0vj>hbQr2IS!$el?XnSt zp?=ydGv68eu3D5qGy=;UDa>sO)8!r|2t@WV-+m!C7)1#YSw!mue)yS>1KfiGbB-5!?>{b1V> zP#u*4)C`+Cfb2dB{R)p^sFx$e)k#EN*^iiCuM&j-^qnNe(&Rg4JfYGn9kroNrEkE* z`4fkl=(f0f{S;OMbMXNa%H;@*#Fk3>VUOPkU8oh1iT_Ubrs;r>*^F1r-0fy|AB!2d zy5ze~cJW%-JbKMpt{pb(_*cxwWlxq*(Qa73iDFG|ULA?1z$REl{gGrYJXxNyu`!~o zg|O=>HfY|2!(a<%B@>Ra>|KuNuK%kWrXh52$M+?BhbsiwD_fIcFT2A}pJ zSI%lg?j__m3h0H?$m0k;78Je}2WA_`(DEn7o}1uT?L&P3RTRaWL85#TVxpI3O>&qAIMu8%3Ln;u+>K zARe8!Gv){GmT1$n$I@vX;nz9>xsdh=Ea#8Z*&Vb@`z|#qN+}CM5!y38q6K#eHZ5lf zf`R`D1z?W#5@^a2d2+7FUUw1oQ2jmVCx;KVDF=P+l9d=~h`9IeXFFekbkdUhb=~mO zW;Vj8&*;*|S79U2Mt#R>y|o;kcJ?`8-o0kikLfY#n`+Y4DS;37l9Gi^R{Eb0>S_3d zxq}#}A#soH-Bd|iFIg+j2?CyYS?g?ulJfGO!mI|%%N9xuM+a*R$Ax|V2jDeK4mQH3 zJ>n9)kDV{g(OwD`afg?jl3Mr^?Th>^tIHU8f!_J+JDJ%oYo)4}>TZ72`gJ&~iGH$* zJ2;cjHD|-LH+g(DtxE1#hPbS#dhY4NWu=h{cYcphhjuqToy9df#}f6? z%bnlKzmI#F%nkZOawK?LP~K`VYR6^6@()%(huvLA1ifuu{P;;0bS#!+@ymOxfg3#0rk9`(>(G`o4#4#jA*Td`(Lk5>D05a=Rc{ItpAL3?z5 zT6xxTj^A^hz57jxr)hVkm;s-iXr{2sy7oB+-)984$2+k z^p)SLQje;;xQk&$MNWL3eESE@0T+g-X7zcnmL_}mB1KQ2Z#9Z+NDTgN5LwF7#_pUG zv=)xZoyvyV$$lDC*(WH188mK{`gg*JVhLMQpt|*ep3>pO=Uou5>{sxqA7HR6vGUS5 zp2sn-aC$QXp8FZr@>~voXk^zcxN-n$f3(%^^PsEKD@pH4NZ)wPH$?du4C%4@bk{D? z+ASSv`H(P`Jvt;yBDuk#+jN=C4@h?cdRXs;iTtr55aGQ}wBFq_WvNTmtkCJ9w+`8o z7wuVpqQx1}127f*9zjl4yV(h* z`dxY}D|>w{2uxlw0l{|0aqEq~J8g4~_qveFjNipi*o-VO(muak`)G>H zwP$HQZF|^~!E2CxXbWGwi{YZe`aIebGuL-ELDH+`wla9yu1IK>7D1_{q*1#k#+e2- zmHR%-k65lXRjoqVd=}gQa@7$;`4a@&i z_$Z9BPF9~_d*&c8aKSF;dGwzH8vF-HO{vm|MCCW-O@{qNzYwnIL<^q&6fCp+n%i0( zn)`Z{-)6XYa@UH>7v|&NH(J|jGpXQO3hAXT==!EOcWjtXX2D!D4d~RDN076PEbc|3 z37a#Vft^IPSeT)~)*Z>+y$KkuxZ8ZaY|4oQ=}kg0?`3%r+|;SKjj9ZV>KS&gK(XcV zQ{U2{}hGq}zLD;$smY4>=lG z-S$k%AY*=mlTU-Y9?{PY5nhXy*dvs|pmP~;e74(Dahps|7JTY+uU;2W$(Y2c~b zWujo*LM&+Fl>T`pwNv>8i+@}I2rJ`Qz&pgG%x~&cmIw%ys{TsE8jJ_Y<`9Hi)p43) z`6~fWV)mIu?=#wVqUK3xt>k1^83Zx>3mPnqU;!SeUFoB9rjQ?B0yX$$ zy%*fwa7%}0J+2%dH(~~jENBfs^G=ZwU_{jM-4K+X<7~RBboVa*>?N)tX7QFV5puT< z$osQII5WxRZ4NHiU3ySQIQIx6A$zsVq-na(!pw8A?IW^T@s0faxtGu!piw;d%L9HA zhxbee%x^xtGjPGg_H|0wPtRy^2U1Ocyrt##LdPu!wtelbQ_vD|Njvnt%4~~Ua}#Mv zim~UO?bB6j^BZ6cyn8d6LXMpn+xUz)123k_T$W8Lh>qKuGFJ#Y(_eZ5)^H`w`BWEY zr|$sJ0c#662+mk*3DA3%1Ez=mq#b(B!?Es%Q=OR>VJ3!4 zydI@ydoA>!?k)}J3-gW{zAp|@x0{Vil($$s#7f-QOuu;>DX>s-e6KfjPdl?FSm+Jc z0hbm3Ll5FU)IxWU2rm(Lv>Kllp_lwTORZ)vOkEi~ekNFnBHGrbY_MJ8KlQH9ZH4f* z;@Zji=uRXeh7;v^yl7^+dGj0&3X8ClTqt#!?j8BSLfXFR~0Pyp=c<< zro)+9&)VSSJys#)*_8&h7fc_{JC^qf?(OZe7Bc?et23}}FCTn*gkbZ?V(42i#9Sr) zGqL>MUtOqwiu^z84BFKL2$~ZUHF}|2zQnAm((ez4zF&#z_H;j&s%GnHo8`|-4b5)e zrV@}12x@vhl{Avk>y-Hf*auSO0ycKLe7(n)SRtCL#?unl*CY1fh+1m73g_aE0_SLj z(@t9|t$=UUIqx9@eCiEnT$~%1c+@e7+j+)_U~(K`YHBo;Ziq^q<8GK+K{^v;$FqcM z;HGj$?1YsPXDxqAM})(AOpl16rGnvcz4r(pCM2cnhue zdUbXM121X<&-ZTE2&>+ceL{Q z8$#X-Z@ksHkb6{gj*iZGb=AlRyN8BTdOSW)?A|&CtZj^n3-cZ*RNi>;w79(;7XLB# z5yOdch=Xl9E_+MW@4bQA_cq{df9$CV!!eV53;49qPRb42qBfvUdDFTwSxzZYlku`7 zQ!qb;HJH5CpS_nnl^tli89WfaF!eDZNEs^1TnZ!npk!o>H*a4eB_h@)TVATb13@+a zTH5w=HE7h^W=k5H!wjmo6z~629GnPDp}%ZM4*AZ;h+j&p=p>hxuB;ew0gq?Eb#x~g zba-~5a`jAX-O@*c1H!K*cQFOK;QjCV&fa0xKGVTG2Rh5W)KKNsZ2^Pft23cIgPZ4{ zW=j~n6e-BzI^4%CufxnaT2Pgl(EH%r0l~LsZleZuBFz=T$t|_2ei)1<`0gpS#tOqP z&h3Z8cb0tzO~$L{x>l~>zy7Ff$gipcgk>A#T4Lelbb-HD-2B(ru?6v>J6(L3>UOYngVS z0t0D48sTzBSI_OAyZ&Q`>p=>p2ghoM>(M$| z(qhh|WgNI9&#TGB8J>(c8EcL?vT%Ei=9G7 z{gf{Mp#6XG@r$eqEOMn7&$23}1&<*}Ecg1bCdbXUBa8f5&s}8|z6RGP^g_6F9652X zgtxYRtp~z?5{LhBl)#GTfPi~%qx1T01l&!K?uK~j#f$fNELl76(Ssi=8EX!dyq9L{ zu18}RpZs1Q`rqxp|4yJU1BO=S5%3J4OC{!=h;gYx_;FgtM|B}i{o{jA!~2KtFj(qm z?$8|mzueURJ!aX_CcQw?3^cu$05q~|47BmLoQ`ctMm2Y%ImIjA{L8%mNF&`K4H8mA$B0S^DBUR_T|>7L(%mH>UD6GE zq3C@-?|%PZ_HpbFdmqmSL}uo<*1GDvu63<*ji0=%_)W|^m`F%SHzl5lDj*@D^nxEj z^y}aiN2YNf@C(^aLHr3)UKiOi_ygnBGj%&8Bx1bFA7qonKJW+>Nka6ok`waUB!(Bk zVEo~hZYL6T#y47Qe_wyJgjETsm{>0Z#q%xcMsALmA%RvyG)7!cC>+2LWL#mpT+{WIv~EcfrET>HHYWRw^zmR<=WT*2J0seB`ZF9}dW zm0rSTux*gba zwMryNE^$=0ZlTwb5IIZX(5Gvt@P}Ay*@40$KKKp=HkiMchaM*TU0Hk3n@@VMp&4H> zBto?Kd_)(wdtk<%ymT;`yJ_PhKI1Ede9c4m1Tn6)rv4y$u{EcEtK;m;{_-mH@udx* zl$a10#ag<^LWQ)T{Y1jNVfP-QfkN}Xv`;*b=SEgysm04S@yeeyd=shOXH6e>lBneM z@9A}Oo%mzpJB;Lpvz}{3dWxe}G1~+4lD?|*t!0W3lV7P($=@sfVC~do@iG71G3VZ{;HEfnOA`Lgv7_OxuLLM54DzXg ze40M=_65ug0gp!3#Q-DPQZqfHU6w9oK0_0gr9xvsJAN=R*Tp%=2%qa#~D8w z>1v00q}#u)zgOAG$Y+>`{?e>vaMiZ-Yi;(|20pdY@ZXMv1bK|iFFfYl*A)qyLhP7G zEvm+vEWY5sJMJ9)8cKk&#=ayxFk?WDNnUrevSTMU@@`t<{;<;@(-F|?Ez0nFjyVr^ zWx#Y;?KevJNiCfDbrsuKzAqok4b6~{W3ESa+eZs8zY4*wu}`}6$4mcRMOiyFTkI8H z)>|BWvZ%u^JnlT!HB5lQr=j=R>L)K>PJeQm!C=VOeusy0XjPVP|ExCcR>4kIyzaVy z=2CDWthRKgG`^0}2)7{Vl#pBl(|;|RFw`L`>6)j663W#YY4NU}c)2(p(baPK3=b+i z2)AJI>`c<xBS%ABRj_kQMk~ZlS$xa7n=B)|o})4-(%ux~ z>}I@YCieb!!#^qrQ?2hRgH4s}SW7LM@OzFs$GwI=LUCD@T#sg96%3x|jK5GMUpw+7 zxQuk*s!L?ZSN1v57w1nLcb@Fp4C6sx%bIqE`nc8eoINK;?;`vY=kypO&LdqdtnvBl zZdQv9n2%QuffZymZB@ z#bxDz@X)LF~$MxX+RK<>dMry2g*XmSMGJJ3?uwa07=aH*(v1Jj=VT4oJ^$UAecY zQhitdrMh8xI~DPZ>uz$7lei)K(zV(4-wq~w*YPo(x{gcWy#%n>@FeJQwnT<7VHA2`dJ7jgao-t(xwu7X0B<)fzM6i?^%sK3-GpdrZt^ycoHvGKyW6g9`^yT;|MMBC`mRk_LN_6Pn#Uv0NiRXR%qf|wjTjLrWsfd0qMKsf2S@wD1i4B+Z-6wwPb%_6 z%MR;jQ6%Rv7bc$99oZGoB<; zz7t?S_R(+SQT&yDkU>P8z|L`6P>AT&s-c+z@J+KwyPCm49h>grZl+DAq?X@##1Q3D zBa~#k8WVb3BD4M(f|XBwUist-iTIrVwRKVvfC_6HXdYPH^?6dZ&1A#_(1x^jK?_RNRC}uQm;1m!o2}P!ITCXDF|H3O0qymLSw!rBg8E}%vRIHI| zr|F})L=_uK1!qDu9+SyUSBbnw0z$<5!=IG3%eON(K4Pog0d*{!&;7$+T|tv*kpqZX ztkCKESZaMIb%``rOi{avea^=?rM{d*JS>FZT(5lp8`CjRwwnTptiyJVuIXUhA=P)f+vh?m?V!xp%L$vJzn znPpxCpP%vSNdWfZ8x2DYgbiN~woHaUR06d*J$-MTx~4X*)hmGeg^Ffhc<}=ire{#^ zPkb^$)0L7#rz@EQnTg8s!^`HoC@wEU*D8o+M8~xG)+d&@BZ&xc4->lT7!e)(8p2vW z!6N;cRPsc~vrR<>MSYlrl*Tzdt!r2|dA`%o z_f#j#zNVV=R_}9!iryDxPWBv0v<01uzP#v?d-AQ2bK4rS^^<;2t__^<9OyK^c75J6 zS4p3rxLr`>#SE?o-AD|!3%8f5sN9{ga3CM0Ma8dDtazOSYn@sF)-_kgIl6xU%dS`G6V=Y(aSeJaF zg=s`NPq$}=6_h<;%3e-|In_C2a8^jI=k)c_S3(?fM0m}7V)avFN7dNw@wxf^TOtll zlhH#fy$ZCwEJ!YrXa}8WFo|03SGB+^+o)bym^UYFC-G*FOxSw$M%8aX9y%J_()x$N}7UduAHt?bZOO zyi0#Bmh=PC7(h#J^cLL^EU}p2y{IbXFnK7BxgAK|R$CShndW=EuXPJ+1l5*nm zw2mGXAqt;T{VY}h=R|$WEN+1KVY?rdXwGSNDSaHYxXdmD8ZZ(hX>R9B99n6ztV)35 zOOjeZY$}3`?E1r}iQKBNym2;^CwzZu92RfIeQKOTYCo1gK5(b@4fG>qUtZ1qWZ__< z>40=fE|1Szcr;x#kU!c61=lncn!lkv|IPh+yQ`FHyHDa6YIAJB;=0i6w|tg_lYzuV zL%JquXCt|Jd^lRMuM!EACeizqMepNm8Nw)S3TOxBr7Z}LYV70_ zPkT&MI3C8x%hs}em%42BgSOhY{do};M~OJ!SBmjSithkeuTr{jz1S&YIX2AY9M!Gu z)2(S&%v2md6+kvIdQa6ugd8AD(L1BI*iPh0miD#(a-HJ!A#t9=4LS@T826_G+#L=n zIpK0BZL}Ylb;z=|W@Q=!=BZ3-(9t=l(H_4+eP=$dGnky;|J1di9?oa+DxHwb0bdW5 z7)DfZb2{1k;T~hP1p(nauZ05oWb2egokpIak0?i+=~G0yCdkRa9gY& z{>1r|IxM{WtNE`0++qqNrA)d92(w_@1T--cB!dwKCJXR_S;-6h4XiS)2fo34I%X*VqjH;4QF6NPS|}pPXGBoyOGqaRr$M;01oZF zpv10}dZhrsD9db&xox&J>G)jg3kkj-^@5(8ZmYr-VRiu3+Mma0k~Mvdi`XE+-G~ z3rSGdu>m`=64j}ZDHb5;{7SR)Slt-UyB)@+v8>*r;xc^nT0DZ08Mpsz5F=k4ohJcl zWgmmvBYvdR3Uk1WDtVLlHB<;ya zUmG{PhE7=^286}Bpeti(y$y+{(zEevqL0?^t|&NstKfm`s$=%>1uQ_;?m+xVvw;X# z9{#g}(QN~QfsE3|j(a}&)-!V68d(#XB!(Oy$07@Sonv${zlw8Wi>a*d%OMA!^%K)` z$C6q$u0SS;5n&Hn^ua4$`F@9Xk*>+*_taicXOu5>6+f+u1T>9u(Fs`fY+4VVNNJwx z+uTU2hV1(v=Elje^lp*H^QEHOM?nuK2!tFR)I>&bA%rZyrzeya8BV2s70S~z8!lb= zF#Y?WX%k)Vm+mqr6;&bHVp`zKR~r^z^pVweR#_XVhe0-r98(_fH*1=WsZNWc8EZXWzZTDZ$VXADH67i_aMiM*?8$@>WvEq$ zFcP(>35YNT*UwjKR5|b{F06jL%SrgJnK9L>^=+im)dUP|WTq4t{LB!|C0k8NYF9YT$#B-uDL;tJMe%{p9b~FjcayVs|jemZ%5rP+i`o>Rgar#rAncbWbXVNT2k7 zruyB^K!Q9cEGP$_SElA>U?W@Hr+~MPtL-AaL|Sdci1LK+SC51&pU9!KL{#8=fZWaW_lx z%D%`bvs7S4mM$B7sLir?*w`bEfhggBuecoJ&0O@WYU+v*Qv*cg2JOo|jXG*8!Hk+K zKk}+K{?{zY2pK)yvoWhKRo-5@*k;8eY`H6tbG1P8J=v4`kB2W zGI<@dQilK4#t*$whLWsXtr|bbdv++J%X||f`Q|kKza?hE4SFeS&yR;q5!@5KL7J^% zE_iD0bZ`PN;%W>V+ybZO*%;|Ur%eXihoj^yRwUnWfYg2Hq!BI}Ki%E${T$6E|EKR>hGZ&Uv^ zn<%U?S%YU;J|sTU*x7Whe`1*ag&u;g6j7g}UTo+?4*TGZBc!%Jokk`JPd`&~$)GPt>ew5KfkJ_mOHF!F zE`j)|Ymhj|o{QoB5rB`9Z+%9h$DO6+?fF($32WM2jspBlN-wV_ZlY-rIv3?Tw{bAn zl9Wjw%-fM4)k(jVL&5zl0GISl18WF({LyECf{FPnR?`g)D0%&eJj&T37fs3!MXvzs z6Z**fkrhUZ@Pjr;6r+_}hqUf1;9b8cTQaT6V?rt3K#o+j` znn&9Aa={;abHTz9weBZvAH^vc2L}g7HwE@b47Phja9VxtdN5o=!w&0B6>m4oh^L#Z zbO^QG<-N%seVErX22Ogykjn4bt8A-)kOE=)J z;_!XFt%it>x?Z`PAU;@9$v^x4BRk>eWJ3lQzSC~6_?h6rME{u}FX>$Yr-F-}#0!C+ z+AUh2V}rventIwQW)>E^n^l`a7f}X5TigwUvwRk$i*a^A`T023 zr3qU2TyP?_=^w43{Q-NG z8Y0DZ>t<3>`>3+^K5^?%L?9`zKV3dVSF^}a;@G@QQTCA-h3BbF?;8z0kGwW*$4OdX zuUP3=9@gQtdc;lA*WHDA`T26Xlg6rXf=53>;YOT!J2{9<7V)`GR5SCA)Np@o6mBNyvioeh$ZUMMKO?v!QCQf$Dsyryn(^guUbwZ} z9O(nAiSpg`jOgXJLaY*w`=cfqCz00bHEnF}tEQR9QP%v@;-KA&j&O4JU~%c$3Y=g> zv>u2!WC0hBu5>Xc0uN$m=$e~@$eD???LUqvn@v_Zc6)R`UGp!BwXRj)RcYTX zmnqKvkyo|BSFzPhnyaByv78>;*Ui_?;KxdPv``=9>l19OC%@#i`6aLK-4reyI0GgNI=6Wg zZSOlDx~_hg)y-wh+&2JD?c?gR^J|&1Rr9;7epc^vwMRpXQP<$-!#b|HS~g9D`l>z^ zO?iDq4gRc)L{eTiNqIWr!yHfF;LCpCemV5bC{mj)LbP3V?eT@Gj&s@wp{Z5h8UTkI z13T`*oRd049~kS-)~)*`s-)e2eEVp-5N%?dwR|3)5=iUAAsbINXBpwhd4C9(+`;vYfNFn!h?;zPb49t014`S-{l(+bJ)NbZfTB_wFZPr6o`+#h*urV(BK-QM#pLRcJ1<4iCpQ3|N7xx`_14Cu&ehS1@Cw9?U%+m)I?1N{4EGS>L zIFKA1_LJ+uZihwxq}6GBmj1laAAZ zXAAApRcj;$0O2i;EA;m*iXMh(v6C~DPM)k4%N6s!Av)2H5J7_b6QZ~9&p3V7f3a=v z7TaT=aF-a8><=CIWw2C__kBVrR1CO5j>n?`s9!wQZ|LR`HF)&Upy0kjU0aXZZ`=Ng z%`bh2l(fHiWp#C4_;5B%r;S-dvSth%-Qj{hYY3xJDtm3Ns|mQiHp?*blyeB*|Ph35%7E=Tm0+`1I0}RG{W{1bP;YA&EAA6KcBm(TwCK*b%1y z4Fsg?KL({+J+Omppddag8P~gu2Uz3~^hVL|?>W0ZfH)DOlZ|6gR^H#4QdslP7r*PS z)Er1kpAl#4@3!4auW20dVy)(2D)b{Y@SdP5kj^EN!W*KLK}=L#j#>xHWj)f}AX=Gy z_sdxuMZKIj==lAO!3PK~KfqgsXPGVEUamv~HU{vA7&l0Hqyd^x6w(akd+cTJS|-4_ zV>CDFE_1u~?Qt$WkUvIqm{8rZop;NuuM*L7qR zeM-FpR~u)K8!!SH(WG1mH#hfkBxd#Akfv?dqeT>zop02^-}pDH@uP;O+S=LcSaudV z+w+Wjk{&-WXuk0XBz(!3oOUa(TVUKI%gb4;$ITCkK*^5l2^tuOn<6ft$S0?U;^i8| zjbcLL*?Mv{d5_w4&qF+9qsMPor4>i@_4LSh=j1 z2?!|tR6h8kg5mp6e2K9(ZDyOkJY|7HLr_`#7T)qL`CM-IDDOdF%<~xZakxvJppJv= zNvFvr3PtzsE*2Th5Ral7n=lufbaw@fe-k=c!~ZOv**7HgG!q8_P6)?XemiHZY6mgc zfC2&sF8lQZiY@&f?>mriHe5G%-L#iIo+wOE%D5ZjuA4P>`!3%;+=DOghj=wNH`gPy z!YxZj>Fzsk%{IYZ^4fN~h1t6W547^sjpB!fgd$3wUv`duZ%&pBflgTY0aym08lY2B zKEVr2MS`QC$HB(TY&*G!zm1i=)LiQXE>5#g##KgU-}Bgto4*#gv`LHQkA68}8R2o3 z`yAp%7iR}JAix~V1J;Wc)5t;XQ{=L@Qh&gg0tADJj*ndbvuTo-1XGrp;jx!?23p_y zpoAP^Dlu8So2`%HHXUi!pWce&c_=ap5>sE|X3c?4@wqUlM;~~cI;n$l5H{6-c9+E) z4X0~p@*{hqCaU0nA{650PMY~+vCN219d`kv!arC-TY5^j$xg*z! z&Qcxm^3i7PiItw<#rfvN)S9by6>LvDh-~>K75ij5n|7sPWTCU}*@|kh!+7&o9APrG z49)0AcE)<690twh#hTnxLqetI)EJs0XE(>3Am{y0h?!I=e@=(A88Kunsu4CdK6#Fd zo|u6LyJKbNc$sg<-F_mr0%oT53C>TTq`0QuP|EAGk_aC3Z9qxAiFsc3RXVKx zxO;KvQ@ua-vdDJ6t^V|}_jSKX<45*OJ@vb<=GTh5BSdfnxdbZIYfQQm;AXrNue{%r z^Yh&A%u{il3*_x9d!rHiz?x^wriI*SC`WyJ-P)7Cz)f6vY^){7{O|E(nz317mXKQM(5EFfZQ;J2&po;TN7H3#HYuUHcqn%jV3S0Ng z%1Vs{=LHgpG=&t^0B+63sVVy@=SA)++JOjn0JQTPRhtnrUwwE_5@ZS*$5Dy3DD4(H zByRvd~JA=w#pK{$T)?sQCf5SlfSECdY%>z3=BMT4Kdwt86OjOBoDvu(KaY|z0&z2 zIB22z7H%>gHL`xvtRs<1lV+hIJ%9(IDdfh0w}IQNkE^5P(vR%*n-}P${nCKxsr-oA z-PI}r=@_ym+~vAcsi9DUc=yLrW30I7{`QtMZ+1fU!>8Xpx`j`v^L_+7`4J&Av_q}1 zO2~{Hrx9vdMMG;wvy1jePgm`*Uw^`hP@bifcztELf|7r~2WllRnmaAXf8y#-Tjf`n zp@QcKk@R`~*EeZ;A6~!en*i_m*Z&wO0b(QJ7XN9<{l}Y>e$5>JF~^_Y6cic23#wOC z;Gf<76&vdJpAuX_|1r#85irp|h%zHJTKszff8TtTVsoQWvi{)A!ODA;m#0#>8B}f^ zkeO+%LtgcT&SIC}Phn!d>6V$XQ*9tD0J9-9DNn1gF4)FvkX5{(^cWvRS81Gh#(9vt zL+3YmBXhGHvoAZ;(Wt*W)E%)Vd%tBMAV5!y{j!+%npqF5)wB$H=tz97UFv!*2MI2V zN9i{t@zbKz5>mU_X;*i2?vp*qba|d*3}2{wWNj7A+q&{wVW#0At!J03-G&!|)0&94 z;o(oAUNjmgFo+C;PCc=6ueM896&$O7Lj7_XB$thHI$a&6uf}S$zwKm6M5$xJNvbX{uU~YMZice}e{FRYK60n`i#TyTm^kZ7jK={ur7@Z1EJbiSEG^>EcV;omRR6gTeE150r4gLBUWF)0U3U& z$g=Enh?buU0X~+P^7oN}_m3yjT;Az?EY&R!oUBrA2M20x=T*CrGv2Q4UP9ao{UvF?IL$-*}PmP{e zeHlDFI-plMvW&t9o3ke0P0AQzQgBK-vc_~rLjw-IA&QraD9_2oM+uS>oXCi^uM%{7 zX+qESR)*?>7IMwo{_~iNOP)o@xP*%e90E^zb|Qzzdhysx*@JYU5eiIvo!^g+PQ)vU zgXH9+PWh#}Xkw(kI_03!X>sp7sS!S+JL8qVP;-3KOpVKk>{(GGs&^dRe0EQvGlc^^ z>?tKK!7`IX%DiI}Q{7EFeHyUeNsSj%G@yfa+%6`6Y8OC^-Uy}X_4hGoy^a1}MrL(f z+{In$g517v(Yb`f^nr{hWe5oP;bm77D{b1B9!;7LsVf3ZmCR5ek3Z&x&}ew5=4_AO zr#A*wHOKf1F5W&6u^*=dx$?MvtyRNJUR`PcMIkc_vauSVYsiodV?8_b!Yc!6L4GgVw6H5>w-!$jgB{a-OY#FXsXpDgk3@z4oy zL4A+pJNm!A`9XB<_TNPCuj~X(@g`vKPm~Ly1_P=A+`R^T>(CYtnA=?JZl8|)JDRhHGSMM zo#jt(I*EMAnL`ZU2ZZMC-r}!vcbyEH45Rr93k6qatI$Q&yl#I!jQ3XFQegonWWS8v zdh1sm8B%PpEO7%xRh zdGCy{kKm!Q#aO9v--f%KO5Dj)^VxUXh<7DaJu{FQ>iCPpg=ti^`LY+-S0w_CDmW4S zC@QrPly34Iw}-h$HiYBghh!3Y%{1)6*3TD3meU*0O&Kkrl*~VSO;(NCa!|J$nWc*R zA5cd;bA=`dhBEg(pmJ;00^1QY-DfHD)5-s*;cwwSe8j!O=ia|SXr<`lxJflF=*|vK zZap>(n{WBX)xX?P{T94==98l{jcckII&D9>JHVlOolfB~Wy0nDsS0%cE<76l4+dE^ zgzrkBRI|w~2eX_67mb|@{_t5`WA-kaSt*vC611p&2FDTBW>=lw%Nk(SjXZmoAhtUn zf78Hu6dLj7;~^%>YpV69`*p)x>k6Y9LCT}1>Ks=p5>*2#QWh&u=DG<##Ej!e<2xgg zUA$`uL%oB6INa!yw5*_YTQ4t}<5lFLeV1(=zH5^Z{ZBXeS4ZiC1?V8PPSx$^g`&vb z8QrvS#~w@ASXd{L&4b#B-3|`$A}@oTRyGA$^LI^}{lg&o<-8I^V6*e1MrxW*u0C|L zoU|+w{pSrX)i+z^7$aLRTWpfv1ntxdF#SQbUoH>*0{UaL7CwFPUBpp8y~V{{X4ezV zB*LdojIC!rQQ|rx^9QXvbrJA)tvhuO99_{~uHYbqrC|OZufzteyGRl>Du`xB-m=Y~ z9z~YAIyB#7?o-J9dN^Tc%Ab{d#J;+&&Zs3B!U2C*HN|Vw*|q#^%JL-l zvVGO4p$EbSzJD^iP7wtKCn8j|-yJ@(`z}^&O?4g5F6k;ePYOR|+-u}+NjJXXujFk8 zP6dD0N4PJLc|ZHV;xxMh;lTTOR^LBdHffxFn>!($s;8*_yGMg&s35yjb=j%q0yu0F z$KpEN_GLdGTNvLvc1_T#2v@aiMNG>)>!iFlMdru&ccqt`882^4$U1S)V%~x6a9`>> zahytu_br-9qg!iIn@$J5L)0HE;693T3xMD7LU;P$BB>Q|{K|R{^&WSO^hwO3gR`Rb zj@$Q71Mk0nZI{2Ie*&wG(16_#H8NZQ3&lFNw~T}@pOa;;RP8Q=oTX>Y37dSAe1eR} z2MLg@1#H)er(G$zH?kGj`FW0HhW$4At-|r{I1OiJ%=@i|C(bC?J)UcjtV8J)FFv?ZMmdZhJPRjyq)To9{6dYvhmR z@41ms)efxW#_fonl8dlYe4AZ5jkiA(JJ8WFKS*W!aKt`EzxPt8v&#hKPa^xw1p+O+ zv}Kw7%9xG1l;K%1lxVv}b|^DGB;&$-BPi{C|c2Q4~o`# z6jAGvqmrn@(@0EmN80CY=!+SbaYDDc z&|TE0XX9ZT?ymb;>tkse`2_uqYR8xlq(Yn{ZuiScg*kt3%06BhVPak=6N`Y|EiwsQuW38%ZyiwLp=HJ#ePA8|L3~^0zAeY>b=O(%5mnW zccC6KzG?Yn{XTmE!qTDgnpN2{8DC0IgZZ;R&DCz^_gM~`y|(fzmBKgF#520tr#8$W z;}D!4r2Cn4uu9l_{>Q+a?$)Oj+UZXgVWoKdE53f=^QCQtM+#zADV{s zK{R`p+Uxvx3qjrt5_`ApVmCMPn@Y`ziO*#4@#3^^hHCKWIP?0ELBf(Y?8IaK~t6hG{Y0YPB(4H@uHrmt zo}JCB&6plo%G?AS5FLQZ$PT)AxKwKvw`}`Rv?b2j7VYnQrsma$=(YDr6z%4QD-8eO z?i|i;j*v3w4{2UWKMMX-`?*XPCL8@~(7?o1!M(~#@Mj;ShSok_h;uz;IWyIIH7=qM zumXPfyeNghQf78DN6yN`^l#|^UfkM zcOl&xEg{_!Y4BSb_Gqoc+Nt(HVn6wG`wQB3>L&rMY28I*l9G!$9ohgk*Of6WA)Ge( zKNoLNaKF(5EJ(c3f7$pJzohkiXbK?C$Z$J9THNlFVt-^uB9@ebQoW@rz*nBGNnEAh z5uz7!V~3kj#i;vEF@T9u$(k&SB-J?`(umHWaN_pJZu{(Z-bs~Z)&jZdP`L*n=F}$3 zUwzEUbEW3C@#Yb&DoCq-v{R~CHW0!y#>csz4U+l zBqKHgF6y+~EmiTPDYJVzi>lTR8wa(n_Qw=dI>KK01z_GMwD|Gw z*CeT5oz@9y^{06bTRK=SXE*hgDXnNSl?XMar=iJ(8c@|ZxJj8sVDw{jrdz64vl_TG z#Y~AU=l5(5SvudZqid^9=Mz4Z_i)WN`d->rY7xA775$gxnYthqpEw2^;$ zX52&+XN-E1QsSzE*yuP@Y+sog&+?$bIi5RJwDxnA;qsyxZ*h;Kreg)m4}1Tb2$vX4 zWHYLW07NS=Q6D7QXZt1f-Xntq9mb*4M@EdJ_SC)2L z6y}7j7Sj*;uJY2QB!ukXAb1uB83}+Ayp7;?bWERRxdo@1D_|>o?l+vqkQJAy?i1R` zMe=dKN>fWxz>_{mKCS%HiL=nXC4ZjR%@VF8sjDaPm!fbvjxARC1rx(TshTi2#Z%K8 z%u?R&;Ozbu_sH%CpeTeGwMVp;j$1K*^}&(Daa}9)Sp!r{v4i?yDZ>Ph)2!r zfG%B5NAbG#-D0ArPJ-LEgnId_t$lkV< z>_gp?uyL9F3A=9nS|T-Lz@aU&UshNiE6FBvSxVN2g{fTbTwG4`+^=62Sc3UdxvII{ zP zaF@mT$WeD%t>ah?5Us8-{W5-@0(-SQEG9&uV(b|hpy|($i`2b19$q$7F)%O)SQh{U z>mPv0EK6Udp(Ssk@ni#VusYcG%j(W#05>)^Pk8$qwJo6Rv;tCWbo^$}?%Js0FG}o> z5UGjQM=kv3{Ev7yq!EpCa5Rdjcm-u;+WeY*4L-)Gcr`u4m4VD(1YHICxL2oWd51O)>@(r zV*by!<@_oka5;gmU!H#v!xb=C)QiB?+PNEr%!&T2j*||N6P_1mwt%JcDWB-&vMVX? zb@r6ef*0N+KXa|!r93W9rptDf)vI8+T7WLJz14CzBh-wQb>jKBS>{b1cDuo;OWK>x z0A5(xw1+F-vf5Hr^pWRrf8vAGWjS6(;;4`H{wMMta(BNa)+%%y^p~lpTW2DC_B8uC zb}B6^oH}IQR?N{}-#)wP;yUkBITVL8e{lA$^4&_h*kw*uje7o%c|e?Ig1j37F7y&Z zP*JSPXWkiOAOQL4ll3S<^Wn+vGWE`4cO+N{zq^#Nu|vf7<7VF4dvnc!p@89PLPvb6 zRcstM60Xc?(shG{A8-K+*NsEuHab@G>vV+9b`_60tv%*st!%1OOGC47=^nMI?rte% zuI03b(zgflPBFlgHIj?;n=qXLYwB7+yz52<+=Yxe_1seOpjOazuo7pUxGqa2R6%6d zwm`G9qkFl_4y-qX4WFusqb_C+{WaE)?RNG^KuF~lv}|~ds$b?j#^oxc znf{BEXoSPJl+^KwNEo>{NCVbhk$=`B2G7YlxAb+0=p+VU^TCU#EKDnC}zO^@$( zaO7upSr3Rt51n1sIu*=9VVU@vwLYVke1B`*Ux}p`*qF)Xp#Mmcs37~xS{AD-kGhmZ zg4JYYYq+XTbZt|gOw1%;UoL0o_;YvA^sK!_hQ-cB)_!s(&bTCqveh2W?n>Q|71$Cr zGd2CzRU)cUD1itXlP$IB`Xj2vtZRL5M zlg{A9_<#`oy@mG?Me7wn4v7lB?nqjYA=pC(9jrgmSuxDR)QSIPCUi=@i;hwI)<&X$ z2WR~z?bmOMfcy0Hx_hGEc^#&4f+a;Ag-_NvNw`eq_stor#B9!v_w*%7wdVck6P`_P zFLxD>^H^5aI25JnvlA9HYNwA3+Q5`m0UPQ;Xi;K(NjxCIebP<%VEJv~mTO+LwoxRb z`^mnHZiT9%VrcZhT7SZsil!!WG%^23?4#9{6~lTj_Wc&|JIXY?hUC*T_%Ch5*8Tt?2lU~ddSA) zj!?way_)%wV*My5FE0WFK!zTqbI2WFJ6ecoL{2et$(p*wTS;+CdR=~5;j`V{cKo$b z8x@wLL%@gSuG;Q8tE~y=422di18#D#1*Fr`@#Ea_JB$mFny(Ii3-r6u1~LxEwqCo% zEuz-B2$1_MEk3(0HRB7j+Pbs+`D&EkDc0T})O4~hOj5!3?C34^B#+X>?EPYsgD=-m zO&qn1X(Ess8jWSVI6tT}Ax`9Xw1QQqeFT0`%QLc`l@Sk%IX&w3>|)a|t9@s!+u1d6 zONyO!w}@^qRlP$(=u6R`wf{e8a&4)YjSV1V9%t zf4D3|3t5XIF%an^c4HGXF_T^D(#xOM5d%b3Azd;lqv58^s(E3#WmA=-!@YhWVbqf*tp{5&-{v_-zupoi$XQP0R*k4wqL3&9{pK{#{2b}Z*_0V+b z=#agVXc+&Jil*hD#Ur|Zl|+}h!afg()U{`_iZ1%3KJQH>pi?&{bQ<{~7{UO9@OsP( zRg3V{Fav%Vcid!%^Loj!ajZp|{eoo5TkCm&&FY<^=@)mJS)wiYI)cK0V1S#I}5U)^rxd`wY%lOTz@P5|C1lK$z<*l-t!*2kc z>$gn5j_fI!08XUNa3k@+JA|JXv+W09+m^xtf~T+HRU4I3 zZqvjEDzdKFW1}XCPHn9YxD>Ha|KPF~I6IgYzMq>0Kq@1R$8bS?d_6Zdx=619 zas;@$u{F8<>El=w<}Y7z2K@Y=I(vMnvk68n3{WS(!B8VD))xG^Q ze$$Qq=itxNdg=dceT`rb8o5c>+}Kc|jkcfU_WAa%V;EQ>#M69+}(f>`VY1H&5Me)EjEi zQo$sYGbp0W!BtBXU|-Y?-urxH!t!tH3)&w5gNUDHDu*Sn(g?rl2H4j9RzcKK?#?}J zdjQ>YS589`_|3vlAxd9`l@Z9nJaipdS$R$&V*R*hb3W+-(AEJFK)^WACzOs^*328c z0M7Xb&==~O_9U|lO~&01Ti@NBGOD&8vE8<`FhaKm@{T}e#)(p3d~>ayIQ-^8qQKE# zcwW_q>w@8p=?RP!f)%6DxFaFD)5YI^?ZgNHi|k4gR-5!Vn6NK}0iXEvE3`~rKX>hY zGk&T2ku6I9y1P2e<1wgf`p80R{m4S-^la1XCuFXJs=U>U`V!?}Sz0K#ipTS?WBnV~ z`!tXJ1a|;;pWdkkeLU81sx-0`zcl&bmUT<4zAL*sG`x2AKlck;2v{=Ea_T<%Ec0Wl z2n2c@9yoRuAGY^T;rAt*R~s*1BcbXryjxDA!nT3vhrWCcXQszI(deLyUZ@b+}-U(E!6GMaBlK=8#|L~{D ze6n#-dj%Eq$J8a!l&5@j{Qj=2hluK50VP=IZL(>{9_LMI{qVoH`WA?qn0m!7 zC8++#3jX}I1(g)3J)kQN2h}d&s_y4MJSsXwARowJjuHW32M?UW+WyUz;{qIX3$y?| zEQErLrm4mFW^s{~H6V!-Sok=k1%#QY>9kkN3H&W#`01kA?t>4BR0jgbUPx-ifZ=|Y znly@74t@ueQ0ZU|o0#DT|7me$d{G5Qm|0&e49mIxB5o|oiLAu_uivUt(ZLwq47zZ9 z3?cp3;?ZY-xe`?yFY7E~3jjJm&0hQhx7}aAw6#qwHEBE{O8M_aLZBG@7}TaWkSsoJ zZA#;tb;sv8M@wbXT-F=zppXbEsqKyun0J?)uXSbp`#dlygL(NnvKR*WH||=5xiyn} zL30IFk8^$4%gCM;x-$?w{C`(PL5lW^TYSAksyC0cgYY@1gU^>AWpFx=V_a9FpM^M{ zj@nSOWz0$NhU5I}SViyx*M~ipVb4klxmNq(Y3b&PRdw;vcHKq9RubOC5m;JnG;z!I zLx&KWDaYiR{@;yVez}sUn}2_DBT(1@row89)kxBmPKi}S(WYyxy#C@k>BsRaXe#L= zHWuwxxi7@vR6KG2&pI?Q2CZ^v+Wd*?aE)sI!+L1F+nCDu=yE16tsYv9Uw@dcxaGvt z_Hvr34FRA`_`|7zT^=E?a!i}+mBPVmn0k^ix$jsqhEza(c{1`u7>=HusIi>hV4?4NzktSx~( z0_)Q}5 zwG2O6ck1#(Q!1VX3RpMnZNya+li82~Fqs>E%4dG9%}*xtZ(4}<^c(g;*3dPlkLQ}} zDDI0=c>7%GIzls_@ai~?|zDvZ_K#ro( zzxrkCzK{Ycj=_2qYB+y}1i!b~T~Nv{mXCP%ujJxy*H8uQMO2Lyh^+s$kAD7XnIK?+ zVzHtI|0l!Aqzlfz?E%;C(ftdgu|)!JMs&NB@?Xa3uL1dd#{t`Yqdv#%zd!L3gc+om zbQqL%eoyYtp8+xekdB|I*uDC%5BuvZrOShv+(rNL{C`@4C{A$Rt4`ulZ~WsH{{B}C z%8CWi>*4)ROJED!H?z}JAOHU}6CwcoISHAH{sW@^9FQ_9cKyEb@b3<)f6hdm0nCKi z_nF|IZ~h+87gCUA8~0H8--r3X5A%Od=Kn7z(=cjG@K0MHbM-Ip__xxhg>L4gZ)&HO zmTwJDRZ+$rl($_<4O)`MzIUoH;DxKjkEq?@7(~AYtP}w&ni|z=0Obpmi~r^L`!E81 zf~T4vkXj8cFt`8i+#BSN>fAfFK)S5}B>d??x+yILoX*`_W~e^A1B>s*vjd)7M7@iM zr6-^QTB=83`)AA2lm`Ld1gZl4qeyrlK?+375z{TsD6wl?esf&U?~!t%12^Uw4)jnG zKo5nm=-Dm^II)kmtO!|5>4TGQo1j1Co(_?Inbq*5kFkIU9_*s~I@@{tfPUR7O=gy8 z4yEhTKMBLH|E(U~CPlG9@uFZy2h3oMqY{h1RctKCecY04w~FT!#Ft91g%v%)~Uvmz|iQL4T7186i&dTKgN_8+EwKE?~}9@{u6dG|}kHtue^n-@V6 zelC^iN5eLKa_}+&Z;_Rrk2cT;6x65rT5^B8)B7l1}uk_9ohQE+YJ@$nUxt=3lC%`)6Ky4+g<3S{MUI?XiY^wy?Lv4)l7=7e#M1#F@d-!)wRtnR@3NW z!Fl0z0)22Jg$U{GHUF}>GrGaOnDjfzg`@{GN0LGyXWOQPY+u-_>+8lPU}6t8K0B% z4C+4UNOs#|$+c+5$A~Qmkx%c#x_9&>uIl^w_QFm9f3tQwRvhb!(=r|Op4C0*_O2Aw z;5z~I!d||O2=GA<8nhT74D^4z)HxsqJYSsB_Y8`nt7ezF=Vdqt<&YltZ+qh#du|*Z zUBe#2x_W$vjjt{;*8xwizjT?TVgGe;w~t4)xt6&rUCMJECJ41?_g69Lozt}dbQLmm z52lz0RfM7PMdN09i6P!tfj?h}Fqx%z1(KXdSb|HiwyBUy%1oF?=OEV(p_FBJjr9*Y zd@&*c4}PAQ4g&>rk>L3^V{I;seUy1;1BW|ejH@RXZx?d8$K}&E$ST6@aZ+8Ttp@T8 z*>HxhqU|qs(j`8gOg#0-@5a41_kpw;*Xr|?K4k>bSX=(rivG2(QH<~3=^Z~C_GuGD ziuh^bBfh^a`o2p%y_k09efA`Bz~Rw1BeI-qF8Mr>=k8SxO9ZD$;xBhIXId8%KK3%D z+fvH@Q1bq(me{p}hlPD(na6)m4mCv?SL}h|=6$$$Z!x_vA(9ftP3UJ4d+7x2MD797 z$k&q?s;Y9cgWWSMdDh%TqELwfTdUAm0{@n1@2vWLT0#P}e_k+VpE}hN8jv;C`Os<) zt8jjgn-{vu1}TTqe~TqMYr;9fJqZoXTVcy{E~E|Mh?auHE?p0o(>O70&(L}&ahPd% zNCfM5`XE-8!xt(^Nu_F5OC5J}h)XLBD<)CK*m#b|!NHW$Q}5#O?JSpxw=Qx4Z$B_@ z7iCl!xfEFF_?{G~#a}A5)OZdNoXAtbdw5WE8}jnFI&`D_6Ha2=GDM?t0o!^P=cF~T zB2VO|uP1-g9c2Y|=(d)`6>Wxj^rh=w_PcqeL&-^<8fgkrwv8VL4vD8S10mWd{Q8#X;SLp?e2R>*9<|Jw@@YmUyC z=S-Ovyb_}bIlrd3?C_>ND=!kZEi#{Cad2!F_tI>1BBTy zRo359?Wh*7I)C&GUydCW*jv8qVO!{AgRP~O#?4J0%L3WPx@pj6tTD;m`O%0(Lm6G3 zo__iOcRxuWQ*VjHNT4`BXNM=WTqi|7eHV-*)LyJ@E-I3ki@QML$GZN-Y4Cd2>{nyB zsoKRYZu(A_^WC-|%`NfrCm%z|zV7aDazo5ndEGYLcP4g6On=0rbtloO@*A_NzD(V* zTn!8AJe$$l2&?bi^gH&P8r{7sTBxSm5q)1Wq1{8_D0DUW^^gL)~b3YA=VsDFoRQ<-N`D}^Xcxtj95gd_vZLciq{ByP?RvA8R9v$bpp-#fJ}rbcs~6^0<}UP zUE#cG0+)PZVfQ%Aa@42bbFH?)F_!hVvggoI!lIcp(-IYKo@l^*O&X0f=-!;h{9T#! z(PMk;h-I=r4W;&787P85>f2+qz3MGWnB?%vGq{MWU4OZ80K?=Rg&>(@>@EJUpq?kA zj8x(2uwORmE&h-K(pgK5WQWP-5nFGQGTUV%A=UVgkSdlr%A*hj36$?x@KY3Z-KeS`yrUCP_CvG&uJzG z{O?T$g0*`g^-ugf{5{&+`t7ySp#A;ohJAO_qmJ$MDGDF`ImcK9Fvm=Z5+RR?r>-yG z`{vqI%aD+v5loZt?uWjAeF8l+5H+501%_)!Z)wt;SzXUVte8Zb=g(=~WuRx(Crs5z z;d@xs`l1@T(+9IGZDLU0K|ihk@E~R6R;ced&>e+q=W3C=o~p}d69+~L*{VZ#gC5+H2xVy zz7V9oj$ao%FNxVUMPf?VA(N4P1vYJkK$$(ltrPz#r@p?Y4UatQ`tPd^%At3tHf~aR zPO&?k*IvcG_{V(@DmFT8bj5)+4!@3@&9h9_U%#H&+CO3Mr;t8`edy7= zDQ-S9H{4m`q`y+&8Yols*L(Buv<)LINLgKuBo@_|wX2QF>P7vjZLgIOAp6u%@IIE&*vx8@r^iK`3KCN77cKj*KjTD;IhDT) z{d)n68F@i3#E8qGIe2tZwGMtO&j~+=ds}U~10#Nfre*ohAo3L;nstgLv#q40XoSi) ze0b^)o7~U#hI8ct@J+#2;g_RJQw=0iEZXdseK2sz5F)Qs-{@y+tN0#UaHM5hZQdJH zMrcW~YTx|_kK9+7)+`a4sIANd>%;!D#G5pzYczrC{_`nDMAb)S_kh7TCT2?6nH$Js7>@JOk2oC;@u)vu@&~F9B_f7oVBN4YC1`!jn=KZHR zcoStfAu`8UH|uu$7E+uh`I`Ol_#HhEkLp}=N-`DlBabZz=~*;igQ+vH>fcJ&F8pIh z5c^yy;j7nJPSMf&HF$ls$MdneLQ2#&@~gP_u^H5_qfJekBkg;dWL7x-STtq`olB_U zwe8kA0R@HM*j7GW9}C%&Q8(A2WSdzf0uJ#%zY)mLI3b!R!Wt*zY{&{v|8o#%qoN3> zcS!ucjpR80us=8|5jZqVmB90B5a$DC^jx(xOT|!1lS%g-)tzqPskfm1-SZC7 zch|JId6`l~UMM<4wkv=Gu!YC;zyAHSKUI~UvogW(ae=t@m1MN{0QyfRxA7DvO zQ88(-tn!-oG3}i0d`$u+Oo8d%dJng<*lzLml(onA*lwjE(S2y8sz6Axl zp2HfvFbe**H=r(BIaShd{#?hI^10xuo|V1E!cMXsEVuyjpUNS_E+G zzK$k>Zde1Tewse7SS{KDqr)Zl--<40NBes9FhVi!0480%=*8&{-X^h96k9ZYy)@|f zxd0~8^T4l_>|qzR169@?k(WWJT$NI-n;y&M6c37B<*_PVB^d}-(= zW^eGkAg7Bt-ry-zbUsGCI@EgZlGxZncamAOZ2QIOqO@t!%a7POe0?8ZKIC^;(JC9a z?JO6`d%eQk_;nVPsi(#pLFsR50Z@YQli#CCg_<}&hkV}#Ry<}bR#q5RJk!J zaqGaA>;g^F%nq+TGni3k<0hyF-8M}e(m&K5OuF${Luo*7If@k7u6X%`n@(HPpG=F2 zKX$Ch7)y!K9nsD$y?xOmw2;%4BJT7geVIpTSUp_&+_?;Nx_oAz&Ub<`u8lsIyTR_H z;%HVB$z+SZ+`SMaRtlZ+y6_la&(Y>X^V~2&;e(4Jzk;T2&7sNZa*b_Y=@rI5G6ylCA@-tPqtDf?!%WzCFqw-%@xqL(!ypE%9npIM1Nxs=y;7^@!yYBQyr)oU6VPeQBIJ!yALJ?pqB}p$;;tRkD z9R{^^DWG+(po8sIng=MJ#(PELytg)^1*BmSGxlBXudlwl9BPq8BI`VH89SFHWk0m0;LRBhO-lR0azPA<5^nAr0?Kz3QXpfG>1+t*@IK zlPh>H9LE*1(>4a6k5JqcD4WP5KmRZOC%>U}IuJ<&`y&iS4rq&`=NQ&I5O9 zbLaqsk_N%NDj&c$5qVG))URKR{Lq$zGmDdAM`C$>3(x_QK%;0u#AmMx%ZV;P?}Ujk ze5J#XS4!le4r;T=AHUi}Dy0b)>=<9{fYQ$*;8IG3&Ntyra9$tRNx{q7%?Fb|cCokX zbo3gn)$!A)XyiThJjib_b&V=eK3GpOJyBxpy}#|Qg$?k^C8s_;kG;WH=7a*%0vO!V zo*jms5I~B_nAs)Nb)0lD6V?}evNt>+bvIO=bFKI49`_i)2l_tfl~9TczVB=Z5mX=J zD#=wbMDjL|<$Y7xcCd zm)RO{vM?-m=d0@t&X^z8-POors&^|bzq8n(*jQop=)GVD@yobS0h;*TSroX*e&an+ zJ+9Mv9&A1*7A!N0y+!T>XKiMeJuSEEddv4oD-AJR6LDP7KqgzvG<i z(7A{41LAB3uCYAj-Yb)=W#oF8fv=#Y{#ATze>>uFP9vWhOObqHb zA>*P#{ToRek{yFa<6?(1_XpU6HfbAZg7bVYty7K)!zHX3?K6)aez>Xc-MG-F@e4%- z-}An(w%)xw{Aw9c#v)a8Z5Se=Wt`cbskpJ3p$R7XglN{yBT_zoPlXzMqP#K9BTrZU zrw{0Gn99DyOlkWdXG*?WZe!hGVx93T}^FXClRiJj+{27 zSHe2EK7M0}8BXyf7t095`hLf|-*pop3Nq+w{!=jQ%$2A8e?5m6XAbvB(MAOkR_~A- z8E3>;YB!Sur((QcS!r>LWkvh}$uI%v+g{IDftlPYb{^&2r{{sg@Cdes@0HbP9jh+- zqrt780gYyHBvZ$C$`|k#rC(Sq1UQW|;fAJv5TH69h(g*c z0tz!i@08EnCUJ*rijaru(;jC<=RWo$J_P8=cS4{_C0iTb(3-N$W}_r?B+ge-+QCuG z5-p!_EwP+v&OR5+3BO(~4@D5*E8LZ*4?W8vakx8MlP4d3 zuOdjzd;d+t^#!?&dHYON2Vw%tv!rfL_1;~Aw^AOi?-h;!_tG3N4U-!fsP8Ia^d}WwW z8ml(f1ut${pEf)KKBF6SL|PUr;&rlK;lDa$?SbpGdW^a? zLE>z;-?Sr!-9K#*bV(jsYq&V~uYsFHKiwyv4Di_48#cN|mbGxu45Tlq>-&+5!G^3C zEPg1nbj+klaj;G^MSIsINArHcc7D4XaxZD6ndcfj(DR|DK>!X*-0Lyjm>})tIpjzK z=y(g@Ibu;u=J)I%#;D!5KKT&udtb)Ks>e)JV`$v; z58ECU5HxLdUXYFx^9)^BVg zGHKDm6l)sqh+lak+DlCzOZGiH71iBb@nH^fe+$z<_wcfj1#{4?5Yfz#q{UM}g136f z&sefptqn)^#0Sb0U}t}5h{=TBaX*MT9$EGj#YU#u`0YcLm*h{FVxHb}0%sb7c)COr zlh!#M1>4qi#sQ9906vWu#a!l<<>>L-?Er*4FQEg#GwWGHbt#@so|W7HU;A_Mr2V^ zAH*;X8aeZXwb{3Z*DQ`(M>))T=$`Xo)+R^%7P?&IItA#xSWCL(hatJ%j2+DQZa^fFRz9E}k64pI@w}kZv4sL%$ zFJShhL;VB#;fVD22sz*7&IHOC@iLVOV6Zz?c@$EDw|_2l`Op1nu{9fP%Gy|rsU+j% zSV|MJWrT_+WxS;;kML1?t+!NGwS3o~q?ymSjoKg*Z0{UwJn?eiQw(9!$Ze=$@wzu* z+sS1oSn_?b;drG8DLKcDPFJl=NC;{p0{ihleQc_Z6prB|14z3|Yj2PFhrwGFZ3$~8 z2ISjI8MhxPD)g&0I=r!YenTmNFBF>DPUkf~?l5flNkBgA!JIv}lPVKDoyv+#%R32|rZ4yovBua#%umgpWgd?#Yx{mNrKy)hb!*cyXj& zQj*m;y2c-yr7@my_|eBc6=a%RxcrOls!fDYU>hRW*)7*jl_GIU+Amlya=HgD5Wu=B z2=A2NZU}rEC!avA=ky7K{QaR!z>m3B+m=d~Z2c!XcTAz*NZ332IqhnZZdb0E_8?nc^1OR4&&z z!S}`^x*xu*wJ7F>Nn@|h`_cuZE?`&ghn@Gi?_Bi(Vcc7kg{7c<<{D+bh@AW&D;~HX z!6Xd{zfmJjo{VdK+%UVKn`s-Ld`Xzd+RwtJH;ygt@FT5oMMrtIBHRriNF~CWCWQ`M zy}Qj^j8Ks@H|qiVDQ)=oIr+}TM;nqL+m$9$bsS=JP59AIuQvDb6JAk6wZL7X+%sA6 zHk@^;QBkhfP=Ss^zkr2?B!K{ud>90kXxl2Cm+rFp4mi028OEcx{P)Ki5+x<} zImP<QRbmoy)sjb{vy>K*Jw8fO@kU| zU>5Llsv@;@4F^N72uTi;#|Fw+V8@g-JS%kjwLszjERYUt_%%6ug_$)1il|5yxKgn_ z8$3jS=H=4|YEw5$_s+Mx@L8SmUMoC`VdM+CRpt14^>CJ?8$@%GN~&b33kWqYPsw5a z5XSL0kAW;XI9kx!!16;YSw`&!Ni7mvL7rX>a%!>~CcXiiL4Pq1l3Bfg&WNn@J)%+> zn}Hx296yzhE3rQ@&wJICl9ALGnTxOzq@~R~zC0Pc`+KgCUor7Zgp(y_i^-|8`g7)$ zl7u*OG1h>znx;q-d$DrGD7JpXoAC~vPKmyo)*++X{Ds};Y&H23mWk5yLOnd6HugZa zodt5*b<(qa&*i@Z8fKXjf5$M+nTvZ9{5b75wyr%(oO`zBztsx@Jrd$?AfYQKU5e}( z0itYGIXSufp>cx8(~Ul+2NO8A zzqDyI#pL%sz7z9h&kc3aMMdJLTrK+r8-8xF3-_A0R5rafZF(5Vb&Y!gbI`B$RxN~2 zQ9@!=iqZvW4e*>o7Rshsv}N090B zUoE~PPfrJ#U*kzw(feu5n)gvjio&40{zuCT<9?bV=EKiOYD_T}S3R)HjXmS#D_I3< z73hhWV%4VOjXbd(`@eHX>QvQ3oN}{TXwc?2;fM~7A_OIr$mICK+wS-iQ0kJ@z@@?~ zp@?t7u#V3Y?+qe}yK^$E0b$^8;JT8qEagHxJWj z&;k#TL-b|ogLVr>`%p=@I1HqKboM7Uq0Vs4XUj}`^T6v`@trh%&8oyYM87*>bb6xH z3UWIj`|*uzZ#bVd5jJ|CZGz6vk-rZH7H(DE*uNJkEh6e9^8hMZomtjvj0pDQFjGtfAlCNX%H$0FIn(G!GgB*fFBMj#1}TP)cYc?YE_94Hox z-<kxRn!A8t>`IMU&0=N~H3sSyo44GC)$%Epk!_JS zAcm{kRx&uDIFevyh~V+Le-JOS$N3Y3JQ*7>nvHA6Bv`HVN02O?Zs2k1YSyU z`31Ol#&u1Cy;c5>@!RJMtqZXZ_d~5NvI|Q|wGv7+hA;M3+$d))T+M@XBQAN-Q}aEQ zpQfH;D`Lxto(GM0Zdrlbmfo8a31>YA`Q(V$B=#feD~hq7B$C^{;H8Nu-0Hs;O>N$4 z9&11hE@BexXDI_uY*R6hEF}=!F8P4>$IY=QX2gsm$nM$!bC2P$5Cc-M7rWq=tce8_ z&@reHzPltK4np)-gtj&`u$uv2O$YKdK0&uMYO78^gCDW1c3h`)cnDJaJ|JgJ6$a{E ziFyh-Ydjz8tHSOKqcT!^!v<>Q`HSXhNT|(xS|Bp@3rC1+DBro7?CHJ{r5K|HwphY* z2(?Y?9?>a{(2?(gE3rY1509!7jR3ydJaQYXIGSMBaW>S2nDI z%inJpI2sGviGLJ?Vi-}LsQiT&3er+G$U{ID?4se})OnD0#4QD)>5_`e>72qThLCoP zj1!?&2W37qG0jR&QS!>Xv(E*))Yx5KrB!g2VW{0pfGav3x?l}k0a_RBjrUaNJw%#9 zItn79SyXWp^KIhL8#aZ%J%05jEc<@k7dM-@R>=cvol?Gr^J5EMNa)_Y80-aqiXLKk z$jIwVrv$gl%{q~J52S5*#|OOK*Cj=A1|6Jvy$og?UR}Y%$qn94D1BjhOJ))jl@h37 zHn(;3q@eQ)%I@dal$0zjl40`ET3#Pi@bykds7HmuC0VptA9@l^nXQz>S|*Kf+qjgq12Oek@-T*&8YRky8A zn8u>L;6BrhN2bAi`T!}NO$drMg@k;_RUH?UeNa(}`zf!Orclj<_-`;?u%;$EIF#zx z-IT$Po1|P5upgc+f_~V%I)W5Wo)vLFxwO;_P4s1FY4lQGzMi=O>M42_9fZdNvVM#s zA`GGWH&N-PmqE;NSVDOnPOl1OM_Xye&J4$J+1nfZUmU)A-!S5xrnWtLL#Dmb>N088 zUh5i9nVDV6fkG3;A#UW;A@-H?)^iYagk~Bb1V)+9cW;gIe7F+9wV>U6A?PT*S(`~J z?``q064%yl#uZ-GsIa#zXjOb@RN4BVnG;OWt1)C|&4Q~Ye^u1v6KSZtojIEU2gH1h z=P!(v<7!&1_6Xg*rme#52gkhxM(lCF0lvwEPk}s}IqbhF5Te-NnkB&)){XpOq(X3D zBLf7X1dFeft?}Dexw)MJ3wP7CIjlPgDR$ED6(F8ggut!2N-Q53XFiy{=>H;k>(mJ6 zN1ZP4HWqHy*WILQSmwvBBuS%C`!tX^oABU;9f|b*sM1|x2@dpDN;f!bEmCCD|LN<9 zpT8ysb-~9mLdtIbj-j0O6LYDWm0;IZu8AyBFaCgIom?rh)4%ZWlSR*>EAH6%XqAezTS>7Z`0uYTeyM@3Fqi zfw40`L{$=iw|S8?V8j(vN@xBR3I8DL7T_43eTY7(5E<{2@Xpa)yO*l0Scpy-asfBpoY%;@eqo@sO&Q;n?-)hVK*+svS0hgr!g>umF%~Z4VjmBMZxWwU7sTvCpupVQU)6?-0Hk(3_|Zi zq(^0}Te7P^HwS&wi4?f#O0VSmQXMC}k|8F*BH~5$a&CrzaFfC6Pl2A<6q z>n9SnM%kN#gqJ^&@P3xnS0u;~GT!mOM7~I~N$SBkJ1W@zD)TP}Nuw+T^zaEo-E#I6 zDl+qW+ABke)`jV{DZp46l?)6Km}sMP2swj{6j?WB9DKW@0M&BeBBpTx z5#Z~Loxa$z96(J7aArUrs*pVw*mJ}3>lvyZ3HH+ejxm#ULYXy0@$KcW{i=}aUKk~^V()(cq&ac(ju~-^T8z-k(d*ogr7VWt zH4@H?558qh!}wHng(h#Hez&iQ*-1pz5rlG2`6&DVDm7GE2N#;*D}ESh5>apj{F92_ zg*gz5S)EScC8=@HLnyF7TIpH7B3sqZpe`U(-3w2$!&V;FUfC3HU}`bZU0`j2eTs{* z>$fpSVlUBDa@)$GkA%c0kzPhTS^8bym6ssVur+6^Dqs*w;zN!8jSd7Xm#N`l!QFqB*GmKy?1?lo6kPPCq&Yu4~>JFMz#p5gH zu7i4Nx49*K(5<7^d#s}%sr(}DVGqrhs;!>yz~|Dv{VIJSaUHrg6!7FxbSL)0qvqC@ zWrW1(R`bO7H&4QRX9DX&g+|$oX%Enq+DvR^tB>OJpR)@WzQ<}|P+vJG%DexUt9p@i zY>~{G{D5|p2VwjUSzpzxXnzyiM|zf<&edtQnn~QnJUCcpka)Vs7gb9zWd^tLeMz=y zqtKo*6;wx`C7O;BLUB$|GW!`8m*k-@g1MsKZZkkI2+~t#N?s|ty>`6wDe6m58%@#a z%c%>UEkpY!BUskYMoF$sH<~j{y9g zBP(#%mQA-??73lV9ILIvUTFegs10X=Jt~U`0K7{#% zaRMZ?e%1KUMTGAkwLM<6QE~*oK|A_7!6+j_1t+fhrmkhE-Nkl~mG7bWBmHhAFRz&` zWK2XmkMiQRA_K2CS?{Dyx8zVK9pmCz$%i&de~Y}Mtk}v3sXR=_l>v4Hz1Mg^cR|Fd zLnz~b=h1xpW7Q9MLf`1K7}=p!U^Pz8fqD9bB`_4fn*O2N-qhyVBzS|)ZR2cfrWwy^ z5Fr~tm0|!#RcQQ^D6LaO+^&VOSgeGTnw8`sxw3~w|t5~%wIqdqB5Cc1JT%YQxle8N>M)^_!I(2KB z(l1y%zw7r2?fR5e2(OQETV{y?Q}5llR<+Z8JHBq93u0k%_T$+ZcR`ZA2HyTt{%08S z^iLqnAIWu<>>l~RX9Pl|k}hY=a2cgswRtttrqI{;J#->N*o?7<<|-4ZvNt1q>3U{$ zPilUybv1Lj`i!#BM&li>I8=cAv4uzleP>;CQObPeX$aTV@^7+2#6@1!KdRU2~8Gjl8r@3I=rO80rR{=_8otuk5YSzSa^TEAF?AyT&hykrV0-qm5un}P* zn>YQQ=^)|JL^?`^5D#X7+fZn;Er#O%fLh=9*!>Sllb#H1pt8svc%!t-5vVLXsTK(lv$1Cf2qcjT922g>? zCF~`t9-38xbKo(5Q$U|FqZ*>TMRjLe0JnAXCRtV&xPbepWsfjHeK44l0aDB)1Mo>O zDGK&5E#KfJ*Peki7*w>7LO)H9I#5*y4HD5lZ3}DB=QSGH?@HvKLWvDfWVHbaw0+Ed zT+TI~HDRGtxbe3t);#Cx)UfB#_z-66H+Dz(qj={eP?Q;hS&?YZiu5`++tt?WE1uHx zsQzYl!)|-mXgmUCI#a;aTL6@(Tf{8)u;%rw>h`+oPd2FTYRaSQ-}c_eUMJCY7jKiy zvp&K)4Su+Zx2KeC!#B-`Oi3SP-rK|FrT?K=p>eID?{V%aZ>Q>gplFHumx4$RXu1R> zFa~d|qZ2v4>4#p&+Y=^CH@tn~>!{ev3?~ki`x@Zv)BxFL{^N1VUus|on6=CXckY^k z##{b1m@4w=Sm>~Lq!cLjs=#nk-0shm5~urg7F1kw71YDuUQBOyT_&YVu{1r!4MUiJ zyivBu%^N>1{it7zi-5)=>XK5?d%E}1H>29jaZfrkW3>E$*k*7}-K0;6{t0-hmq)P? zqdImGAPw~z5Cm_kep^T#3AXLVU7|kn?o{`x}m(uz( zkW{tLKPsG>E?vC(c+jK$!v2}Z1>FpbNdL>mMNP9rAP}QhN<;}OZpdI#N?)vD!r!O8 zZ>Tgk$L(ZK{m7bmob4y$8)h?l8G#FGL%FI+`D=HH zePpqav>Ar8IH*EK6p)=UD0}&)UfByMp$$O9XIRJ<$@*U%o!9CAc33&~wt~gWs;Ba0 za;{^wItknrLS4}GRZ{xm#_bC%lpN24P_(uG;GS024`O8`A5`3X|I#`{7bc7ZC;S6U zLqS-Huo=Xz&SS2y%L5&=SmTgAN$>sIKbX@I0zbnzSo{NXne<6T`*+tNx>>oHGR<=L z-;CgxTge^a+G&5L=3i6>Y&=`4=17se)2X6`3=KTW*acsW$`!1wv=^Q|M=l3S=^u>H z&$49oQ@*f!<|faQ{y^96eo6$!)pH=derfbF9Qi1HLgplcDXN4xl=PIY#I!--bn~A$ z6NH*Thlr4ag#+u->eN!XNDAfgQPLNPI67|{<}hKrlsqPC#jnr^%v%tm9pYK`;c}2s5?oJja>-5 zipur19alh)jYb7|3L+8vY44g5kmgmswV`*vgRojXzi#<;35fGl8!s@uJy=8K|5lMG z-$|P!d;tppe-YTGY+LMm@`DwxC$Z1!hTk+3Oi>)0Ej3S81qauwPi>A(tfr0B8yeS$ zs~Q@@l4kYn7Lo|9)UXkmlsO&2G8yQ+e$hSoSepH}mM4z9WF z8}e@@qD?P&1)ihLvqpF_?Xtq|xE(xi%#n$pw|IJYH&np$ zEz0i}vy(l4hxLrHv3};R=9EqJeL|fyXsfY0Gl#bf&au7OGESV(B3mJ}Lg zoBd6j(CDIc6`5jWx+m5#(=G|@GJ+w;yhZh*j)&Uus?_IrD$Vw<^a%yhpfrH|jfO%F+0i(z69+0rx4v z&gWPYm|Tdi1z!#>K9^|bLfcDuzKaSb zZQ9g-J$e*wo8F6`E~zerNx3n>5iqP$d5%Li`x%a9wANz55LitA$d0OG<_!@cflnMt zmz3UHJ9$g@NOK^s^Wv)3s}6eg1u0dxSB?Rk2o+eGa$$I54UCAKm=--{PB5HtpvUh= zKmu_(Y0V6&)3IA={pM7fK*_uMbeqW@XSMUJ54~?1rRUP}9I(;1;sRx$5M1eoP-=FG zcDL+C`?u+`V=rdk(6^e^B>M*M0r#P@BY7 z>rAHf-`;*I?2&A{bz$~iyeSK+uZ?*C_wvkZT^YSv5xNG-YIb8r6@oOQ#NpsUc%xT- zVZ_{^W=Molbac&Ximl(Z3>B@{pcMac#Sx5@)d)w8P)#N%-SmZqnk+}_Y zs796O&H zMFQo4SJowwH0c?H`hmJRTg|0v#+xNu3fFnlqo)go>v=Kvmvv&-wX@{Y2_S34fXv;X zg>HoKBZ=D*Tr z*gDXGNyb$~?)`F9nN_~PN8d9aldIN_dY{LSEl5*?j zV<~ubR2@G01%z$CH2b>je-g?e^POQbQuY4-Xw-qaV{skc7E}cM5|E;4=mq0(HT{wBWX;Pn-MGbRL+o|h05TDv9uuad9D%K|s9ezmh>eAx- z>QV-Vud*)hToX_j;%kKqpMa&A`$qm1#0mGi0DsSPk4|{>BbrD zvf{GLe+P_Th^9~CHVx~&j{X{>(c$@mTk@t|{qT{eTFycG%GCGW5(1I}O9;{pOLy0M`I_JF z`+NU=pJyMQyUV@z%$YN1X3m^BpOKOemd%^cn11%!kvMrt_#8Mo-!)ID8qL%dl;NmK zJS8)_im{4Y@Ubw64IhAj(}2r@feQMLy9ho~>t8xA-p3%z@`eL4?#C+jsE4}^Y9snp{)SJpilbDrb{ z&5vV94RD3oX0CzGhE)oyQ5!2EQWne0`>xl@TX0m~xDZS?* z{{`7-SW9q4kTk(~0I?!UX%zoBAm+a7XTWYfC{M9IAfd6A8gD6kQuA62;Vx1#bU)8} zNR8q}qmH6KlTPK7=nxcFeOg}Y+O^3xbR5wzzoR8KDmgSVV>6bp6P7htY^^3zAo!}9~Rx;H` zY?uIQ0|5hEu6UKhrbS0~#dp1yf>`=aB(2fxS(++SjMSA9o)rC%boXrozS`W3nn9WR zM_46?J9SJE|LCfI+kmTI->txeZC#C8U=PY`ttZ{Ka&79VwG6-(JtlB7rPrf!#b z>||P7tY*DWHxf;c% zX657t-Gn%%#4#bTZi$4xoa~ZqrKYt`6ST&NG?A+ha8@;3=4QXR{?J(LDLN4Txs+-R zVz4ODbF~}io6SouDM_*Y{JOzz0d7z3i6du3zeeXjV7XP%d5ihP^i zBe(PhHt!?v7SacKuWwCV>zpl9R$_DQLvR>W81%X^jMz%?ejh}zUTnEvn)r)tB6Qm) zF_>Br(W~KNj>mY05EzpOmS||8`p-gs{_EJ|WQkd-FJ^wTTL3INv#QEIB=1Eej;=5C zs`N8daU=#wEA@ybtXO1Mh_7}z!^=c;mGUlT9Zfk^Z50V|&P`B6e`Q!h^sSmPeI9(> zw1RlH_ikjj5zIcGTm$xySf*aXX-KIL!WmJeO~#7}kJEr8&`jHf*{6>qe#<8O5KJBI zDi~V=Ig|tDS#E4ridA6C`;;iC*k0pR0*}RK4N<^Ck81^>DD)78{l-hM!U z!}B4TY9N}uka&N&zq9yFo&9SJN|y(zQ#rTV@AW38KBo}g<%A-GJ4JeN(FmI zv@lL!Tb>PxiBd#vq`x8|LTH}4v(sAEIj;$-x`V;L0^9?X=$HQRVLAG2=`|~vUw!`( zDM7Ge(?s0wZ(6$6nZ{(_n#i1S`{xmNs6EM)SK5Z(Br75X>h)8Qe{3i*fP~bi+!;1m z21F7Unef9mZ6T7Bzut?`$9BxUHhJK^aZ-+UxrF>Z@IO1k3Nmu?rdqz%^P>LB{G)>3 z|AsF!HeA{u%?-biE2V_YzsiV5n4h%12FEMb)gUx6 zh5K*c5(!cMeQKIB0PRxwTY6UP0G?F+Z^QbNt7xDz$1XM`dw>^uAN?~2aNOlN`hPxI zF=&(h-X=S>w0qKvK%-v2hUw=WP%dolpq0Wv=kOEu*(BTSG2C%V&Yv;>99qUguS+=c zjnrR>{b3Fly^R0URSkL2O2!Aabj?V?qM1op&A;?D~Zz}B|${7Kx#gSsbcH6qJxmj?8|9Ooy_Y4Wj-wH#gRq~4KX zoTNqiAXMajX)OlO5%JVX%to&S!n<(9-R>RJWRJJ{jt|do4*f8IO4#sx%_yw&H^K~# z_@~2dA~c@VFcm9_yw^NQI}Kk%Wxy5RMC!>lghPgDPB?l^GnyzWfg zCJYlA6$H46O!W-?w#Xu6MfwI*#=kq@mq;MUA*HvNyr5Ni7V0QrWIjSgcD7Bi4Tif* zfD!@b`ELOLF0^^zHclDCSk3#p!E|6LH04Eo=|+=LnLuHvjJ3FL(5xWJT~$$h@^w^w z^(e6;LGp4o!GB%PD$kN5l)lnRe!xVDVCTK4`}{u}uB{o;@0S zU@JS_JnrCNd%|&w>T9v}rI#_9AD?ZuhLsUYkTHk67<1RxK+D>h3J{jU;Fl9bR_T zZzT~AaU2E};EK~7lgDAWqHt?p7k~wDw%kHGO``N%W3A zv(-d_M-a*%55cvGtmJtrjoIQ>+`FIo5|-I|sVN+4Sz+vwvMavc`t)ON0&&mN`iBzi z7g2f`)zrIK>>?&dlpXY(qKy@X#o`X19`$!wP94_izBF8{UA;W8_V_StmU3kB@{3%oOeW#d+k z*tf3?`-NOm_;jRP>3=DUpRVMuuW(L=8cmiL!RgcC4;|;+cf9k?NfDFKs zN@D0@z4y-jwWWSF`cn@VlZrOwq0`z3d@42Uz23H&7-MY`IOH_r^vvj`wGQf)6Mq7O zI_>&r*O}*44`fNq7s8*}hLjk6IrXdh-c!J|+{)47WPatbp|ryS<l0ZMIxmNGg^QZsHyBS+HW>IQD#71$}xsfuyrQ z02YFVB|+6$b?B?>1YeSt7M7ez@HyDr$l_L2QDYa9HvLGM#M~mU>AL8Vb`0Hk>`S$R zdO4H8?!aQBdf8UF3vgGfsm=#W5wwG{JxL-{oTyC1>0Ms`I*j?-S7E1BvLORv$P3vu zmq$r;&j!1nkTGwYq?<>8>D4Y(syS za(vzEW3Ec81R|L`qymuT2M}&)N2`Zh2)@eR5ZnTwi1xwZ!@Y zzV~%e+bYS<2&l^WKWJ0pK#!y@>BbSiA=<%yhbpjf?QC_+J_{c{fjbXu^C0$i<;9wmAKHV4P_+LGj=TcIQZ)i)4-`Tye>Q-QNhxX zTHIrj*q-jx#jWdBtQ`9;oLQ=Gmfykt2i-()GUC^v)p{XKS%E8i*J6QsP&3pvcXxuA z0wM#P!LRa11p_m0XZ9XF+CjdVQ7PE@>PI^e|9RF2*{z{F!sv`WK+ExEDdi22^dm6d zsqUU)Rc-_WIalZNwKA9z3@msNnwEb{U`|b0aZHT3R!ks}p4`%Doderf4X%!qk~TBY z6&D!_JT9gtG4>zvhLz^8TG~9PI1#(r_YO}-tN4E@D`+C5GSe@Z&9KNoqt4atuENu| zGzZtF<`!Mgn6?)$Cu}`&M^?<2!Ii#HugW`E5*}3!Ll*1p?|_5Sx5rq`UTw&mNmX>c z9)0cO)Lov|T7P>^b!NDVfNdgypks|`-9DyrI&fuk#X?=4CgIkIuEuCVKhrkzR`RyJ zmV8+(^FIrpU;g4xUoKi0WO#Q%oa*T(na?=RwWWN?Cq`7W#wrp=59(tW3;r2)-yD}H z;20i-6QN8PZmWSqvhOl*Xy^E#jr<_R>cFCN3>KMLZI>h}-W!*dnzG?Ilk?H8m_=)xxIt z(cU4i^Jh)uEXi*>i?tW0m<)0x9UN-OA8FoMZ{rbn5tZ!#ru0bhES(V>wPJcc#cX43 zbgT11QH{GQNl&-C=$6Y%Rn+c$skVW-I95W3+pTz)J5m58v2THdGtgVMsV4yj$JD4u z#%MLrX^_1HN*^hN$h##Ld%=Wi1%e?avYjk>vn_7v_jzfK|Cc?ICpx6Fc1gES>ONZW zS1|0$Wfq4~CkpD`%42AXM6x8m_;P;XV3ci#+3LAkLXC`jxJXi@!RmHSTPN?;PkkJme-$UVWOD)C;MEJsgJUyy{wb1KUN*6fFTszEMR zN97X{&M61Qzkzx#g@EXmKa*!2d>czgS@^`!G;-!*p0HX90khd`)6`m#JA0|2#1GTE zs^zWNagnj}ySJ z+d;+820yrav*T-tc>1bSiWMxUZ>dzR|C^EATkhw~d#lur;a9>PVr~kOTYBDFVxRp$ zty>v9v5^$JHXXGka%&^__}=ry0so{H>lhP}FA4}d@SHr?HP3NT06UTF+&AX}l=e)J zVDub(Ocjgybp$z~anebeV$B9U3Lm(sQTO6sUfwr3|9u7uyX+4*Z(Y)bw2+5Ps|iTm z^pfHR6lp~6Wot7ab{f<&mhtcQvh9u_VUlwUkIik46=tnbG&zaL` zvu#?gcE=v^?4qHFfi3&<#W4G6JMv{-m0q7l-m3|($q~7Ml?`o7%6*biQ@Q|7YyAadP<@y)^4q45{T=X z!4qZsB&07j3j=Pe(;HdJj|S(m&ssV(p%Hsz?zyWtx5a7>ATC5| zoCpl~7A(=ML(b5Z?~Jv5f3h4YgtZR>{fi>Ovmz>~qp*Rh89OSUpsg^LDarOk0!54PE%Qf_4786WE ziNJarauv?4D)PKFPQ{;oo4(4FH`!*m79@MEcfU>XJnXB1D1{_^lZ;JG@kN{m1h3*H zckB5?m1sA^#;Xs#>Q4KLY^{?-?^Iu^L@ESZrpF+F@|ER0Vf;?v&)y0YNHVs3vlRDW zWmt`5gpKNUTe{0Ef9V-eLg^q4`SGa6dRz$?pOs3nW!wBr^@vSGi%2~}wy@4`F31Me z%R7he?jUy%r$SsYK*D3Mjk~PacEs(le2ggXB`LId_9{DP9<`B`F_X`$LRHR!xm!V>BNuPdq^rj13|~vrcJhQ=Ak- zzmPh}Tc;NB3mjU)Gg3kNY@?#oPPDP1K>-s?TBo&tJVt?sfXCR^P(@IUAxMAc#HA~n zr-SRKNuFnIcq!p6VsM5x9bu-OOW<+7Y}mSDU9%fl?JUh$Zbzr@2c8$_w9~ z$)rHxS(jGmcpHn#>YilZt$5XHz>CoE!e5gy0c4|IvHb9gsP#(gtRk}f0q^(j&W#Jo zw1JY75Eqk?(5ktpwuhra6sGROi8;1IZreNJw)G>Q{;|!ES28mH@m!!(*vZemMk(;3 zPRcTP1z(UyIh{f0j;NL=L<|n^%o%aYRpko>+ZBBfF*){bx5&e#eW)uZCMXkA$=6)+ za_J#^;ZElno%L|X=OuDy^m}$s%Hh#91R1q+t9e#@1&IcQ9c_S23;ZxzJ8@xw}iG0=$+8)>-G; z`<^^qTB%5ev3dx3d-rXb8`IkJEe$Vv@pZKTUd%mn1?Ejfy`%)i6O5cB5#V^mwo8!F zXy4!-i(&KeNiiFVZ{UbGjnPndXY4?Ui+!gk03sB%D1LuZG1<)}_6A={Zn@Fq_0@}w zm(4C66{?!9x`{ui3&WO-IvJ+Gq?Jk`t-D}Y^xdy}!ekHGHAZzJfBVeV`8S*SC1hKn zYqd}3RNQG|U1!81Z@cuAbZfR;c@;pbYHvIk75-|Z((4oa%?{ZR(t~;k@SQuou}rB8 zfBMe&srl(|9uuj3cV2yI&%Ik!dHa?jX40&$V8hy(wO&8MgUFL27Bj^b@8+Z&@@^k7 z8|QqLg-t-;Ph=#9d~p2jFNP9*b@kTjYQY3S6NGPPSJ`r;Hs~$_ciE@eJtyO-f=Zjx zYZ0(yT67;g8$Y!9Ewdb+3*tbZbk#>a{Vkg;Lmms01majWozpLcXLU3Nm!7iQOHLNK zllJl70oGF032DCQBxB{@H+7ZjiN(=8#don$-Z@eixQ(^xb%4z^9OaKBjo8cR?;A`| zl&+9SKb<~=qOg&EvOWeWJvWq}pC#j1YiZZUvi=Co%YsOq_)eUs3-8?Nc%o4$1beDZ ztpj-W^}94!^GZAh71ofGddT(mIes_i6ice1TWdZ~KM{^lEh`(y^TK)kM?Q(vP$hpn zkxd?tO$#2t(5U;mgi6HgS{P_tQVQdTSzKSFXLP0y5FBdrB6KQm0=#^c>v*>_AH}ax z1`h3VJwLQTQXqusf%t}8X4b1zTkSIdJNAde3|RV_XEGC2`zbz(mJ)SQw);K3l@U%8 zXHGl@9{6pexSnJK3rUeTXvGWWig8_1D$Mufr+9K|bqi+4+iG6diZ%gGw zy?I~o`CHibi-^|a3&t>ST`~&DG}^17NzCV27ZbMY45J^f8QaiNga#|^&2r;}+ha|t;@{glDb_C6 z5CA(KR|(3ON44oHy|P7pv>P-X<-W2O?ow_qc`n5Ggyd4Gt7I4#G!+`iOWF7FL%gq) zt<4l>)@hHp?5z}5LbL_oKw?Bkx=EM){ZVWz} z8%9X>Y=SkBb2LdJn-ud8AzqUKMD8pJMz2>s8Iaev@&@|ixNa;3hs+oXOWHOaAn%WX!zA4DqVCl@%OR?`?93PCOc#Yyi`EoY*Vh`&;lNs8_+$w{ z^t#;Bx()Jvsn>cX%AM6P;ftoP2(Y^sm+mwt@wnLa)VBG`5CHwL=#k1NWgr~o_qPQiyuVndB@dBc=JBFilJOcCUP)bbJMtOw!Gw@5RS|9xGcq_*loA{7!zT36q zofglX^!{vgahhWx!6e7mho->N=&n=9xkSQa{DPGf+LbQ?3aw&nqOWZ2+32pG-ry{P zSmU$Lo>9(!TAv@D2v3-)ntKGr8ez{i4q-gy-NivgB1M_NFL|Ps{R+xy0Sv1$;wkqC zF4)wcP%5x?;EaYAU5FJz!MV=(BvVTMPY{MB{(U2+i?}N78ynPZ6Bx>^SWz?&%A^PA zd4ibbLUe9^aW6mR!%5R^z}M@RpemT%Wl=Lzm6eWofU0N{xi(VA;g_uG|HYfvi3(5l zOgO~NCYNocVXr$!00FC$#`VEG788uoK6dFE;C&koeM`DoZ({DHb4;pp_ERliMkD?4 zsuF#6g(e*%Ath>pUU#WGmMcF)QS|Baj$_07N8Rz#`|_!Z^)v_DnDXS6*a~>9t{J@# zl(YNARS(t^(+TcKC18&65nx1uSFgOywByO)GE|&DQ0>@vOsPmhxXbx$r76CZ(yfd@uXD zDgUmvRV+qCcRV3NME1a6Er6BfOJZHMY&?#0;-h=pT69-xG7nLK+br#iuLv=uPbOuf zo<;f}GwDW?y-*q>Z>>SN%Z_u@hb96;WETK{Q@;e9{BMWaz_#Jfjd6G)GvcL{(9!pA zR>1nh^Oal%Ut`r^p>uJ_vrZ;AiC6+baWy*sKB`CNXdvAYrT(pYQD^PmL)H}k*}FM$ z%(P>$g$GB(=xR(aoNo+ET1&LhiYZ|wCb>T!ibfC3UaI;E^;x&N=Roq2w3HquVkMHp zo{r3%wKzxkb0s{_f z-jt0Zl~mghdjC&uU}|@R)3&O3g7T!4L+!vf7v^kTgndUP$uVtDZw6(ie)#A+j!63+ zh$C7+ToMW6A6{%!sdFn(nRRi>wS334{WOL@Wo4cg{R~)HSS%f`U9K$N?=Dt!9UBMN5o3br79nA*kd5EVGT562bzl$zZMgb zs0%0l9)-jEY!g_fLl1leXNGC4KERPG&DAK@} za;mG(#qs~aE)M1!WUj{sF~+Hl$L|3!Xb=aB#;RYp*2rBQ6)+=qa@2rHvOw}k#dFdq z(o;5m`{~EtplJ@ZK=$NIB=FuIML+uHNGud_-x^oY1@>qMO8^&+~11e1=omP z!`t+ae?oEEL_jc`6J`27SAlI)O!?CQM;uebImY<+JDp@%{Y!<&m=rvigW*gw)m*G5 z7cAI`+EjR&tk&--l_==LYkvA5d}o}w?&wz0t(=Dx%&GIq2rZjfQa;z{%;FJ?swFqk ziV~M|2ez*d^;0_q)M`=RN0DKQSB7q9NZ=r8eeUD;2<3JG>8i?X4RuQ$GY%d6lA^Px?;J#7_Nr`~4O^$By!Y zr`XmXlK8wB;Y@3G(viuwi{{G9Rdb#Gwv#Vw^H)wF?gz^@nO{3C?RR`bHt+2}?l0;~ z&C~T!P(W~EJBpXDRY(@-#^q~g{)x;WFd<}KiF)`9TBLa|8th6f*-%VKqok4BtzgC1 zXV@cXXO!aj)#R}kr`))E^JL6;TcpJF1Syd5oF$qRby)W}*t}{rU>sq%@;s8ZWhwdu zuj54XzQI%W<;f%V2zwgL`A}YQ(!xMGkPq>(aBLFuZXg}DtD?-AO!Jd~cmvc|Z`@<> zt_}(Zh{!k_;witmB1Iq`Laf-gZRjhTqV{ZJL|epH7^QR~va5zL5-moF9> z)UxxqzHJ(g?_Z|>K>g49ew>-*{-p?h1WYxYz$m3-8Fmp&M@76joc`$|8Nh~lvMW~1 zbA~ToL)0P^Z`q$OLHg6@l?z^40Bgx&6muq1#{}2Vmcv{b0jEK*)Pe*~r!mDMDpH=w zrG)}o^6lVS@+2k@JAcX>#9v7h_jQo`fac=544+nJVjtIh)q+*9S~vi~=BRj9%(qjc z_@BKS2GCXYhdQNGj3~04mCDT~`q|ShWM!t9SmG+LRqU)KU7y&zBg24rryk)!D%SON zWnQ)i1v?H8U<}5PGqUB0etg0&Rrcw_SsGaP%K6vChQeCjYsQ{y6ksn5#+ZuJ76uo9 zx>&yW^5&aDL+BL+j@OE|Oq|v^P!>qhd)PffY7()EV9pe@?21v}ue0ysCK$e%{Mo*- ziGv#D3mdMH0|(VaM{LYd%NpYPl;`Bi*9%rWZ!JN)M(o+N?{10e z#A&IE1fGLZ@ZL6UN?3^nsR@c7v(to?`x5CNhOA`l1sAV-3)Adv2>>hTewXRpE}?W= z=n^DLD_U(_H~pv_Hv#-=aM5NZJM+?89qO&*0kW2ym^o+{X8&Zn{Iv_hE)LImX{Asf zhI6?$0tZ7Jo1NcTZ(@(BDg3?P$gIGyu3eh7Ug-SWe#;{gu^l_={uPJ9fuIt4IiH5w zJo}?^{65dT?DoAl4j`n6g3J8pS}MDGJ=KPu zTXywdBPrJ)w4D6-%AZk$f}cbEGm$^QPyVN+_)P+kGMcJuR>PZ^@ZlF={y%|=5$v|G z_@ z!$1KTJ!j%Rk6#WKIx%~)zYGb0hVFj^3@#5DV7X^APhKsUTPIw4t<~ zZ7!lM_377)RPvAh*W~!MAD@-l02**4fVuT=QP5=Hs<##Q4L8Hsjd=&GF}wYhp@{et zE3Wjj`Tz&aams3J;N|ge5J&&bR`^L91R^-|1Oq0yON;VLH$zN9ZPjerO-uPx9b|w+ z{0WUn(U|{91n}b=kX|`p437+yCOo6o-@CV_R?4#lK9O?|IVaa&TT>wYcUsEteKie! z5KaER@a_YY8FDCHhvOScdpV5F^~NqCa@|8($U#nqs-vpj?R+BvGFtUn(wX<8gx~9( zu)p309Nc}(OyD5?SrwD=+*ZpF>#va$LN8cZFW9LQoN>c{N~as-7SNX_YlJ(3nHYsk z+h*AHMHw6!=6rg4{Uf)73uCN{%MyA-CM@s_%M*WB3H1)S|M%1(3rEA($^A=*alS-5 zW8O_bK9Rk^K4ag_Zr-Z7L3k#(JH(9}7yG6Gv+|+~`37l77+rrJ8AR~R0c-6)=_$Vk z5#V1l8`KZyjB~dT*(2+x!kdP7CcHa|jAG)r38!_e&qgFGzgfHGls6cX9s-s4E1l@K zg#Wns!UXlhJ>%W2M-s+#smsX_oQX+5S+GeF**h#&wZK z572HCl3uPJ?@VC$RAhGp*~7%akG@_kMwW>0i_vX@W`zGIgXV9=1YEPzqXTD2vaS6s zb{3J7a`jPJap3zcd+tyQpjhkT=_m#w{Qph*(sigG{$;NpZ?7RYT(Dw&8SbQlM;I?2 zAk)&{pveTdjQ*8k{hxj>u|Y5U`o>#o7o(S6zCM~66P_P!DJe*bG!-4=ER6Jwtgt*aR`bn zqh4u-=#Zz8G+mRf?Y)u=ajsAg+J90Ge^aa@?|)8r?1Q=p+s5rRk+0Y6QlW(;vCYdd8=q>Mgx@N!2!aH7qY+yl>dSl_W1}oAYdaZo8@=l4lFASnzR>;OYD*v6 zE+n{Wr8e@zU~sO{@3%4nxp}*|y)tC;A{jDazHbwwFM1|C8t&+%oLy827@!zx^@y_A z(YZh%+>U!$%XyCmm~FT{R3CYpowk0T(b0ZE?PI@Hrl9)biXcSg$qe^%C8BG>V9i{m zjnReEv_)R`{jnN>5_dOCi|o_xMVHFOWUu9eZlmtg1+m2!vzqIc8<<4_{k&gsK$Of7 zf3$x-&~hTmW{hu(l3#}T9bb@wp=dupGf*guu{V78C^qn*h{A^>bNq=1?6|N=0$U zR^MKfwT`ZG`e6TPb^3Q}P=5A9ndow1&cP>mGpZ>%?r(GAOerHs`sg^X zzy(2RH)L!7iZ)d=GSCE2Iepcn- zm=SK_Ht|`|mD2lL`BY_as4%I9#CMvtg$xPYv>po_N(smSyrIZ&Un2h$lR$-<1{iE9 zB1%hM$*6iXsScU)8L1Cg=T`hK*qekOCrhe&@D(hk4c9OXfqW|6{rD)@+~y*%-tzN7q=404zDo0*-xUn5zD~bi6ojb zp~{YX-^aD^I&+?kMih|b4RAB3zHn_>%GU_-VPZqz(N}U)V=I=6i{%}D$rXH+tYSPF zSBcuxK%auTOUxyd3(|HDQLk2+{WXUK(2MpduB(~=2-KBUSDZJ^Q;a^z3yOKzh@G_P zN9{Z5aU&gLYcQ{TJ|v+u?Y13_KHbrSN_;T_c8+E6MT_uLJY~6-`|3E#9OBiFs<4L* zkmG_g4AJ+&${n0mCle(46|VI8#}-&TCo_uT+WMM4c*;JoP|n-kB8m=qzN8$$q$P&5 zZ9mH&0Wjk;YRMIez)*(I;Fb#~Pc56Vr{a9$lB46=k!d15YZHmxsKG=v)c4pC;U`f1 zrv&ZsHtQck1EBXwAF2q5f8A-a_af*QNjm8D8??*5YVss|`}y*y>Q+?YlYTe`sfFZ? zTY~7KfXJYWm1zZ*zSD0y5gSW8v*F3V|M}_Z2J(f$LPXB{n!x~Pf^hQ@LmvEFM4?=8 zCUUEd$}6R(hV(|FIRX(|?ANP3^iOHZtdbKN z=nytUZHAy4!q~o2_xh5Bh^yY>aqIF*T%*RGyxe^-P6*q}26hJ(?jG2!Dci`M^Z@Pb zIHBV{l>#mcHpVfT?<=50ZD%Pjh?Oje*AyJdJq^=C(DuK(DRn$~hRXPyavj0)LXxu^ z24a-%lwjU?^+}7M^?ur5&7zV#7~nY$dc^~_yBV1cjXXr5BIvf**_|NO`)ra=zfr;F zLmh~aGx#)n=73XZI(Q9YD;~u9O_VPL_M78Qlh-l`nzW@r1dNM zH6KI|d=s^6fP;yNLgf)0lOO%I$Zpw-cjjy&d0KZXLX*UR#a0w>bL|Jq6Nuhjo*?!o4i7OUCikR5x+a%1B=DfhFe& zV(C>0_X^Edx+DlcxU!ju(nig;cg*TI!WSo7uTyffvmam{yqgzO2aP0Or(Uv)|JnoB-o+GEGL=m{A#0N#^0iR z^7l6i*POe9$ELVeUC~v)lJPzyM31=Mz!C`+u-P^+g2qT89Zsz2Ay#2>k%=YA{@fd} z?sq53I4w(ay(#kU5rNQ&LY2@!`tpL6=%BFc$afxjc`$UqgSroK);VZ{#cv=ngBx@j%e(p1DwlSy(Dd_5H7E7q`h&roF^=?i7HAoV^3M z@HL4-`Oy34dOkR%7{8}sM4sp9`<(CD5CP^eR2DjM(_<((a#CR>1@?{+^QX7K0iD9E zC3FsjCJ+=?Qv-&N;U#!ZD(0YT8gEZRk%pK^i5I?6Rb^6@NG7EM%YSWTFJCH9b+y$` zndU;`M8wR2_6n5YHfYwWLE~H~Gt=n9b^2SzYf+^>q`H6rRgy%zt4@fGw%4$4WYM-> z{b^V4!5ac47WM@2#6PdAL{5HGn=YNL1Z*pFynnJM*G9_PVKm%f+jzvu@D_p&^69hv zbBDJQy=C%~&)dInX3RUU6~C!5UN?xWQ7C&Y4*$w9l>+T{l-lqo9eqfZO#lYWE(7|5 zL5_{&ezD0ri&D)${ThZNuy&+h;DpWOdVbLhEi6DdnP2;Juf!gxxvwAGs}BLbhxw!K zXP6AD!FYNrXcjB$oemT;E0S^?$s&SU0HBLItx{USH zp?eKsUrt|?NoQIJ7bgt7#XtpA@^mja;HUC|USl8%_DAVvm;qCtx3@;JN>9GD-O!9Q ze{hYaPBWYd0>WlPkcr*xnagno3>AEi*sXypS4iKfHZPX9kukSDSz>s== z1L!9Sq;gW?!0SyQF9I7-0#F!tZ;2h7cmm2OHCdNfHGbu^QD-(ytbm?$xjKR!(wv6& zGtrNB{^7w7$8=K-N;RO@GY*v?Q&d;HWRw$lY$N5Q_O4-P z4i(sjnL#`r^`M%xwzFSY$XKEDq_Q!0Rwz_@{!qX(91`%`C;M>$^&y?&<2gPcpP~0& zu2Hd~2Ny^BpVYe4Cp^FcW2gy%GAzRi%q5PZWMPHWDHO!{{ZTf6_RLeupyZz;cjB+^@3 zAe!;#E;LXtcIcJFb?043Ip*)U)N@H24fK48MB} zkj-f*^2$7nb*&WXU6)56`j>}XPD+%bvdcUA^EG$mZM&=ZT;mS&xFXsAcEr2DV~qO6 z+`Y#xLvGgR?n3TY#eTC6%CG{d+~e(SlBdX9U<|XmhjZ_uTf?M6l(G(@0qZA4I`hxF7?R2$d|qzL-J96rv?9S@*jZZ4@k~b+#P&g zG=^D`?vc=(C;Xdv{_Y^6-cKd6YJb|y;R89Gb>>IukoE#F7Ewc@uf7v~&*RA?AL)~)5^r#EqI_4QEYk4k#_#~o``6^mqCxMim&fW)kz;cS zw_02l6FYtPudZbA!==Zn%o8`BW|f>Bi3gmi?WYwHe!PgUJsn|>c?;SX5^K*Kl6v!?bD5TQ$Mu^(GG=gvN_T&$}*v?PuemJ?E5WBI;m*sZDviR48vjBYS zduoyAY)k?VA2(47%-%62W0-p5ua_A1&_beU;#leg>wCxvQ+($VzZl5{`H9MRdJFpQ zvN`$Mb>V6LpgS%XR!ijHRv9D27-oivBtE-dnw{&iw&T{*e2r;(=~>!a!tHgnHJ2mtlwj%)QutRnG@bAR3A z4fmdRjL&s1J_kxm{dQvtZdBtYcDv3jR?$L}_Oqda|96uVNKZbP5!4*Z7}F@0Z80B>5FFIaOCH2%agb)PzksJ^VmBo%gj# zzQN|pIoqnb8Q=X!#bmIXUZY{6hY&9xHOomC6LZk_Fw(E{lntmj7E+nb3=*W6TrX zONJB}iDS;Y&bjyF!=z2V7&Vl6_-vez16|Oqeo(nHMC((Iuvgkb=b&F(%Y#*D2n*- z6SkB_OzYGJ*Hw&t!rlQ@S~rE&!pcXW1eC8c;$Br{gueJYcEbafCnPoc>XwlZ=0MJW z=B^$&mvBccALp;INZ%VMw)?p>A;zJ^;&9G9Y3D~tp42u(s8vK6=Hqr~B}Wt*xB{fO@I`#hDF@8m<<7GCBZ?6XhNrZrbbx zsysyR(wqcpo7tF;R=H%01Bkvf2dl?ys)<=MQZ0@?oxy@~4R^8zp!-GP{@hGyh_jzMqO!+5PJDAKM#R>D^nD2y-O!jQi6(vPQa1SQz zUgk!hO~HcQ6*@wJb)yKpsDfu%aDCsSb?B|}!G+fFrk~3Pvu1DNoiBPa0%h$Rz7#9l z#+lrZ0StI&m8y?4bM*r&G0P{qA=0j2hyj;P2?JDr{H@RmKyTj#P*)Y#^7X979h>l* zNpm!$imlKn<^KjU6$ulCd6?Hj zIxXJD#XtY76vxHEQS@Q7dB$#Q=8KL0XmH+vP4_NU6@a zbkCFX&;w>IKh~%C+&o!ZHLow``ri3IrKsA74!13km;n4r?J{sxa4_GCY2wgby|vI- zHv2UwO6>*(`96O(v#qsjU#lTK{-e6kqenj8>qu5e)^)hLp-(wX;6XP>Yohz0Lq`P) zHQ7-16#_U}S(tFY^PRL^pmvR@cz>aZ3`tMCC3E8-g^BmA%Nngp1CKfjHGCiF4}bD- z87Z+;XYW!$=;Ymp0W|`EnzgBtZ{m3j7L;rUa$c4_)*7)M{6OUc;AajxYdsjTuED?} zKoZAom&T`!ED0GYWYx^QQu(l@(9wC{ZLqKRX~fNY62SR)A|)}<>5=>O*`ZcH@3i>s4;NBpU zXOm7QzC&^PYb!Rq$(GTaIDON@3JaCF?Q%Y@!m6WRE`>l4h>?skXwZY@DM)RJyjY-? z1R})5`CMK;8Re0)#n^n85xztsQSZYWXA2_r*n5MEJH&iWSz)AX!F{X#t9SMfXQN2@ z7PBI0B}Up~)6&#|8URLC>Vm_%cYWWNjz?dYLjfSurJ3n@t6}dp6j?=JrgkV~It(bl z@JjEkkR7|1iLO`?yBAOsB{V_*mAw(`edo)P!s9?O5gjU9$k{xfU(vpJNr@4FRtVes zrfYDLepz%`&}HGS%Iok&%C&OGOEL8TojgLNe+`G}mQdxVN;vDKSt@kvcq~fSefn%1 zPh{A5{&auZke4me%%ttyX20-b2nKwY^&!$-(tm&b)+X*iEZ(f_d53elx)2^9I9nXW zpEI0sx|7W#WBXmFC5ajUZYdDblRicVBE^gh)!+5^$D^3ry$ka0l1tFv`N+48%YMl# zYT`qHBi563xf@|JC&N9BI9B}3!^jJu_Cz{>AsyE&e%JlcTNdNwx&9Q$L!cn?U<_k0 z06i{uaLG5NrtOES*@r$s^LxXS$`QkAB7IY!euc0YYC+J$go?8^YG4FkjRYo3fd zgWcO{$SsmS8hJr{%x4VI1Yqe?q{s0(P^H+|tYRFbA93YT+vZN%#aQwAb5_LCw{f8A zcQY1Q;49%L6EwwlaalYemo=&h(7WV_FInE^4Qg$^A@6Qn5&F*1Rp)HldE8OKoa){B z*dFR&%=BpRfb!(#szEXR=ko{q>u=w{Nwr6bbQ1woJ6u_=Pl7Q*8+ZkXWhOan`De<(A^!Dsa;5J9MM zE_DB)5uHG)Ny4tXn?OAY$7U_5z6=Fi@nfr-c+xpI>>&J{?)$)yv&GrlP!;QT*W{`ibpuCw8LD$BGo--1-O* z&1Oi!-b}T`vV6^C@e$$HwJU)uQG^&wP{;I+ZJqPQqHUU^2xpUTxe_TaFAKh5!rbV6 zbJyu|eb#UdzE@xu&!TUjJHx6=qX`5C$k-g0-*<1Q0`Q*XS3q#Gjj|H2^(O4Pi*ql_ zVD_70InaIES=G?YIUop%2IppBSgD#dzj*PB-pkqzA^Sg;X?5k)2I{aIRnm zuNtD$yoIBC{a{<|fxdOx_qh)0=c$d?52#OeWZk(i81e2tNB>_!493m(`_7JyD<7Tcn)?~tk@gCSJl?kJW46d$_jL-nkNTp ze1@Qa`lrQed8>c}RU5H9^*Mlf(A=Qh4*LjD2itCJlJn--^aL7DQskQeKkkk4LlVNf zA37M<@&{rz#tZO`<6lVSd|5;2`L#dpI7h$Ne6uJrtTerT?nJ_?V*ZW6)1+<><>AF5 z3U{^>s#Oss=4Z3!wy<-)11spvt6_UZWXmw~ZCx=`TR!?N57TC1^?8!Kaf+iGl*(&SxK*OqAn2!m?`+xFVfz6QX>iRb1OD(VLRvu*vXdR{&SdcFeoDbFTMEy3cWyRq zl!}4M50p34zY83AmJuGYKxPCFXnj@ASrpA4GmaZ8DVQAGKd6n!@joWsG`?Uwm8Jh! zjD707A(^Jt{B=`)(U)n`Y3zmYz??QBI+tO9w7;@{q2^;JwI^#wt`!?<93LXK;xXP| z@ANcs-iTL9`tCeSc9n8;zJB=@*-yX2sWNV+<>1NVX-;!6Z%xGZ!UL8?S=>E~3Zy}} z@9pyYR_G_7ar{I1I=6*TKAC%~)ye8^eaS)-yP%hDnn|iVe5xXH+bq!5Vxl-3T-Z9Y zlInj-l@NFD$sI)O?n?t*Z|HRtEb)wOK-1~@+(Tu0ZBn*&>+5o-h|B9cXFMGj)UM|T z)&lvie!i}tjVv+P1F8D57xm-0oSmb?y`zv|#D5znS-SMUI zxA2C$pWM54geF_PVUIwXKS3ar19 zDZasohNHwTt}LA;SBs6sY6nZ69!f0HrUhm*C!s>(*j>DQSrK7{;=|^maNh1Y2iG+( z?1vskejuchc?todn*%OFN|yNKG9SoPXp~|Qno|cfbR>xAj!c-K^+a*9$DO-#Am)!y zuLG9dDeS~$e^sANU~@42TBY^3lzsO>D(6M~ll`ZK5_U-9h}sMl%GSao!}!nd!<5JU z-p{wz#PaWuACx6=zttMxyKBPkY(*35M4XS^=&OUQ1I7~faNV<}Wl+6Qz=|{urkS;IHiS~JKrNgZu~%k(kxxA)dkO81 zDe8TM#U;8R(g$gT5}~^LFL&KeRx->J$bPt250|uTxi_lPrg_&%K2jjakLQCrnqDI* zCfg!#K{^ecrpzQsqeA`}BjA7HS0g>);m5YTt^kD5jBGM+2`XYv7oZ zQ`2!~0I|=V;#^I5OpFTQV6D@(yn@KjXvaeS3j!;r7TaVlBMb>1RD21bDf1FAMlpjW z27@T|2uGvsm$Ll#;W|NWaU_TA{rl*ru9LX>@7b>}P&%ELq6e80n_we|d5t#JNRusSL#1-D3rPpH4`MM1al9dzhxX4H;7p zdIFM_DpIePgdcfuo;K(7S&$UDEvt>8Y#h&szY*q|Mv24i~In>8F82>#-3GZk^K7$Og1SvZUZdT>V$Hf*IdiLi{;kHB3AUmw^{pIOd_p{`0+wZj@^* zx9`Ogt;<7vG>fNqU5Y*=R{g15RXq-8fu_>Pa!c~x>ZFc%Hz1?Jyh|FxvQ&nAmq>A` z1r~YHV8GRv2l-K=MO#86N{6|=e!^8BKWbA$?Mo)b21&kO~6@( zW)Zl2&damzX-pQ1>T}H-i!mZLR+_!(jLRJ~hpuq>xjrak^e`7>$m{Ecl^Hc*I0S>q z8%^-Lkc0`&^@ZORjZHMmC8{R;4xPP2=eHtVpQP=!#L{Ajg(B_La(dh>f8p!KzxKQj zeTX8JV6U}&OJHU92^p)-4h_-`KM$+Dj98VIPdA@*#}zRjrH6-1j`TgiFBGZU@l5(U z+Q|nmSv??>rpXq~<9B;CnsnN+WtT-qKmyc!JOo4q31l>=Xoh&m)uPLLT!B4lJI|S+ z5i=-;x0m8LpHt9Io&5aX`oL_ww?@$H^k7qeuZA!d5%H{#$*3F8v8GVPoVf7MJf@qZZ8&s-;05zL{gF+udZS@>RNq-=Vi@*=zoJ6qL}mOYm!wM zeoO5^@skCMcj%^BL1Qh~o*RpB+&>`mmBmBuB}vxf)OFZ}VWE^IBS}HH$x9pdo#}9rvXpbwTVg4)UyR2u`5!cv?M+$@){`eo^HcL~40& zH5`fip23ct#5zQI+%Q%iNcuD06ycalyK^T49STH%NV%7!Kplz#fx@KkAzeoYMxcVx z23!+62(I0J04~y^<9#vBKd7`ueb8Z|+FDnH9D~|@e<-~K<>ls-(Wccsmwi*| zS|LEv$Q68>BcJ@pY1&r$lSh|_nce6~qkGrIlbWjM4p?~ji0oQkJR(28uS;iMj4J?Z z=JwWEj;>$0qnWbR^Ta1CDM=viac_ba(W|kZqfeST)n_!fE29TW(Ud9fvZch#E=9YJ zzFA2eD!o>dYEsV5^5u!kucVF+0bkw$yoe!MgiMQ~0jUVP^~f8RL(t5g9)DuUSzHL} zbiKnBW+SWLF3$OWfh(~yEsAU2+-*9udpiPm;PX6pJ6WKQMa zyyl|;@`7vhCue)_*yOUl=B9cifE%-A%BVlRWso&(d3}8!T=t^$;zhAa;B=G`(lEQN z9c`Z6)cN+sdAOj{mSuLASmHga3{+~j2rAc&QpK->ee~DOh1%&Iar=P08R8&UGmuME z^g37F=6jpIjES9~N->hC&~x)nc}xBKNgKKjQ^TUZeU=0jD##DANDR{Zy0e2VyT^Of ze>c3NQC=W7Oy>aH)D(IN3NNVJ-aqADS`3(x}e7{*Ny@mi5q z^)TqD&dPo<=d?EL=O#+srPK?YApQ>(FJ=-xJz`C$1J{DCg4?*AnSt38pDBdf*_x)=_-O|#8F#fJYQaPV75wbi=?MjO4U1dfM@2L<@4R>)NaO#qY zH(Le1IaX^Io;slpuxwTcB~LOZ6`+mV>58|ki4l)!vV3?bjAjya6VtF=`m8|JOBQ8( zxWBESFK~;nYu&SC^?nh$UZc8&gX;ZWlJD)f+4rGQXnF*(4;2WXcWFY@v>k~M_dSR0 zPz%3`5Iqg?l)zb-sjo?EZ}(R)U=vb9j4)!zcaxjDVU)7i3ki(`U5k})lXcjRvZRNElwr05~XBfXjJznoiqL29b0Om`^DyL86nXyq8|o7I`v z&TNDiaivbBf9zhL^35~4MDN4Y7sOQw`ouV?wkC5~@ykCL@CGwJ_QWN|u^TkTaZ(#& zp`ffsdY$R0)Yv{zVX8lWqoM+#!ISx&x3qK9`F64=@X%bqJ>fPY%hqg&p3B;Fv-FWK z>rPp;65MILJq8XR=KJO*uIq7}?br$P$Dv#Ww_g@8rqz7Mx#3fx-+Du{+&EN4=M#IW zS5(8uG_hqFy~+t9>1#*Lv{iiA?0u~Qq;k6l26AfyOkEl(DKmAX@A(eYxt2bU8`-9K zbHPU;frspEj?!-5?QmeQM)x|wm)!tl8OG2;_*VA#+;zRx6LzR4?41RSSIpzhWoDP+ z#cYm|26nFzWf>1}VNQ%G(r3PS-l)E}@X4*zSSr#E_*sE+KOK6>3b^k-(j>4k#oKM` zh-?N8HXrq@Bv2-|XE6(WVV+FbGZnoW=F`eG@?KHJb_D1VWF|L|Z^d(X}u z^L000oEY;;S)|hup=XAp?2rp_KO`vDgq(%nOJAt7~@&&>@DY1_n@lumhsdvf|p1bFd3VUC(CdDYVO*=2=CG!%sy8o>mf*{f>K-K9@9`aS;5V(Es z@c9o|C^ZxUoeAqVfiznWZs9b*8G_EQLuom3uK|Ag*Q;XADmA)4D~R^p|x( z`Xq2d`qD{VL%8jKUz0FBgfF`g1kYVwRL?aoGtGHZR;jU+FF=L-qpbJZ8!k~Cg6pqH z8eqr8!)^9d)Y|i<{AHI#bNUD{Cdx<2vC9F$n|N8hEP-kxs^k7VVHDT_&r=`fjy&O( zjxwHt$?1@y-j}w;xDRg&pg=k7e-;}g2oAYtSS&yI)QO1yzzZ6R29uD@1hCAj3O5qk zD781IXM%GyJ9|^}4>BKTT`p0Pk=5@Tp{PT0`3=t)VQ(-IYcj(22r|7JvD>eE>@1Q!0UoR@Je^NAI2vffj^o|+`E zo~ZsE=5e_tqfjJ#Hr|wLF34942vrSH)W|7#rF%o;I;!lkya)uqLnQ z7FljH6l%y|**iwuvUsKYlI;_A=8OfF-q-xiwlcc>gx;;g&@N{i1(vQSD>tz8a@WBd zUxvY+q_-gRyHB$lsCO^Uss}^k$lSo_AT5?Mzak{o#6v3RkcaRN`j5iDy#VGmW?Qav zQ^l3ATl&ZVFzlZiSSLRyfpcv|8XtH?E1^1zy_Gs(mhEO?7Mrk^wnb!JIgp)K9GJGV zs1VQ+BormT=77Xy-hS(Op_n!`Eee(- z>I2m`)48qLM57$kx~@u#J88Ex0L)8hMq@iW#ft+i>o)S4_1hfWyIOTc(WP&iDyW}_ zd(Moz;|*DoBA{((okA-PWh8irlrT0**a}GReG%*z#BnN0$9ge=(7_@}Zu4G$q$7+t zR`wyD6T#rmACmK3Lf9A%>?RE~Qo4G0u1PNcSaPEtClJiy!P+aIZcp{^&aR!lK)^k1 zt;C0TDDZ2sAZyZy$Ley;@4&wSN|r!iwNszL4-!o(seeQtQMeuzG)~_4ajh)R{0#$( z^QyP6U7)N~TebBC3EPhZ5vdD~lBj#{OX4z^!s;Dg_)niDL7HfZ`$8gG9&(6r0gt zuyGcqKU4ii_5AL}Jl_!#k}OYVq@~7a7bK%6l9%vAzOdI&q5N&xuJhhDWlj1rZD%Ah z3VesOzp`T|mG_I;=i8JU%!o?;Lnw4Rxu?q&9i)I2faf+P_Hlz8hR>$OrGq`yo7nm? zI+A+6@_<|HvkVFLR+2W9LlZ9#6|!60C1fI`bE8t@>qDV1kf(u3KvdY}jfewGUnu9S zCBl4Mb`Q4eg`;AP$<0x2ZC93+ITQ6o8!V`681&~F@1__VF=X#8%TaBrp3kt+rFf%+ z>;@f2N7+}4R3MPKGpLX9B^QK+&=Cke6oQDu$6)WSPoAiS(}A6Q1j}LAa;L7BR~dHf zU3E$zB(=W#VTQvkYD0f<R1u3$dOqX6bso%7_{N<*c38& zERyBqx;{*!S~OmajBq^JQO2z%O^R;XEyf&zdLfsuSFZ-eJMs>Z{^wl2NN*zHDD5+q zKUk>A2G)|rvSnp!k26wXG9&4rlI}*RjcJwhMk=?A04-Tm-2jES-#eQ)p^26_Ez?@P!wp$1S<({Qvr;}2z8URi^MnT^CDAhN8RqlkyEq=(A# zw?V7`j5mpw`RBMp`42Y}S_7aTPtZz;h}YPM?}zb)y%pPh5okJ2|JkzSTL+WL+qX;c z?#^$?zTlSI+2yn_op;|yB2pH%SDHJ;`p9YfScqfQrhx!~`5!IOK;D3bamkk zJ20d9z$gHT=;c5Gb=0YHKR_gt#QRydrK2k&Lw-s&bCP%msOp9zZ;r<|*DP-sJ4YYl zV4CHw#&l7ck>IS$Js%JzS2YtP^}XNx2M5A#&8oev`LT&% zC_qxU@h3 zOV_m;gj-ix^>hGnkl`YC_}_w?uIP(T*2)#v=^TfSkZOX1sEtS9u zu!WQ1tC{5Ly$*vm z0Okmd!-tC3Rht5qY?EgL37Zx3-#3+Y=FYbtpI=kF1)aS(MIvdzq8+q?8SnXcd z@9uV<)bb|%)08DCCK@NDTl2S~ZfvF09WTgDWk7SNu$j|+^WFdU=ml)Zr;t%kBdfC8 zbGo5|yC7Zf2Q&f+Qs!H3Dc$w61SX60Oj$!0xGG~L&J~HTAme6wql?w7S=t@CNP>)w zk`=&De(2?CHQn1pCt3+iW9cVhPbcFrf=q~a7D2=ktFvZsnSy3Mv4W;elE!FfUZ+@$ zof`;*&&BMSF)=wehZt|5vwkQdkmV*)ZtHeB+N8BlqKHF6h1`A&!?~q*=e6|Dr$SF_ zTURO2vapdWz11Afas1J;`mTvfH-OM$Ihn{VhYeXLh%4*{mJ!{rx%wqZUE*uCd%jIX z3UQ0RJP1lnC=#YI>M`i#eop&~SHVN|$M|E+Ak#?#uDNPKpbkABxw|+NX zH-@2bB##t@Kt`{5JD10Dq<&1LUhLcUt3Z=#lzV>f?n4*Qe+>8WW`%TkOqVYl8->fs zbzfMJ;Sybw;|0E`(q>?q7%*RdUStZe13$BjP$jr5qv3l}0S6}bxRHVFOo-8--isBv zs`^MaVPT>3IWr-WBdBRfwnhy`?>@UWj{Xd{sG%Gkgm5cvLSgAh+9npYq&Z?^b zrv4v3`VHRawguCEodc<;D8Vn~;XNt(nSC0YzoJbjAWBFO$a^++gOQDEd=w_;MF%aJh%@nktV=nJddDV`r~ z{4tGcco`soF-p*UPgO?0Ct;xhgK_zj^D?vh7ODN4pLcw}K4W0-Q7)6%qk#7qlI59n zoW{qLf2>M4EJiQ!ApR_VN<1H}J#Z9(fAwt#NEr14{lJ{e`@h4AKcl{tX%=KCc^Evx z+`%Nvjk=e!EPm_)u5q+(vM4is8P~=&*~$vLPsH!W@xkz1oDSE9;vY~Q3>pShvkjl| z-4%w|+Z3gr*MzSpv!2_BHSYNHR7k8b&f;0kQ1^%Joq=?>cey9Hw}}+p(3%CO${i{N zN=K7%ZLby&$@_@FD}Y!xB@g@R$seHfHyFK4OggLguzbq+S_64oc0BgIDDj|yjXCP= z=K@bkJ|sz&YZM%^=H?SFMJphb?(fT+9*hT<_-u;tcRXl0dPtL_zEJndH6-PTSd%hS zV^Vhtx_jn28C`H=vE3&~ZFY8yF$EwBZdDUlhk>Hm@loK4{WS^D2ssGXb%(ed+v&Xuj(AE*t$+SY z2GA}^$a!+Ya+f0B!$74(Se*Q$YXWaj_G8I+zCB%3#%;na7#o?%vhX;hxc7m^ zyETsQhw8as*0Jn4!e=A?k#;3NBu1P3UHU=Xzgy}ph)?SNrEuZQx#qekgKNSNhp52b ztGWlogTjK9-hSNQ@w|4+hW+ff$Qs6tvi3BpLR|N9x>9>g>&j`W(Ta+dHdb>_!!U<)Stm1PnI+GFweD(ol@eqp4QooPE@$rVr@07{fSsKe?$gYR@pni?tY4&yh={sT- zcmuyEg$gC%a?VKJQ@|RiYS}SglF#w@APX1#4f*DyY47igR&hO-<<2O7rBLoxfNbGx z+}BOU-XW~Vtl1)TgnHE3H!o75zxGz>y)Z?!{CE*9D2puXIW7baUp_iC!T}Q3%s?qX zere80U-o=d4YgPC+|@vsE|Ydh0)CVuu~zJ+fqnU5yfJ4C>NVG2+ibc92`@@nRP$t5M0?ETHw17$763@?c3Yt)i1`BD+4`j9MPT}-=DeJ zPei^^tM;Q<)-yZ88#4MU4Bi`zUg*zWid{tC z`gJ6))rOEhBS2~+Er;)F^51;mijoO=?ljwIZl%_QHvQjW9Tcs zryaqzZJ}PA{Yew89Bw{EQQU$3`a^}8Ds|a$&QX0}KX@(Gh&hh-dzDzUggYqMXf<>A z)iaE`qdxIpTIVvjSFia@5466|p`4iPMhY4P09HXgpf<5{H96qq3DAC+Hd>y7Ptf@@ zL*ho2SWU%yKELyXwQ9j%YsP7i>Uo|HP1bXj8_Cfr2Z^cflPQQVF7_H^v<3(F+J1Td zj;?|0BDu~rdwi*YpVjPlE&WnvWkK-R@{!4rT3L1965(rdkT-O8Z%S%#>R}O}48Qdn zN|f9(TiDj*QOWmFD;c!qVDtBupGat~nHcCltnL)*>*U06>z*12Q5ei(Ovh+AJIhhN zy>b!Y$%?Lwa$9lkj=Miw-@%*p&ND=9QqG^*P?RbJV0-^sqrawz>`N;GpS(!N8-@Dn zQ9BO7HBc(2g&I`f$FAF{6MDJa(0b2kaFF9BiFf*PG~?s^lZ}qrVjcGp>mVy~ z9|x!~|8l9y@n)*b-bzjwdGdIdS&T$%JolVX5|`T#_E6*c=9KOuUF#|FZI8xKxaXRt zcE@(1m|EYW(<>Mri1g3#>(q)|N3Fx5C`sMnDYnyhF6|Ez?vD!zm$KleJJ53M zj@MA`+MSt1hR2!^1RKAxEt@kr{vPlgxk#$x^(1c6nh5bUq$Ox~UL#7%qtmt{1)o>- ztv1;wg2zXlV>l)x$RWg6J2jl-B^NbAsDt}-g@>BAR`)#$3obrK&RQ~mxwOSetLM+x zWAQlG_3>ozAqL3@6Q1vLa2xG3v#-YpQu||Pb&9`BzqQbNy<^u-PA8!&g{|*M?1YN< zX1<5kkW>oC4`ig6ToZuJ6nme7j-bR}y&|6caW=TtCv!UVSQO?8*9+9s?!yY^z46ep z$dOCsqn!4~NyHq~vnZWozdfov&k!>VX>yl$>h7C+%FQ;kVM#nF*w!t1`{a$M3BuC` zx!mBDZ$ftBg^p0MzbD{tx80Bc8R+Nmh@4MpNYnFk7+pt`^7eY`#6cT@JSE`nMP#5D znyrKm6x!^|$EaZ?aGHIp1E|ZlvWSAuP=n@v|B^V;kx5yLrPaOY*ymMY`Gk+IYp`nd zebn%ZHM`L*+x<0#8=you#{i%9e?k{Kn%Q~HMU|TYxTe~0!KE>-CKERW!V~m7_4VK zKSUl<+(@``b-_vMT|wuylw@|;Ib7FjNoflgeO)eZo+*tF2+T6J5Iei#yBRg#)^2Wl zXuh=m^mvb)&va2N>I|5fKvO9bGJ#PjyoEU%=dFI>>~0$fjj0bepVe+e2KpQ1UvvJ~ z&459_fC@~{fdcGp$3X4}#|8Eonu&&|dy1rphZtp=^)OjVmj9)btA^WgX14r9%BLRL zLnq}n+_?7x`^8M**@fomDVe+Sqr&d5xVyV@lM|ME%Z@#2qI(5pt40XQ`Clu7cmpLz z4lo^BozBeaiIsMA{txXek_y2HoM?-;^SGyzr_ZRYL^%5FOiGI1>5;%v5msZB>W6e3n zPocAuD>kb=kTsrGJMs~_HUB?yiUjFG)D>##5r7$>GO!!? zt48u&-ycXP8?y~8iX*8Xky|d3_7&2&4EBVjF)u8|Q`>6jq>y24WMA`Ua7t+s^5M{D z{+}^HxChNJ`t75!0>7Rdj>&?^wV-n^3Qv96{a$c|N zB}SZ9XK3xGTNEkL3qNjTNQCTs8I+eT* znmBd3t7|3i`-%YbQ*Wm$5$=M374v}okvUr!^dCb43j&@Bd>$8V=9>2j^vAEmZzJuY zw~BIbsYT`Ps0IuH%BG>H_fGX)OKE5Gw4{Wt)3-Z~#tvM;#%_#WP94jVV&sn+dL}^a zN5JRnX~Y(f&sPgrKNf@H9JyMENm=b9x_|smg!6_s^frtF`%j3Hh2f1~-6xcDKSlR| z>ki&r2wS_$Zsj{y%@UR&viV=V_iT?1M4h?Qz|{znQBp-OmqEpp6^!uX{*@ql^Du#h z>!XI&;{LY8v&qe-_WDj@!A6#vs?GBgc&!{^m5*HUdMZ@MyNBh%P`mRSx}NP#|C|y* zxeq1qwwu82ZFvU!hv@CC%mh5G|J-A!F{JFKV-K8dv_xNgeX^WsX>nFTyBCi;-OKEx zU3GtZb8iKw_*p{!n+W}iO8<5y^Qo2qHJ!KluO2dK!Si8$Ev^aqZ=H-2pI1q-dI1i8 zJQC{=ZFvjjl`hF(LXM2%iNn#8flK@25rV7<2q+IG+3PmAT#lDw#cffzVw=|{M3Y?| z>iTo@DX7^8D&WRAITV@Brl0Cn%NaXzjp2J`y(;y>+-a}h@vCbR#5rDk*5-`?h58?` zX0{A{oMmM4vP);w3&w)qjB+<7<;Dq!LKRIQfOYv3aA97K*2pVIB>X`bs`iDiGxcy! zek}A-XrXAHkb*0#mg^W}2T7Kc;h*M)gskOa;^K=(xx7qUJ-1sHOd`zs# z7SP0=50+{5&#sUE5n|R*btFC*)B|N2Zi+WF-$BfKRVIfiA?olL#yo%GX}mk$_SW$; zjC`q}&}}f#!yPEEzY{!w@?-1su%!_DfSVfJgy8x$Zq;oa$)`-UZCKkxv`lEDDPE`c z{sQWo8X1?Jw?M3g38Js{>q6vz;u{-6Qrj=}&v)(JecVBYlSOZCL&7N~Vcu*gKW| zR$Q^cgUv7bfc`p~Elbjq`f5IK6ku=%S{EAPR+F8+madzP?D5NpKY|=a7e|b zQyT2@s3P5VWS zD$97sAmbM=?*0Uq*86H(O#}Gz;{zR2UH6|cnL+;X_f)g2=mG`T-_Q+c1hs(;ElU$|V7fDhwLm*wy*(!-vyM9AO>04Je7Ect?tSj*pK6{mdU(9Gk$ zU^b{=sKE&Al2MKXzl90!_t8YU1K+-`PZ=9~-P!SOXfU&5p}nnJl?(>R)4=JVojs@X z6Hqr7q29l7b+Vh&1LG7L5J5wTW;s<6c(-cPC5d)E_QLO(4)z!SyNWV z)v-A|tVD3}<=Z(t#r;5|L&RwjfS~rpF80LWj!^+-L(j^l0>@EnOtdxuD6qeqWqw$e zy}>Xrj5nroyXj~?_~l^jdPdTM6gGY-MlgMv$u+6$!%h?J0}*45h{eU4hJ} zXL|!tXn7Y$9b%@l&E8Lfv%1Sern&^DDFBAQ@6L^+V!O}7At5bUpKpz3yz5Sg;lB67 zaOl4KCnE?;9wfUlXdVG8QgHE%~q0YkyZPJLYn<#66zG>2$r zN`)3OB!VJ_M!E6+X7#t>SX~b@wyuiwfaagybuSVyFfm0mNG6vKw!bMDXjIzFJrL@u z1r*-`vOFerf^;P#3#Vo3bhNi9iI%+c3d+bsUggA02-46bn?*d@TQ| z;5sHTe;Ixs&z zyBe>_`U77r6Av181F%IFEK3CN>vRN$ADjk8Pq#hO%hMH zEDkG(gmPt(ARpTG|M2u0wvbz8yK;04iIC4Q5>Tv6|+>H}<_YgAwWaaZ80mw@CN zrJfe360`Y-wD{5`t6*bXef{A zB;St7e>eyiJAd^Z={kOt<>77*yY!O9iYwrWZlpQ>Iv()c3g{rmm*sJ_=GHKOSN8_{ z*4rNk>o`=xGEOs&v2>>a_;jY-(YMp@Z6q4RjMq6?_w>+QFJnqz!|7hx+^XBoVM=-R zv7hRvX6gW!d57>cPr!|`Aa#5B?3XND@b0eocS#UQ-L12T9C-(=mCK2c_$e(xH`8#uoT#j%l){V#!z@p8{K1km=S1$5O2BmW-go zY6L@;00Er@*gD_kwU3zW^a9$WFUv-spyZm$-}^qHAVow|3QoSEAo|U(UmIN403pnw zf+;s=dGQtZ6w#9>z8qfyRT5k^^4tg9i?&VHwiK-9Srdw$4{bw!Aq1Rb-T)gAt&< zA{xI7x)>ZNjS{RG3gnTf#lEB+WA9O6|1b;bu+lgo?+g5pS66#?Y4rO$i&sC_$LJp< zY#Iixs;FrjNn6x+Q#sjT6mEfS$dsmg6ZJDb@UyqzwBF9f+aM*u1j+JZ)&y;VU;T6J zy)`ELQ-aEY8CMqNkHZ2w7yt;{G~IoFB|oo??Cd&ln23<`7Fu&r^DaatZW-m2J!~QY zf|2pF&FUc&+%!_YJKE<_ zzACn%^Ygp*?xituxq`Cs7T}i%cDoP_QTPc<5DfJLr{FO_b3Ze!0sQTQ_FLAzm9uaA zj;$JpwKZ_2(!4FPqsjZ(GAQkPIXRsQ#r<)@xa=@YX`j)i7}1^t3jR-G01>V~Mc@^q znF4KJF+$;rWePDHeGCsYSw7sen&PjeA=V1C2{e^v%`<$sEOIzaxL(G(hE<@u1A zV5Fh_UZ=qnurc?+!JHl9#Tfno&buy;!zJS@t1Ps|kPMjpI5mFF)=j_QaCTiPa`?v3 zJ;TljMPVYyRx6!ml_i;d^`at1byO?u{3gLq)`b~`(aY5QU%xc|0RXti@6vOI<)PfO z{0u8oi_xNA8_M)&co+Cn5pZQ5enZ`il%`4thMmW}VW;*s{84SxQY4tR`HC;0d>W$v zMcsCzg`<{4vzo4Z%!}H!oIwu5+qqkJK@78dtR&mv#2z_aWtI5VNMR22+h~bo7ZXbr zbX;GQ36`dRGQdUUE>8LX$X_5L*q(pd7Ds{7-Q5k+p1?iL%}sF$G8B6+bE`IZHHsDA z3Pi|Zq7%ks>6x$5A|*ig1tK+H2_7>YxWhUva8VkTS5@AzEk*ZJdY&}@|+#ko;8rh^({UYpDmJI8!!X6VwrBg(&hW|6|07PBLLG(i+fF}ZK6scsYs5`}u zgv3|R3wM_}KN4XTKohY9r(rJLwiog>iXE9q!%D(@ccT|p>5{YR^1^^@c7_ErsTyEc~&;IN}TinRjDSX9#0Zh^)#lTqn!mxFpRP*Jn|&a z0p!{Q34hpQJ8#??uVGaFE1(F;h)_nP4uWolj-h&Ih6#2L6~;2S0OvmCxhK2ybt<|E z9alEMaAz~$di$0D!Q`cI25#Wm=u-v9EXiQ{f@D+olI@4zmPQ|cDbj690WAsE2Fv6h z#$KZme7Rw25_me+5ZFY)_~glxxqQk}q_Z^z&-Knbt}C0LOIss}@6sB~0o`8sfCvv* zn3-+Bm|4T+A>#_uAcvDjggoi5T1xVCiQvE$&{zN9Dt`aX!Uxf>*?!63*c84ErV`)~ zXM=QDKvDoLU(5iW9|{&~ahbvCQT%@%nl&y$hVebdl6 z!^)@6rTKl-<7;rSKJ2vLqLiFDq~u$`8s?H#%5Ek1E4hH>8!IRxE`I;=1~$2J5ql&- zBZxB07s>>9%tvKP`N{H4r-z+2ax!s2Jfdpdc%0Lwo3hu#-cTWaks%I)W1dzW{7aEUoI~xIz=NYLbD1a~#>Y zV?-a&S9ExbmM7mZ&*IiXZ`ob#6lg;-xbkA$Db*bP=NNZI;xWp!ZsWpno2aI?=TR&5 zbgF&ZxYRqf_d4*j_S3BVq@*N8sv0LiA@`p@GgM}!O&H}f?8K9H&ZkRQX~h`@L~3Fy z(r&hTAb9E$JY=vYk6$0degZ2VD%kjH<_wUl$g14=F2EESEu-qgHAh#NG78U~Z6{89 zbkCJG0fWbK=A}VdO7@J7@cXU9xDG%=fzF1)Zkvo;h^oXlxZDZ$ zu4O(oE>bUjtv(u@P4-Ath|@8MTi3RYNI&@15`L8pR-m2Dec+i`unv8&T_|xzaEXFR z*sBf-dU~RMH6@2#&mUZoY#ITbWxnJ2fhrYWcW*elK)Q2@peDnUv zg0F`ILwE8#93CYDJNQ8GL_$7rV>ny(GhA|imf_W>9x*oL91vI=VlsO)rA}3t5mr6R z`UDuc2EoiOfV!S19ZscRzQZMc;(4)sfv?37>1(k-FccObV`)aTE?T+&7sNSa>< z*oi|w=30Md`T8w66OoV*vNt(wSR3EeSx}P3+Z41C1vxji|RKe)D3H>Ssk} zO7s95T8O{p0ej-7_ZsDIUJ0Z!5F_|#pHATdh5lgz%cS3xrF5pG*|e%E3LDM2w=nO1 z@cMKCgd!cVZHM1IMd8Me|D^edq`>@XlQv_@W|Cd^?F!e!7l7P$E3kyHAb?R-<=PD_ zr~ui>OS^TW`gZdPvP~AN8RwN`haR?S^#P5~Jv7%S1s$MYTSGF?0ojQu)s3q!RV)>R z9;WE#fZ<4UEEk~2^f8UX(B@<j_3@V=LE6i%H6X0;3a=e|7wDu-U6U( zXUOTUJ4{ewDO$Zic2?GqDOeQaV;MK$X)=?f`}2gG^J8J^%ZRhKa{aD#y~0S&WBcfs zD4FlAfxI--JbK5q6$AdX%31`^Vo&O$Lnq4jhlzI)i|Xg~g#epYQ>i5LH$U{xvIgKH zv#x~TN+Yl`Y4{+$aDJbGfgwGbP(gU8Y#f8(kH;|i5J5Af<_4%zuP2xB4&XWf!+SD2 zXoV+Z1Ocs03Nu}Q8u=}+qR=9~2C{Q{fvOh+NFx94AcD+f;lQkZ3u2d-u2Y=V`^)`7 zQ?QL7fqJdOZTFovlJw#p9fz_t(Pze>YiaqGlOVTL;1e&f7 zT;N5gYvs_0c&<&<0Aw$i0s05FA!r5zoX`B~v%0pK31_s1(v=TTgF zFY~fUQPoGg5>~wUd1&&P6c^MRmOV|=^53hrGC?_b>Y2l zKlp~wX>5*G?MYKQ-b8dPQ&v@#0&2&j4Z`Emdgr|<)!3mWrC%CveAu_&)tBQiZSw%w zjh7lky?-s{=I%fC8-sx3gF^Qh`$Irn_r;I1nfRy>5c2iqHEkiD?9*cY&|Uk|cWuV6 zL8CNsWC6ulP=(E^)H*QJewr%ZR9+Ge_X1TBm;;1*Z!@)og!6IX@JX3&-@lFjVNhOl zejaYt6}dkD=%EG-mXmT(*s;<%C?7K(=6kwOA($!a;a>HLyJ3RYd1w#oo_UH$^gtu- zp~x?%bhAqxZ`>;N_iD%c2Ra4SMr$Tu(@s%-^V9xJJ2>Zu|2D0=x6*f4#w^2M-<4}I6C@@ ztuG8ob3Yda#PonlaN4=Zmq87t%5(r5c-oWW93AUplyZ*_bnO{JdDL^qbfr=0ZIu1e zY`D2=+C$Xn6Pcm(I|MT%qkjr3|2Sj$5+Gp6-{&bSWPfh0HQJS0V7&f76He1?b07K( zt;9?9iE&6WBBEQHaNhq14Ee{yHK3g>k!VdZGr4R$UkKZb3%~9Fc(WLT$|yypK})V*&0{a>`iESo(7HBMH$TnZL1?S zj#Rsyh$t`NLI3Hu_YuC0dd7W;U~2Wzo2Zb5?KrWBv&KDapMIt8)pnJtS&oCP;A>g{ z@~?x&EV-0qU9F$TOW_gD@_NKrj(n#$w(S26)ySlPzx+l-5exN75B|*YzrWCP6bf4M z1BqZUz0rT$)BdxT&E1Vi_eg{GR9X%3+%l&7M&ON7w-Q7 zBm#J~M|1S?#D&SW+-xRunb^4tBkG~MPmmXM)}1bZ+1rKzUqE@@ySAXf(^_Lj#arsf zM+-GIZEb6G<}{g)$tX`0$9+_u)Wal~8n@{>_AeS3Mb@_V1)YKYI z#`m*U_};&(ce}Yqljsb++A1WpPiV**^nGrh0wy{B333dAU^rS99?RrJPsdx;uO=iT z3|The!yXYJ+{X5zy0qe>Sl&un<@2F${#`LVIpL86yth#m`Ae01*7)l1ka44cr4NfR3vDd9?8z1Q);IYa64 z;UCD#113F^p^{SA>W1P!Ffwxl_mZ3%LV7v<2q?*$~JEWzFA9(Tne4KN_;>I!4mrsF|qtp zq4q+V4J5|HmcQC$uTub;u)iQ}dGL4XypIs%Q_*((hD!;RQ3QSify3;O)#Zos2%8=H z^XQ~~{v6SilC+{8RJ7&GCI5ttj6dY&)>-f> zds33O|H0+&f;TpIko~YnEZZMaL9RCP>hXUEX!Kmj0B*FF6nLfz`*yVe|EM4M`3DF= zqL*U^4Kglw;@>wBonW~bc2_gE|9}5K5`+e%DTxUfZ(d5zzt0KY%NQb7$$5Xs>F+9C zit&HeJpybUCORR;<;?%zi3FGi3ZJYB{r{OOOa`&1zUY2e>-oR4B#4J8(K=DNJ5hU6 zImy4DDb!!U@{4xxTg9Ty7Kt49x_SNe`_ng=#BH~bAMfpmRQqq&RFV%}@C*~b_|m{_ zeLO;k+peWHME!qfkjH{NemkJ)j>hXn(7{w09ZPwIS0-c8RXE5F(=*VTbgX>{C>jh8 zGW8-g=U0Jm5YvDfYH9QT==|^1Mi+0+KoH2{Y@Mv7%iEW7qtu*3+sencDhc4;unfY% zdrJ8)H#bmE+2kAuR>jbiqr6_Jy7u7YuScBu|GQtak08YO*iRRq2}lJ#SI*J2iCzBL z>+c2Ue;$_7&Vrm>IbC2k&~A>a$A|X83+7ps9vx0AYM8KZDT?>+;u-iN2@e?rxggxm&F1c+6iv3ca4*|xXAiQ|aq z$wqEb#r~JRibK7JeyTi=>x9%EyT1E~ZU}Z(St^a4gqeegW${(QZO}RYYO}rS(A0&2 zX4hEQ5VVuWf4r^3c6MXG;5h-A%Xul!+3N#kCL&iI`rbrjN=G)pzm_#!92ByubCW~BJ`O!oN=N&>>r=(`{Wte z5-GHww;B$_J{buM`-vy8aXzM(!ik}NZv%roM>$14hC-zhJE%xQh<9(R{W3Oy@pZG6A3J;h3OU&q>x+c)IAbbM)pvXc+g zxCUcqgO5D>w|3&M9in!xg$`*~Y)OG-E4D4q_D(l)z_?E!NyIF29koDyWy3NA1I3Bn z?kLY04rc`_MgC*Sd};5c-{Shzx^mDV25zH}eebDKv_x=}i^U2BcuYGhNKW9?K7?j| z@c{UKTxQSzNF90%jU(LIcR$F#pfjOa#947RD|$5NuA)CgxTKQcu>LliV{-pk997ct ze`^8!{T9zLD;2g*QWQv0e$NHTiVYZz1%83bU#T@D-v6AAqq8|wzlIG_=)nX6hJMtT z_`lx-@^H}<*uqiWu!Z-Y6C?ckCAeS~0WT8v7;EU4qZ#A|{k0K3=^@&2XAsJ-4>C0XI^MC(&{p?;V&O(a?>)Z9L(*4weXEVvL?+55HIbXM3-n<_YJkndd$P9%m z@n>Gg{r!df?$1%!w=h{hNmj&G0K!)Yh^y^F5W$Ion&XWs%rhI^#f#-Ii2i?Ct-r5n z(STp_ki74o+50t(zc1*(;&@5);{SKv_y|1&{*NXUBFp^^+jU@#EcSqO?DTY7o)01> zE&W;YW3vRp^sj;V`+^)A$~A}LGj(p{{TRxut=o4X^e7n1mF%_B(+8{k z*FyN~qKgH*OckGdB_W_=_7Qg%8Yjkk0eGrC{^Ear3H~Z}pW^o2PJ-^wQU3FqSr*LQ zV^kv9-#*#z&%U4gAQY%lc|yVwvxmPO`*%K{0~1l*;9_TBJk31+TW= zu`fW#zW^9(8-SL1!>ODTfSM{Y9!!|b7KOk0K3_-Y1j_Gx>tUD6MHReOtSAJG!X%)5 zm9Z`}REY#GzhP>%xH8`WJ&PlNZY{pnGdLYArN2iZlm-MJ9n%wXoHA#>q!qzBgYHMI zOyi?~RZ#qB1MozVaC!iME<3Ssb0?4R9`Io}M?e02upTLRkD-kL8bCNdKmUsB9!PTR zr%3$XtoO3;=Drft_2n_BZ|j`{u&Ah(QG9lbyz?IbLd|XS`nj_`Fdy|JyzYzlHAGSd z0>nvU;FlKtv0?!8`3{JmqNvEnV7O+`XWMb=STv_n)>CE8#r|}nUdal1->?xga$py9 z^Z1q`2Bci-E0J0FKE&Juf|?mnlC99KRrlCqiCMs6lG++z*U#p9p;PiBPz5g9-!1|K zfDI>!erx#r75JyRx7X{$w?`eMV-|&3S?vb4fE=SY0R`Cm?U&XeX3O3`%kpK7gMkW0 zd*=zCtDSKoXc3&Wh=j{Hd0&Oge1Z=JRC1iWy*YTRKL1|D7jQs32Xw3Y{d%CeM@&eHrvySNUGI1yYRck%9H~PF|l7mwkDCPvjF8 z#h+iBBinwxQ1Du=mU=?cfn8J|)TZweiQ2aY6{agZNYqUFCqJk-p_TyEirULKp#5Sn z4hac)5%JWf!584+VxS0h`bG5KH0ABdor*AAFOcoD9PK;0^gID{ z=9B&?UA?zAPBM)(BRqpKDC#+RpiXNGL_%6YVTQj8da4;=p?4@K8BdkF$A+aSz8bP?JsY%D=?W@noWk($_4nOqtWgI0u&875xzauf2az;LtOy zm_ycqzz392S+kwR1UkZ)zH^f$&fS`befgyZnCh>qa zI{;7w=pHZ8JtQ<4&8CX6rJ6roAB9rrVSw#YDG+b~s<~I#F)B*b&cCs^1NHwY)zoeZ zK?!#Wz`apdaV7{dDT;Lwp{EZ$f+Lb9eOr@-#aD`<|BIxad+$ejQQhxQT0v&TjuC9(=PpirD7i~J_Z`ddJMjkAvO z<$n4!wDs+#PxlRZj;@*rz&E#N4I|42D3s{FN~*=~#GUQ#$c@XB4SO`@9MaJgLf&ol zyhqox=;*AOsvU?oT89Rn(G)`3=WabV9hR_lma-#0f&Fzu65>tM90U15_={Xm&n`(d z5fU)jme0`{Qk=gIiTn{E3bo5;9oaUY(M7@eJ|QQu%)rZ5 z$P^&gHHrCXzahOwlW_w0_Z`c;;NJPJU`!|9Zt77L+>+gNaw4<$K9o7bPBS`%9>Uh3 zxrz7frKwH}dX;P!uY)W2+V97sf}Exg!zD`ysmR2{SSx<^sOW9yMvD9_zg+S-&}=y$ z0gPBs=@tca!n3U4N{S2U5yMfJe<===KhyS&d{i3MZTW=Su~1|{+yqLFQ#ISt zvP+*Wg&Oc#Xy`*>Wbx}RM^$l=j|GOH@u{TVJx8Aw_$Im#Z3#h_e$pP$wz^Iu;C}QP z=L^?|!adTIR%;s5cV=_ewSj+?fcxi=^d*7y<8OG___$Drq#hwiJ;@a&9FO(Am>3dP z7q1jwbQg?VOL16KY^`JRlnuL#0|G-ap1ONN%GN znFm4zYZ_u|^fKqPdBNL@^;2XlF>032aWpD^N9+Tw;2e-pecQTITtdHXMxss7*NI^##o`)Uq+n|tN;w45a3Pd87M8$MC8;~STt(z?=5vD~C&#Q#`mW-PM zHK{iG_WiAJ0QeKxvJ?E^4w8XN2c0IufgtABp4p%b5n}ao&G72!)fI3*eDe+N8$zJW zg+^askhRAJ0v6F0rXhj6^rGbjnz~Yn!P~q;BX7JB$^K}gFLz|GUB1A*`EwO#rGZFl zK$8Tg7gj7UnblPO1$3l78tSt-=5d6l99CauxLC)tTLx<7lB>;dzYNU`@aU{%8=;Us zS2MOQF{?AI9}5a4F+w?L`^gB%z}YmlXN;EK44TzlnM`T-I_kGP3+NCQ%!B96J|;F) ztgJPkQykaIo|sAJyA}rr=Aeryrt!MiJcJtNvTZps!9D>kK%Pk5oPuc^Z^dLtW==Sy z9uTFE4cAAl!5ny4JHXqKN?1vf%|IdN;flH!UK*p-$W0xs0s9zA4kv_gRFX`<9rA3+ zbd8@{rY0^uZ2p=S#N@VC~sk#Q$ETnu^;^ka&jJI!SI+9C zc-((FZo&X>LJEPW!c6w@iauL@>vFZUF8iXZMn6MgvqY@4=0NsxLP0P&6gEtdozP{Riec>)~hoEn&@~dPjZlZ`R`6|wHZ18htpNW8yQ=BvpPq;uw_wCK8 zMD@6OvKEg)7lKUVREfIwcvXUaWOe)3(JS8Esb}FF(F)ovGslqK%UHOZp~5aC1SnXG zkoLia%2Swri~f&kSiZvux)FT(pfhSlegtS=5c}p;HWgJ>jpX6NQ*onEwJLY>ywW)|FTfH3?%$lj zc^;-htoh0N+BQZ=>&Ag0$UI%Ez;Rf1tNQcqDLe zpG0m2>yN-hhy;X{(9y!)3m9k$)SCX%)0-I2hLN*@OOL~v*7a1zH&<3HhY)fWLz4^~ z<|Azi6`u40uK7ZHT~Mg=)^Y)@s$zJP++<#y?Pu+>;?-;1F(dcyAYLG?=XgcUq4rUB zzw4IRwD{p$1L57W5GV7eZiVtC_GVbhMf{Rf`Lr~#)sub|o_QP8d2+*QKW(3f09=<; zNNAc8iG5bhCi&bt$ZTttR?}F9mjcEuM{17IbI75oh@R<{GrT!;;h$y(8ieyBLPk-< zF0e)eug>=uxBZY9vq0V7PIl-Np9J&pO_Ha0Vx(flgg@g(fF~BUE3yKLtV(BkUw!zb zU5&F4fUEmmq4^oxWno=pVrU zboN#&jz`(V{<37C-bHwJd|R87wyDGy8M~&F$epb(|2{>Kc5lgZZVU|y_OqP6H8$<_ z;>-Gc8ta>f@2KP4>AWlB)LjkSCYf=hZ+Zecb~y(A#I%L79sx|`{AO5itfIy^ z741U5NMzJ;RFdQKzn3p;I(@nCN^-TCT73Qe?TKd>Qa^!_yAioa-u(9D2h7vmxmbbQ z3&TY#bf`k$T^ja;L0m)&>{CRYojKh2_QxUMaJS)zPHP$3RWbNzHD}OB8P~NroXXIx ztfKP4T6=DV=}feI-sRQiyU&b|qTimwW~_045zWXnDel_6lrw7ne6o=Z_v~&K$ z(+SSfaK~alb{&0bz>KCAi~ZTXkmO!1B|;Hk&n%PG(9q!LGYurn_Y$rb)5kH}LGr?4 znP$OePdPM9%ejL&HtgF>=nPJTIaZL~dgWzF?^6D>-yXY?8A)~^Q7=k}5PtqxOxvDE#l>wsDI#+riPb78`MV>k$IAwz^=W){nGNjrSWvJL zA?-`FuZ-WmWC_*ZY*57;Kw&$x94b)Vd{4mGJZ$|RbO(*p_mQ54NDE505QzywDNwPz ztkB*2sLmIR!}#jOy?#RoYFLj;8a;W(3`Kq|{PKFNhiq=7FPe-Y!xN;vVBgpEZ~9Oz z<)0T08jci>1Ff17xz4f0xvC>RC^E~VvFoJ8Ijr3N3~bP@Sf-56M}?9^^snJrrW;Bv zo{iNcuRprN^U}$QSfI+mSAc01qRZjHH$ShU#W9kj$$$34>f>SD=*Dh(eS~;pFy7AR zfr3wX!>ib^L$LG7nDJeab?M7S(usF(xMSSXwqIqLF=s~6q_3%&>m{*%XZ-j|;FYt3 z+JB%YHIUa>R@|j1u!+zo0lgUo!W#gEaGD12@7E^0%#!F*u^CC@PM826n=hmZ`~a>x z>(SWLX#gWw^yApFA)X;WG$QjedpAC=k3#$sDbI>}9k5T|Zt9#Yjh8*jtT#3X;Ji0h zL4;4Opo&p4kfg4xCZ;f|0&h#pK+~_USLG!kx_gq`MP$qhCm6Ln)yJyqKrH_?jaOhV zdI934K+C|mH`Lr9Z=z(~`ex~NAj8_ap$(o-di-1y^HH0j(q4HOJdV~P>>lnjWatgp z2%5;3_%(^hlsR=3wH!H*8Dobe83Y(V##dN*H!R|O-AKr5EuFKG5hnlBW{HpixRy17! zeYVd`^h_ULyvnq2^I8aFj)n=VW3_OB``da+!T zBhv8zk40Q#o+WTd)_MLB+HR`w>`Wb!T{2zumMp=c(}ze2NNPKqxSV-XT%Ihl$x52k zje3pCd@Fr%o#EIay*JWLV0VL)Z-r7*b7ocz2 zJlF##%?bjSUDa)g`F?1aoC|g^_w5?YwmSn+C%*N^G8m7KkAFXzQ26-mp^R8bx<1E~ ztuE&|rwN4njvrvVj0u*h92xru0+q%SandVV=p_&%N;;1+dE~Awo`PUkv)Z`nAlWp- zyg&AxE26G<IKg@sAS(A`_|vU(jV0=7x579Jj%1<1zlZBtsm(!MG@oVWPq z#?DT0>2ju+O2g}EQsm}D8z(A}gV_)U_3r3#+`vXTM@P(}qyS64_yW6a8E@FcuA2E zBII%Y()eaGWGeVMD{uqdHsKgLt>&p&|Tj2*WGjWaaH-hOK&{VK&9`%x2@f9pVo!N@2cC2b0a zS3D0(+{4*$nIMxe`eBucrLCs&xoQuOP~~xr{z;9j36w-!+Q|M%rKMGeCl#3qxzu$Z z4;@Eo@YWx}zo%V_pLwT|hVi}U1|MByxqOSoT5jWrOV>iWMncv$Y5bI%=%TYzH7a+` zGtF$^%6EMkczk1ab9<_sM}O`-T0oSPVF+;%{)BZu+ci)2rt<3rnSd`^@`hdm$jcE( z@4o=prGz01?=+$($6pBlpB}MDWgYkxtHe6)Tbv5`)=sa-Z0gL`r0~riM%1 z*JQQ^Wrni+_Ksib=Dv#!$l3a?;@CZLSTib+3(C^VzeP=Y$kzB$L#@8U?|Cdu-X_UR zD`=~5^;2r;WA$0uZUn7gwl++t-p4qLwonb(r(CHC;l&Z@)o(h|Am#@{M41VirPy^V zJl(0L;#oXyful`)i>zPQ^W6yJ3sQj-w)H+t$Ic?_s88VuG-hLAN5M@<`>9Xx`vv{T z)Nu*bfuyZ(%R}4k#3YjCF-}m#JQ$~UcQJxEd>D+){vZ8n{)})U0A8VbysCkaOoE02 z4a_C`afhCFF2;V_Pn%Y?qBqWOLt<+A5<}$#%j;SLvj-ZpA*_0ut$hv#+XNA7!8-)>+x-x z_c&xOi^+|cU6XO}cP7O(F@FGLiwftoc>J+=NjfcFcR)AY0L{CB&h7c!e#`MZ#Hz}d zuV=mpIrYCsS>tvFB7S(@!_O zi^%)Jw96KiR~!a*^WWNaIVP`mXS!v06!y+}JzBz3`P*!%Hs8|9V2vJCF)H3^eBWJB ziVKWUu_!YZwie%fcb!`KOqfLLP2$_EQpvU8GiGAJW99(VH>fzTF^CUv4E5+#%F66is4nZKLQq? zWI$7}B6qDPJn%@^_6yv_pizOO`5~a)Yv;W{rg@Y8SdkJLOBZ^@j11r|T$Dkb6s>)ROgV}XiT(TQ%yF3t+USYj- z&}~?+4t`h4O4;$G2JH7AD#Xj6U!Ko8i6O&;jo`%!%;JdRUQE5wwU}${b|VXpuitD! zdb-@bOQz$TT#8KO9@R##(-fzwR#)0>GTCkr#W-7UF*VR9eW8vs@p9zl&!wK;D*7Vi zZ-$SMESjNxU%xk{{^r*9QhJ;RXY%Nx!840zls*Tx3G1>-YUMSD_B$rBK4Lfs+S8Fh zuaLr0w}cVN%LPaISw94Qn2RVqy~o)yA(NY;e2Yc{Zv+KOc^A=Id)-VAt1==LMH=={ z^5sA+(cdR8HCfhSNkc)h|GlU|3}Lp=yH#+1EvOc=R9W+j9*&P*t2;a7gj0upjmDGQ zvT%;y&9#XTQp=AKNeQ`ngawil7%a{D@y$rxlRCk%D=c_@=-(Eai(s+_pvQQ_(Mt&=Fh?mf7fppsM*X679g@wka-U^UB> zg8(rT6JKCM_q@) z(uB;%hZm9F)3sfqUUoXgo$J{5Qiq!6(met-HXNRS;bl>JVBDLyG!{k&kyY9N&k8JD z>{iZ$?2a|#cMqVm(W17Pn23+Gh9uGdOK&rRsv5%^FtEo$B-04=+Vx@gZ5KbyRex`# zFNy@YBSKk2HL}x#O{PI9%e^wvz?;+D&EIUOLD+KHqRCc(pkyjQOkf}4({PKcrZp=P zR+8adAw9Kx*Pgqu(^`;l*8}POU#d|00cna1Jf+R>I9sOM-m}bt=s`)N^$B3);;g1xiP)c2M=so-_VHUHhmg>=dJpzu>}KYc;CzLK?A=zF1DL_cxzx<|PZAtPIE@`0KFu zlovc|0`KBvv0CVRRAQp_R=-OVX!}tu|N7~ahy&G(ls7&e7byhvMeJl{XHx`;$cQ6$ zyNx2J7pw=P(lO_wnv1DcV@+G-PCCr2ZIX&JoiWAQDjlv~*EJ zLlVHOCGTr8uv>k1;p3aPc#|HA0EP~QuNCrk(~-1WQ}JuhjhA!;)Xw!8O`JVHjTVQ( zIp0#We@?Bwu$-Q4c*b4&av+cA)F`2X~NrhkRt3lcW!O>W2 z-={HruxLRDzK_}8=1D?Y3{`c39IMs!>m^V{xtDjqR*-;MhDS;K5Qf48_lB%X#njkIo@I^7( zM7-XcYj_o&6s0*;Ar9QgYcrwFRJ< zN%`4BUPW(UTPw92?)+)YQpx_{(;61f57^5NLeROTJsh@8qcxl;rG9*^X-L-$wF-A0 z#-?`0nghATN!LPo;@fMYxhSErtLi{4i|0?>Cj3ON=eYbm+tQp;y)|3b@}KVU^1wC| zY%R#Gpl}?R#|Gc6T%;GU<^0}T51{u!)G*9%7@d^xm;O&l*%d#0d>#}m?v^op?-Uqi z@}Pqbp&`fz!Azm0IRphec}8@G1IJvPYD68r`))t&HBo4-$MMtY@-icj7yX;q*dy!a znHgDfX7eb-V^~W`6s8gL=MIdPm!d=`T4|1CzS?s|rn2w(2O(eo$I>i_wjb?=Z>R0! zCB3UAw|wQ@1k`_9oLMdKrzFwY{E@kl`6ELLyZgj+L<3iz^ zI$OLYm(bb{NtOGrJ_5YTwb~2Z=k$11g?f{Ak;9ebM2JT6)D5YHY@kVfsuhP_hZMth z+Q{(s#mmzoAjUd6^b@&9gQ6)`*16w#pkhr_q@G3Zer^Op!UQ?kuxZV{MxY~%)uBQE z{6hZ_=2E9ss`?p}&Ol~(uexsCS$HHTIoGRKNBcQ}<99_Ze9{f?+L5h#Ln*a&*Dk{U z&z$Lx4T&XJ8rk7n1bD#F?K7Z13tzU6JWfS9Xl@|3c6>gKcu0)2^g{V53>3o=Su%I| z3h7alYoRg37C{&{Y_d0?7P_9c@MI->p)nF=4$lo~OoScb)#yx{Rnx6ngv@`0xjsJ; z{@N@1PqW_DyeM#v0qV|A^j9-4WVjH%KSyZD@TrfMuCrtgU~Ph#0%SYB;;8HzGNMK& zK^C=ix->ntN#JKqv3zb1vzr`>ow`6;n#hSUDm!G(%cc)=oLmC)aT0%Gr0x8GacMNA z*AEsJ;&^&5NOhgxWS}o#XFGy`qE(6$u(gYP!^e6Qs(g5<2$Q=SC&V?CHWpq78zBW@ z1~Tq7fm+JXLoX_Bbk7LVDE+h;8T2HI2YzCbH2Ac~TXkwv@)p=#)BcaH@*GINH#4ey zD4e1B_tSKnH9LFoT8I>Rnx!&2V)-Js5RFdh7F$Pj(eKrwYE)U~^wrcYUkmCJ?v$@1 zw`>>}>OD-C?g7YBcjE@q7+APlFWuvBS~ThoPv@@P+}w?=t6b(O18O-#Wa`q~Fn@Zf zfE5@??Mv5i_Mrf0X|n-%tA9wV8bA^r+j%%5{olIeqOkUM?X7%Dc9}-yv06h~x>Ut2 zYz4C0s#V9^)m5z9)oi5=ubKLqqBDxbyNCeg(#)6Km6Zt>5P#0*n~T-B*L>_Vy@F`w z;q#7{`+kBq$2XN6egprwP$XlB)C2Nzyh*WzCRQ?zSl{2)0XnaQL*$=4Uo@xtc-N%5 zaG|n@GYsyRX$Sw^AkwGcrq-r&l&Z{i8^ouqL^#bsKH_4>4Smm({uM9!BAUgaUyzUd z`F%bTHd6&&xGE?)B#QT5RB<>O_TRq|3-HOw6U!(3r*_oe3Sl%{SiZP-TfGfW zq|O~lzmMqdGh-(Fb5Ec62S3$HrU~+B$=W?6C)es4|kK;?}i!Gye%uz9>H$$FQA zE)}ut&+NlRY};`s`jq}2g$vj9%UMI?jK8udS#*z|Bz2UfQEAYPQ>(^ShO^VP_Q0esfY9uWs)+pLoZP`R{_wCy z+Dlq~d!#dTQ;_$2Wh>wPhWY&mZ4hkk?xXJ=&i^aS8K90`_!@82AD+dX1FKM$RxU@6zskhw$_rO*%&%y{F$UWrJl|Am&oy#T%M!{ z@baNmQ2veoJQ2+rT4pl(XTxyfMqf)sR(`@-^MELbN(ap4>j8*~%yrk3N8ZG&@}o{z z1!?(2NowR3`;B(tQQzm*DS0AdOq zUdh9j5zI7MBjGY+g`d}{fibrUA8>9-o?^sd45yV8+^qd)eSlE`E)NjE@~~7Q{S(f- zk|$9otb8xmq8Bk#73v-{lR6B^ZlMvTqnhBp6U%sX^+eEu zP9NxflOY=zZ~ENLI6V67*!R!zUa<#{cqJh8{NIw&2EIb~^kq#t@kG$}M-yjjJ|8|J zO+jk}Idmfms~Ht{#1Pv`=0ANdD9;s0=e&)$rnL;^>3;NBT41;b~OB47>#{i2~tWP z^^%piiUj06>{fMPimYKRtgd<)<5tAx&=_(pQoV8UrDs_}Y{}W(XXWShm@VXK6hdM( zD?-2Wavs1g$N+!LqZcmWA7QP~0-8n<%4|ov+slZ@>~|VCBL|)x~pXLZw6OHx=+tYE&+t4Ag|0x#EOocldw!weExE9-!I;^WT2w{|EOG zOBc$RKX9>e%pvga+05KMbuT}qp0~r9ig?5Fo_{jJ6txbKrvC$`hT>1x0IU)fn=Y3(h+H*KpD`)lhqx~OFpk#S190nUgX zMeNQNX%FirHdf3t?)p*`qYlXQMmk`mZ8{8ZoO$D2US}*~f?O{ht{2Y{e@ED9U{g8d z`0@P;JD=WBhwVkk};+#zz>k@=IthREt=uEQwP_n$o{F zGSp(~>{VuyKIrDfwiGAS>@%Z`2^qqeWo3vj^w1qyvP>*wlUt1cfFnQA#~EK3?mhHS zQ`d*o)bb~-U#^X{zRrB+NV=bHyV?8_0H(UC_D%Aepo`J+~OJZ8JU_D0z6CI{^g zVK+bcb5`L+4l=)B_&$Wnoa@Hwht9WH6C3Ncn?0StKY3eDPH~rB=;19Ha^@cWlEu)M z$F5A}l6qsV(7^zxRedE{f2|-AMVhnV-A~j5~isEcJC?Rlv{9S%EFc4E#Wgm{ZGOCpeIm#4dRa(Xn)mo38MAIBa=Bc`9fgh0AvN~fz(b( zft=*}sI{ToOmiIxMrW^@-yJhS%$&}Qivn2L^vp-n4qO_8*4L2{Hv!@Gnhq}_FOrV=fQ9x=zvwRs4Y;sl2G3w5B1nS!_drwhf;Rq< z!QaWw&nlF@ED#@4vFXa;k?rJMnm(gusP;o%L3unKI8Seh~_>~4LG7)})nw75b+^qR@fd#wI}44J9sQR1^dt0$Ax1J5*c z58{9NYhS!3Cn24s&B1%M5%yOY`l0Mqj|$hEsN9ck%ObTTXHCj#9bw&3Z2Gpn-8>vw zy6o|^MvE)^a#5sQ^P)drJnQ|v*SiWObo}?dH(=ctxLch=ufjcWFGFUAGTFXw9kIsu z!U;UDFa%oVUI1J%=-dNW@p`@(Bxq?u_eRtqIPqJbDsJ6apGSO-d9JJ07LB}mwTqS^ z&b*C$PF`vaCDwHZM#?Tq3ahr<&yf#&e_#^8pAPl0g4o=}*RItcR83K7ApNz_(EMQ| zWOFT#F428O=oqFvlN}~+kHg9j8G{o(sn_(LpWe0N=P=@bQ{!vgW&SqBX1y_5yKW_0 z!rHgWz5vTI89;?Wq0_l!PIh@SpFMuXel;!G#@VoN!dJI^5T79V3p@AC1+?lMXWoakxB++zz``xMl*VWtbeND*}( zbB)63qyll#o1S-mKPILg%0Vaef==hZUJFVcBrt6by!KVPpO`2g*pL>%>L*HV)XgG$ zSjETZ124WCH!(9jOGVoz8Qw>a6fj$pBxGm!X<=UZTmA9DzWC%m;SVj)1XBLCmX#Q@ za=eu6d6eoko${94WW2-$W;6=+j!AXjqE#Q|^J&)e8qAqn=T5Gw;<%BZF+hiAyuekc z<=j}=?imiUFm*_CxlkQ(uJ+}h+&NCY;Q`+2Am4|6lO5gX;$+6O({^ui;z`_!clxu4 zyj=HMy@>)YymFmPgzIS()GHiAJp9l^I1R%dRH(cA-09kGecBa-;Hza~#(&!yJEF)d zZhP|M(GXA@zOaM7UU(n=5aXKP=dUuuJ|zf7A1>8n*W5a-RL#xJQ)YfJ6w!}L=Bsao zA29KflKS}kKrrH~Janbt-nLkZT4A{*ovUMkant&4kwJ7-P$A}FI+Ax=LPr;QT&0i| z$y1^PQ|yBDNzlfiqf~D99D)CVZ#%4p#@BW|aXrxb>9$Ucu!+vD|A`=s5?>EI+9ogh zi|4Nws;fXOUFZV)&rY+5@%gOsRbZ7VY70-|P_JC=8os1CIzioo=#Kf0iRr}qHdxIH1dUP zJ|H4DRxo~h(+E(;GdQNm8XKzTis>^xg$18FRNR@~G?!JP!jek)wAz|tTZ-pymH3~D zRi~RxA}jIX$Bn)BKn3d`iP*L|&>qL;v>G zHRbvGt>-t@=1g9VCcF%H-gJcYv}I;31zt{3(i4VG{v<(b*nwEwh_XTxOH4UAmTN*_ zNE6y^4IM%588Dsig*Lq&GSCEguYIsV_QM-4U-u{q;xP=-elE?m#R8pK$-Mqnvm34n-GMSZ?Rg9G5Ii8e8D+WTw`aOnr5&XB1w&&Ar zuA*3xyB=_L&7nd$2B}+ffB04VDP6k^ed%h4?V~(iH7DJ=XcqOKtgX z3}yE(*ycJgpb8xY~x|>cs*V^k%11cbh{TQQ3L=?Z>$xsS3w(ka)$B z1*w}h7e>E@6w0W4oS|xkRlWi@ou<1Zl_ItEd3I}}d3fIIOp$EaG%s}6PbzfqxIMAr?-Yv z-Tf@Lp=aw?rp+05ihQtrUk%VZ!M+t_dL}U8gV2$uBXU>P@ZyaRB0J=qG>p{ji_j11&4g%a! zL>f}s$TL*fSF%|?);}z(nZnlt3LIaI$vVBZT}t%2nvP*cs_^jUzVW(mOjktrU*ZQ(2k<#spdMRG3crkFz1 zs5juSfP<-&#^607Tj%|YHnQ_C5ed8Y94V2W&H^=| zPLexnaacH$vmV38HZVLUtR5b1Y4?D$vKk-m%iwDztZ6(t&g6R! zm`37K-veCSw;bHTYv;mPA5oquBTA9H41g%Yg}zPd>VeMod8D3PT7@(^71MIl*hVA^ zlru?-A}U4Y*CGVv9Ezw2Vxc~=sLE{fqk7ZzhrAb(HZG0I%1vf~Sysq3hMAWlfNojp z%iWc6s8}+T^9aKwxYb@eA>t2bg>GEPe5{hm!ku9%9Y{gT+nujGP90EdC*OrKv|w`MoQbPlby!GV4m*V!!66Fo%Oq+JYRy4=ATNn_z8W+OsaBZ*zi0I&4lq7 zvhB+^?ycn7KQ?U=G)NvnL}z#eGrc~tU6;yf<<8IP#Cv!2mFAIL4kB8S5;T2r*(Q_0 zsMTWYP5g#JB%elZk685^Z`T2EXa~hyxnc37vUiW9NXT8jE|w=x6<;JllY(X;jJkVi zy|wJ@ePn*Ztt915#Gr>^h{_u+h85AYye>V|JfbtOt+`snrAP=voHWBsL$hIV>)8}W zd`rN&^IUIGAym-5@nc8`>L>oU<5`)*TWEsr(0CTBWY_1P?_k=y3+r>fRvT3y+$Ze& zx3kuK%I(&(Wr^u}8%i{+^7D2vb2SD*>`mfh*daT1-z1D4nAloS6`&4Ia;51_k35Me zL&H1bgpAc|!`&^ADCbJiPLx1ZX*yps{FLL8ZW-p|)(7*0UKKrK#<$5oZ{;@ih`Y1n zy5RwnXbx>mT8Yrnd$`P`do8eSo2*rVoVWR@GVttXa1V*E7vb6-Hy#FHd(XOxR^8^8X1P`cP{;d+_L$s_pV&p02vb-^w24R zL;nQt;L*RCR05DI#+YnFb%h))qsHT{e)k>-9v&dkF16Y@}Mt zR;h-G-7W61M3k$2WCr=ddjbWU23pqZEFB*$C3>_sV%e7nk?fGB%++&SERSCFhJQ7+ z9GqABVEcfH34-H6vd^4Y)rHNIDL9x}A};lVl?rR9KdJJ2$UT^v07}w|2`SZL4n5?p zEw+`vmuR=c(k|g@nR5F1Qt$UD`O4Xl>)&c8JD4sc7UwI(Zn6Wg{~!XrAgo* zkRw3l)7)L1u^`d-ht}nc9Zw1S1|-5hvyWS>wWU{N9W`tr>bJ@XSO^TLmNA9dOOm-b zcE<{}*uL&aH#m5jX~-Mj@yHFHGm8@5Rn$*2MWKK0hi1wrF||FfYP|?HOfHs@8iN@5BDBw5p$6>N=4bU+SDe?228(Bs(4XPU7p+*r1)qd%lahTQPQiEpf5 zF1_eIY0DMS%gr#8$6->c;P1M$9b~?+b-?$qoN5cB$h5j$_|dP2KKO|uL1!rQj%9;W z8=~wCv*%}>Y;pVbIyf`7@a(6pCVC4O8uj|7p#LXaZ>%66pG=>dw#sGBTR(OJUuxY> z7@tkU_d=xz>)Fr&K{&J@&;}_u<-8Iy*%+WxTFm#Gcd>T9;4}VwW*}Degp!05Qg@?} zg`{93j{2zvcw9D)lJD3WCAqx(qqojx$cW6aAJ$G9MYbU~2d$Hmlllm?phYn;S*K2q zMItqQ%o9YV9utQo4^EG-8caw?)6>pOw;){-HKGxjs}XrM2W=LkM&I+7{rp!S32qMb zTpxQ3>GktyaR@Fuy6n*0WsHaQIUr?z3YbyQ9!wo<>4toCgI_!VJNz#=e9hNKXQ3wa zE#!+N*mIwS+r4dP57O;w(T8~|DYc%M4^l#3lU$lQ#IqP52McB*Lk&NE2zf_Bl2g@k zzCrXHzESdo1L<{51G1JzLc9N)&!}0fydONhJ^9x}6e;l~E9cV)@ zKb0)t*0zr>O7rpB$+cWm$K{W^mE6Cmm9+0Y=l>u^$DLdVQP^BR_t8-;;uj={G)Apg z<6CriNbG{#_^Hym{fO%iz>)c${7Hf<=}n)oJPwna3z#78g4y$>lkYx}6GRuo2={T# z@8{QdSv5utcsszq?o4zAy%XYuTsy(TmJR$GsWSZLCC`uR0ba}!LjRZ=j0>U;6Br!Q zZ1RvsMRa2L%h}$*Mb_||1>DWz?d8p4^Yf#zC3WTbz(SUrK-|lD^gd;riIJ6cDckBZ zkLh=x{q8061N%L`17yU%@#BU2^2JFKMQ)u1E!vuwjA_+yDYC0wSEjF_!z>IEd=_Br znfmx&!`>=8?M8d_^u1Xw@f=%6?du&%ARN@?I*;H&oZuW*1j$^`Yw?ulK8s{>``AHb zYVLH`#EA*m8^$`!Z)UvWBQ+jrEdgp{v)Id4Y(rQv6T4p5&lVtS4e$$Qe z_>6%C1grDL!EmYvI5<5w&BDO@I@j@j1k08fjyV)80EIrjzvUskAAFR>#&16ww?&fh z1omZ%qv4y3lrsU3!tgI=2bTRm`(F+EX+haauYA|(wKOa^LZ#{KmpRC1lbK7)$GN_j zZ3U`MUB8!p?E0PJ7lJl~-VP)4(L^g?+FwSL{mHl)Jnp8L`)+vj32GvC4` z1`zEJ8e+n4jpZBrt-c=W?lA{UJcfn5qa;z`-N>kfYcnNzrx8uAK?`i}5?|fH5Bj3h z2^7o<|IOx5^iqT{Ve>xA!khjQSAjlN_nQ$Si`c+>{q$ei55Mp>c0iM8J-M)yTDsk| z7};6Cn&2810`+q!NhWwk_lKS~B>UYgF{c-gnZccY@65okeoSUj=t}24jzZ6|WU@Yfvh#@O9!mqvdtl{w7jl!4!QXbEnctnCKF4cKdNAL}gNA*kXgPS0{mDHx z=F>om;vu1}kb_=T|> zO6{1|=S$9PCiR%#*ByEel{`&z{+?aqfba)*9!7loKgl3mOB*$;@o{OA`22%@^PBB_ zapgqfZhf(7Co&*c%s3hI$aX;S_|Ojf$&=qywpg%`a@>6IfeG7=$VSa%k;+p|vM2Y- z9r>)!tXL!~XejQvKR!7YM$^^}j_gHLWyrpW$f z4MFrv3PgHZPY#c;-r;OoXt9+V|8>wSO8jNf2tWELW9`8%skYn72fmD0-n-sHhw>Gp zP=qXf;h~~MI%y7py-!<67bXp1`2J?=WPTW*y-Dnu0>}Sj?=1te+PXDRK~xZt5>SvX zky50)JEdE?yBnlMy1TmsUb;b~^ChH9x9+p zrx`)c5Vco*I8${!Q1oQ^nz(w~?F{6xLRLXHhiW^9B5g&y2=2dEorDke9tEb4Cur{) zq!jug!jjL6M6ig^SP*v40_Hd@cT@7@P69j(J z-$lLpAB=2cAQAW;>%ah3)z~_^$o_t8;-15eJ+p1QADhxp38(o5bZojOi%Zz{HO+-R z>$v;(JfOkS+a32NZoRvaR|7JY0C(h}$lp70oUm7-S3}NJ?|x`+#|^&6ChWy-7R2ni zH@zm1XcQjpE){D<=)veVjwtdgop23~+=`RsE!@l4kWFjfzaJ~zO+5_}X7n$xS4&H} z^_6$|@h=k(uLCHR6+h+D_$zVySN#$V9sY;__Zm<6`pZk2h|~@OW97)Kiufek&+@)B z5C_nN_)>1H4onhK2f4E~QEzh8o8F=PcUAtM$ufd}cbb=|2*KHDICgGH`=Sn*4X@1j z7;`DPfC}SDR&QdXUoj)^u*T9pz*$xZi%TQnds?-y8_RhA>iH|BXie;s%HcHjh|rz) z>g*uja=u|S(dbt<2R!095v-7cNGSEE%tS^8H|eRL>3$P&u~PZwmY5suHD$)2+!gJz zu0%sI^sYR*eCxw6)9IwVC+ic8ulILzUNxD}4;2n4*pnfJhaaU_3U>50{-eO)6`x^F3CcHaq{r>; z^3=}XfBP@URQTo1pQ-5r6Zl-_ z`(N=;GI0_5@=RL#6q}Mf7e7uGQi&;BYcP|sc2=nQ<5t+78j<&287<7)r3%j|(8bF$ zTZ|uK=zrv;!BDBS#D@`hm`;^R0l65GgLa>CuL{<%VAHB$O`?g=cmYd9)jbac6Q996Rw^BQl4^(=-JJho6j3b_c5xzU9Ygr7RX}(XJ(yAU!~K z9DWiC>(Pj3dap8cc4dC%t@_VTyio^k!D)>^atE*%nL zkJnVF4)?!>6(kkKdM6pR1f=8|*b@77)g%_aEHQICspqNH1@y$r^Y@Lrn9j&Zujx@) z4X1HI?6=-u0-7BYAl(76m}NGFNzHAJ@bQ37dT}5^SfUi4KwGNW7zaj>3d>!N!L*M2 z>bKCXy4A33AT*Q!uJVu9Q-s0nT|oz}cWJOGUl<|A5GfN=tQy2P^T3e}OdoO)6jkW1 z0-B+McNPmxY$yBk$wp7ro$#&!-H-9%N|&n}nC;C1)AsMdxVy>bNG6$?-~(iyn`6uu zX4E(5*)&Kh1h9^8Fye0FBCJ{>7ENK_fkdg$BO-i_8PT;1X1@7DahbA0=o*5W7Je<- z1Mwk2yN#h-AVLw@r0jOOE7lo+k{uHhlkuU$rBzhm*NbC7UL-Fk7kPVO4Q2`-S}bnq z*I887+Cb8|>a_RB^hizvDgApjP~jvu>@QU4WFM6oU=l`=+L_;O?YdAvx#*3S zOG=}+N_^}|etq6>NnZuQxO<5NzDpA`AOEC-G*++pIO!(3-6bW1UDGu2wf z6F@pGt2df*2R{5na;*?BQH>6=ES7k&p(P0V%PNo$h;}PwiY8Nk^ZEj;|CbJyf2TpvMD!)(`CSXd?p}Y8Dh0?0i%txK^LkQw0j-ctFg8fyLd1X12Z7{+GG(9F zr3?{b#n{9gXkr;qgns*B+8;I{UL7*Mx`Z`mtW0#JYRoa4Jp%0&-v$#!*oQV!>s(bk zk6s@HT%YVr$piYa%_s@FOdv{7B*}}JoG+a!uGwHud;v07Fh&TXYoPal@;XDz12)@3 zCk>O4gA*dA!U<;2T>uIZaYH~$CIdbx2J=wvHZ0gl@=XOOX}+SP^P&C#W*HzcH3`E2}-|z3ZYC2N3BYr__qVWCkX9L z4OKk7rLZ$lF*82i92LeWCqf&BjRqJ#{Mun$Ttpwgd7t^j*Qa*qs`W=+ukQtV64yAS zohBt$Y4_vGnwaYiYb)VI=^4Dt#XzyjH+(kOj2^8vU2=R}Akh5TlxH@0Yy=~i2ilVp z{zWktnZ4if*YKx7tU2PX8Q_l z5#dL(7tj>igvQ@LVWjH4+;}~6CPCCVa54IY>Lu*r4rZ@!*Qrut3V1~6#AXD4l(BVm zxcdND>S6U<8Z?z^Q>?@Xj1~1?zP!Pf3=D;hb)MEM0cPVz6R#%U-c9ob+D&*KtQC0# z;t6;1nSKKG9E0|GbB#K$Lq77hwlStuhAGi;GK zWT1s9HYpKB70~{%1jl}mX-WZYW4+;qh#^}`ZI;-Uj>Bo^pwaE?+froSC0ZJ zN_GrB=}VfOuffh#x`~L1>py`)z$SCTk$x$&YOPdRB;f4QW=x;#;#y6)Q1oLzQd5Zw zi4c7bZ@c*7KxhjhDId4>4Y2gl!nh^u*J72oKi0nxg&g46&HAiF)=+7{w)1{y#?G(3 zOO?nV<3I~T_UkA^Y9G+8#T$wVa8By&PcpCXVc#5Dzj55VkCEgp=~eOQs-y4ps3HXn zHTP%ZpwI550gYIak8JF**qoDAP7CJ{W!vt2&63E2=h)D1KMxJ;)lg-qSCGg9-F4yw zn&bd%(#*6)AJ*r}Y20t&xOkb@Sos3oj%MVvD zC7KBD;Xn#oG+=+h>Lh zVCB#~6Ra8vM>3Kqpe{nNow&tQk#vg+e<%LQW8OXKfEat+Gqea@WHg~foGk(b=X6@^);^ciu*;q}hVPt1fe2E`s0d(mQxGRz~_^s{3gW8WN05RU`GFnDOIx>P22q=`IL_vZ6%=%v=~QEo6g*I$>Z!H zk8)T%C%VxD`oFoeU_d{`Ks;ehKPXsqoXX5E(Vspsi%RP*6Cv?*xO?id?&Wt!N|4-a{Z{Saqw@##5}`#Sa2pgGxO&sDldI!COsD_$0FAfJ0%6xI??t1+ z%w7!2{Q*ACenI;pX@Ec~A11TG_)6FHb8Q-z)*;1t^5l;69Qh3EoL4dGs&=4s-N6Sk zijFp%vd!Qv5GqA}W$Vb3al3syLE6yZYby)4h-PA~nU<`gwy1%M{()70LH@7rfNb5< z%|??xy2x+DJ663z_89yp-jxSm=fH5Csa}X+>M8vaOh8T3{jiI8)^r2CCOW&@@ahZiyswl+;0t~~_yfq1D=}2a<)jcdMOvqM)+S0h(j%oV< zi>1U&lS@@gZr$!2^lvg)vjS=rK4+8yrSL+UJo zHGEcpJ+?QD1;{{6I2k-vYUNA;$hOz<=lU13DZ0yJc^mUD0f4MS#nHJkP3UzRQjhK_ zOczMCR(P`Zjg@Ar@hC|WhZ7y(R}KErJX2*PgUf9GytmA(ouBmp$3$emewgP@L;JHD zH{lTH(ZGj6jx^+2sZ-&w)2c^j#i?Yle*6l4-aP8&>tFqsS+^uPiYz_vKC$&w$v6P_ ztx;td+EoHb4}E{I&U{#KUN+vbZjipUO!mEzXuf#4LWD*IZ`q`s_4|X8FbNm1m?P|Z zL2816Y9^ID+|+SF2#QdRMn)?I8||+ON?I2fN}K@ z%a#knn|_y!F%sEOe2%!BR9SxT_h0aK8k&;@xB+(_c~N` z6v);Dv1sfYxE;UM`!)h3gN;&Zn)-&MD<=T3U9{|F!Kk$H4zeI8KSh}ji$R;xRh91~ z_yK1LVn4E3N>Z|?a4z&(fJpQ9sZ26+C|&Edt)?H~Cak+hAIiHUIOieWW`zwVc@^`N>>phOnDOCiv#bdgq4 zQgUeAa&9hBH+cFh1q|te?8cwNIinYNS|pj#y!WY^B~eEr(B*?_;bcu zfBc=7n-M&{h}`}jI|gDSKS{uZAhCB4P33dq$NY$VS$q$K_^|J|Neg>m8 zob!frMR8NdHrS@a(X@}`*soiiiz1hBU1Ss;jmLO9f>;hHblWYe2ASKZ7uvz6swI*$ z^X;j=KS3U^@!py)j7H^48xT??e!)iemXHsxdG2%L?7Ly7K|DWNxzP zS`PQv)syClFx0s`<75o|@r_8<3f^Ux{-i)2JDuyq({Zlc6uyG{v=$O+Y?D`X(DC4c z7#233VvHyOiUj?>ygcjeDVjZf5*_Mm5!I|P;g~%@>S0-04OzFbfyR`iI?hn3vXBm~ zOd45WnG!1JdZT^!dW0QU7Kp`>dGxpeK?Z|NnncrY4 z2a6;f9s#4VY!|X$9PQ^PQWCrew;*gwkkqD|3{n{=bMm56Du2^V;84_MgnGl|Zt6#T z&!-7<1l6*_o7w%`+6f43QIhV4(7Kl&*jx@N3Oy<5@tM(IUcRBpIp-vb@%45|)zIr1 z(NY}y9^$}bj1l{EKq__B>#A|vA1?^ezS&mZPq7=?Lf?hRTEMo`ZF3>hJC7-Ai2G_c zC(Q=`IQOUb{imW|g;Jr2FQmH1FQsCWo*S#hOFntZvHQkpC7ANGL@v)^m2ptsWO?L+ zhl%3C&yeIvQ)q*QrxatU$;qCTS7ZL`q=tOjLcM6-=Vks_>68lu2*+uG$OL9dzkq6H z^vQ_fK*F*mNPP&tK{Xj~Z1p>%!yamouD;yOY{ho_m;+9!3t2|t@$$zxHPlleChZ7Z zL8+L-Di6C^MSwE4!8b4ODgNDJq_zUIn{#|z(oud~za1f>@S9u$hrX4ne68WnSI5EL z_7&j|mBm@yu1i4`gW zCng#qMLKF9s*%j+muIv+?BDG?|M@3w$DRPuvypKYraiT+hRNxxZROS^Np)Dz?dr{# z)p|VFB$@%v;TkxH)jhssFW}L7@Zl`T(2^#9jX4FYsa|W!B&)}&zt5g)u6iY(9V7rH zS@Td8C#A`bvSvCPDd4+N$5LYgvO#B$5BQ$Lzx5G5iLWEjY5Ki!l;#4@^I8KKak1m* zYTjF)sbYJolO*jHo;~HdyAzZN;+4l_Jzw&T_A)ur?GrwgUAcJ7+;3icb+K}N11$vF^juxW(Gbk zqsAU3xk|qnFnTO)CjU{~F*at??kl>;@nuV*P@>v>6$u-^ylQ{yLL+A>?T&_WM?X3P z+~)jTWq#;P*Q`aYW`Y9Rf^{bf^2()j`H9e5#N&8g(kqFIhN<6se11Bj%@wSHuct{f zI@lC+nqN?q9=0Ml8^qhhyR|!AC9h71dN*bL%UWDzTgU(doI5iSzmE7kW5DeG&A{~6 zf{E1C=Zz^dA#g1AKm^GpNt5J|fw8n$y|07tTda)P&bR(AF%4;UXs?7aN# zZ*-Mucf}*7fhp#0q7gLs#@$MZ_HdfZw4*h8uW6I}IU^9_Ha{fHxrDcRMHnLr0m4}( zk48oqndIcr$zO`SjFQboNr43H0^&%_NU3Z;1C#9b%2)C`XK5ft(P4^~DkNLi1jMe= zE85r1DtIC|t9v%kJ(l3E@|WTyYT#U4wwT##a7@0DaAm$#jLVh#|+oSnoC-g5lHh@q@n zn}&pyXwWAiCQXIGk4u-C67r^mfUo?A=Vh9jC511uXMsWi$5u{sl$?3X+awa|NX8nF za;To#4PiyKLHvraJ+HlTmEX1V`;Eu3FU@8!EmV?@-)!kFhqFQ!0<7tpgZmMe+T#GY;oC%!Tdmobmr#>Ic@3xg2pVCy0ZP_$3#V}R| zrKim7@){4^KolUN{uivNa*_5~Ai?)%DV03y3g*u!Lx7x49dALACkdcEIWQXL!!HbK zEdr$F5IA`zk|aYKP9Rh)oy;*04uejlQ0L6@HQ?J7bxe}!j}b})QK_ULWA)x6o^zjM zz)Id;N*>Y0^CjQ~gu{*voo1k%9EVITjF5+Wnu~)o9((dt0>}nVqY!Yi?%9_!hJL=f z81~v+;YCMNKR`6BF^62z! zwEO&cMgO1%${*s-;n96^+@ zz4b8Eii~tvoK`jKz#0S*@c?4He{Uq!Tk`E#K_#=MZMyN}KSvZR z@XE8fG6VH(DaVg8tEFoqPuVw#fMRn5WHxHD0|BUS{9vpcQ};5&ny6|$zl`HB)Px=S z&GNN0Q_bOS*YD4~&aj%l)i=`09bK?D$n5KP^R3%8tiDW&@D|oEY4&ptl)AZJdO`tl z^t~N@GQ|h|sj$bdIdM2hKc#^1Ja|$eyqN1X^;@CFC^H{753g|r*HDB>!f7>Sd9!@~MIVS^$>dw; z8O}`v?%i{h&q@2)=vuZ?{_dyKM$zb|N#vQsSG2Wrl?4$B!we4egOzoc+r`ndbXrZU zFMRSYP4OA4RdwT9$}K9ouy3?*R9HqCB`!d0vJNTqIlpu>7B_q4Ocq=8)2m@0kcGKl1q3Uq^fejzwHK73qRgS9(NlfE zggdA^OejVV78cEC6w&XEh3y@d?Rij9wg{Ua`&u_m^QMG5U!g_3A@F)sB(!5TtsO_B z`d*ftwrvro*dTRmUwa1@7UHfobemY@;>?6BUSQ65FBD4)zX)27_nxdl z#Q8DVaiV6&7qTtEbWq+!SXZsmNgcwl%F|{>e0mbEIdhU!iT1z4a7G}8ZO^=yoxOtQ zeGh?1mL49^Z@adazQ#XMvqlGgUxa9~{jq(eir|%$!YMcQ!PT&YoQ~j*1TP*Ez${IG z`WKhtg!<*(Xdx5BiuU88WFVD9%1iZ%uMD9$x~PjeUBlu!$h!iMiq> z3PB>x zc{fo6G2E8+SUW%UNUtvXo?QQnr-7=2D|(&9NGzy6CeS=Ag__CEVHOy`{B=Uz&NQVV zAE9JH2I7HFLLrQ<(55@H^5#jAcO0fTIpVd1QzVU`kZ;JRDg61l92zR=A^n>}S5qCW z4zz**UKomHpZp79F^_6go=;6QC$3(Z6%0w4zLDy^hYz{nrg1AnU$`E0o9w2SH{$5;@hg$ za)cxe2Uec)L>gzWg|g2)Ppi_ga?DVo_G)I!h-g0>M-GfYY`#_+94_kVJO%6d{2MXi z{$5Yo1q?C5*5k~+@k!e)>$4y+SPg)$d%Q~^kL?JQk|7-11=&%p{vgS<{?Sk-;Y}uy zGy?n!v~yPl!;)|;nz;2Nt&RKhA{Kk~axuaXB*d>I1EDMno7glevXFH(dJ7OII38^b z(6YVD^WpS9{_R zP|YE4BseMJ74HCcA=Uiqb|r*9FNHQOM_U%sKLKdr6OzRE7eMlUmrN_b5d^*gqguR|MpXQ;nb!^KxKEYQc zW+XTZAp%RHH+Jg-`m?*B;Ee_0#e)}}Abe*isR*C+c(mZ{-aXu;JPOm-S$?F!0yAk> zfQHv09#Bx?vDxaAR9>XMf(rW@$gKl^%;(fcmG3uU51@h>$#1mR8wla96M&wsO=&u% za{P!8h@x#n1;Rp~@{I!4jQzg9?S8rH2+}A{Am?5OX#3KohgWb~&;9Y3Ok<+!UL-j_ z4NVN#z?v*$JRA})+5j={PL4a5yi_Tygq}L7-bo~j;v;+-uX|GR`vS@VpVXCRI-B23 zI+`#veOiui@AnC(_bDqY%L<)Zj7VzFnfHB*s4vRfpnRU4Xa9Cf?}5@T@+^7W4i29* z)~Vjn8XsMMblnXvwu+ieDPtkOf z{h!3@r__f0`SwxO&n5U$K18F9JQ@X@u}ZS)p^~nbTlvvjUNeVZkp*T@egPV14+hlc zrH>4eAaORs1wdSIgc60>@D?y&?_MOH0^rp`N&5r@%G?R$S(>)J$5Y~I*0XDTf@X~((!Rt?QK=6==RwkdxHEA5^M~DpsMv_S z8Oh#pkVI~ehGZ_c8YqQJ(qti19@BR?U*2yBr&YgLkoJkWBpX!dseuMmb;{v`#RCT> zqDLLwUnlUoJ`{|(XnVxH1o8MH*{EiUtH>r#AhpT~2!o@j zq8hA{OmbrL6mLP&O2Si4w0{)}oT>q+>T#q00c$A8acDK5^^Tlysi?}6?Z2U#%e4tJ zXxVWBDj?*fKc1D1ADbVOmsC|ja}OsKw2+(y0-h8?M1NHy`tbQa#B!eo(F@AuT&3%2 zyf}5D1I#aFwkloP&%Rz9E2zHqM}s4N{M$^zT+_B7(PU#zpcu}M0e0sFvqiQe`s=toPXOiG7{P@52Y zNTF)LfH3xta)=IYZ?5(fBfrIRhktL9E~o|?$PpJt*@CG3OtZ<^h5=scWP;t;wCXEO z=)kOQ2<_`MH!mRY#;`EIEhntfr zCtyuI=pI09Fb_~8>(r$eNv}Usu}&3;RvmA>cZUS`0RI>#iM16TguR%pbR)Fp38e94 z5G=ey)hDZs zK3>FeBf|6sC&~8K!v@FfmJl9c%!!d}cbce_Qe|6NM$P?0&4S~W(lklIJY!6>V4g8~mf5sU zOr+!f{fiD$xi#%oKS=sN-p+q;ex+MoB0qCub~7#DC6zrFXA)96VJo#0v$6l^K{2M1 z9z3(Cdl=UAkD6u^+ z;7&qE#+^ExpLUGZ^G838d!0cgU$K?a;_Y?jv%mVBBP?hvi2vSiv{OWpA*3e&JvMm) zZy~s}IypHpa1s)Wy*=K;Ski@L@8G~m$ZWG-eAEdpFK-*-@jedz@EW=#&3@O4Ho=Z$ zD$xicyv<_Jl{D%0vpM<8IQy~@U3?l&WhKF6-Fh!=YkxbQPb>epdPVe+JPNywG8IGK z>?-C3=hdPK6gdzNFxIa3Bz=blx zPKR@{HpfefstYnF%BbmPs?bJ&9k2HrM&9!&LNcbD3&y0x)~E$aQj~a!&&V)*0B9Pq zMTlF#V>X$oDsL2$05Vn`Fa3x|v=GJ#$LSxJep!5$W~T8(uE}P%-p&rar{Yaoo<-NC zGX3}1AmjHd6e7xLR)?`!j9Gs_MFAcrLdJ2qnLRHjg1=TXYsuksG{}PUBl(REKVJ$W zY&l9~*2&4tU6UVOrfV%mIr``J!mm3;*!VN{kP3JTw4LR>Nl($^xq4PLSW~JpH8zPQ4piNr@S=SjjVO>oi&Q{Z!1FBW zBtB>HS>8Hvz^k;td|v!t(nQ@Ib;mSYY703|VrQ?-K<*?d(9=L+MlhrtFBko9j~Q^tV>7h_;ze= z`XEd{UUkgppvL$+%LKxvIc#%z!%-|4tj4IP-#^cs@urp=#O8oh0wZ=&Lj)u zR*`;aJdgJz$ERl8(im%eU1=)Fh~->%k)9nzsp>xXD)iOw=m0GE_c@jIYvb5Y6_6Bl zBjGHKWbMA*Ae;}CH+uV;7D1qH4G|#B<_*`yRdnNR9I-p&C?y=sE*aiuR#B9qOlD$4 z8y$7_)LY7#VvA8jiWQ0+2uqsOE=?DVcJys1RX-oBFEUt3R84p`u%}erExaqegN}}3 zp7g#X9yvu=sje7znjv`n8_Ds46L(!^m+s=`u)yV7T^74vLmxKlil~OUo%G1CL7V5; ziAA>`wPBAL{|7gNJ}ry$o{!~H-;CrFU*02hm0$Y|zil2cKl7{f12(|XK!=}4Ap2~F z31{*2eO*naK~MM_x_R--SQgrjR~{1V%3YK3Y1cuqWyxOjb^XiOEzs+AqEd^G_?nhJ zV#ZwAhuE_`i0+~_gRA+OifFQnh_qWAI{eZd6sNR|#O@B-_#TI=s5mmdqzFo|pGtX9 ze#Q*Ahaiqwmv47$rpJD8U2=2i;eT_;MK{pgb352{*Q<<)3PlpgFhKhLOgdO@kRoHt zh3Hf5uDV#~Cp2SzoonjJXIn~{VpCBqim@j`f>0Fcw}ckAZ-pB6;vL5=A69wrH@mJ%N7xIv)I=?TRw5k+WY9^$e%&;kL}m$V2-d4o5&Rrgwp5ZJ>3po&rKS?5065b z(Sok#w1^aqh(nn{EObdgq3j&#qS)%E=2`Lp91JV7Z=QO?3D>mA>ozq~me0rG2Vuk1 zA9<%A|Zhn^;a=OEoscrJH86Yg_6)V{Dc}+~k_NDm!a= z!Hiz;qeApqYp&h!Od^Ax5jV9^!9hMMk1bUsMtTA@va_T* zC=ka-zziQ#pq+)TY4!#kFT4;FBb8;vIc**_Hn|WrBZZ&YI+z@i<7t_=(OF&7lsNms z?GQ&>?bdqp_7(%0JG&`l+@9BRcI()zFV!e>P`zLUyM!kTwQAAmUFv(mV`<`uKNOzF zbCajOW`tSBOMQ>jp)D)NmIvH=w?gS3MC9k^?T_xBjH$7IudtuyvTXAXZix)%J_~R& zYvp z@dUqwA6_Ec{pLm*8%qRIh-B|b*E%T1DbZAz%)drFQijmb)lS$rG?X5;hg*^CQTy_w z<>}4aMW(s0hkVPIjeC7Tjx6+WNUI05tD}c=Zai6Z&1cLk7N43A`t8PxvPkDX96TOVV|MNj7rr}0PCaY>KtGyi`eV#MbDyOq zdrZg8VzSaAPY10a&im5uGJr)Lb?-vG^x)h%E$s5q60&Avi@CNXvurb@uF5fa+Uv&% zr($#iZ$>71pgHz7_Rq_dxxG&8h-;mBPl`AW$Y*Vez^j*hDPuc0NyGwLAs9jVb_^J$Gz@?j z^e^vm&nF5Yhes?hieODjTP;^vtaiJ0LR?T@$b9RelcWNvlz+ppd-kj5wJhim&xc48 z1d%`#H@yXnv(-CK3}RY8{<=~`QC@jMS#89@9}vB9qYg-ue|4C@$4na9UG} zicA%1pNxwl9JyI}il${lz{H(w%!2LcEc@AYDJ_PJ*!M5M)*N_R_hw7(J;_9~M21i5 zD0I^H0Dd0*B=!w$`LcfFNm<#)2JW{`C|10C?O(Vp&V`i*&SG8j=ZPwek>N#Aqxv^z-$M9s<59G5`&gUO$I}Ls3^YBX6Cf)9eEGHC|Y-^A| zq{Ol!*vhm`GTVh%IJHcz(@6`baGhS`?T>COy!!4BWg$V2$Dui2DdoA+T^?afC+_ZU zWGSwvU&9I>d~B07sCHmh$pL$$xJY^bC(5bS(}20VVH;Jx&V zZTGWtWV<}g|42_g-r%l;yUyu3~@|pb(PxsBblt?Dn8mr_L)Qb zLY0E+bJ{rMaoOA{XE~#A_vw1T(nZ61c9qs$8jTY1PsC0no6^SYD4vY?)huJ)&_tWr zYpQ8IE;lHzPh7Ndl9M1ZFY?u+ghhjeG3FY(Uv*~=b;zkZ-|KSm#8-(T#4~otE$T*T z%rbJBiN#;KefwcG&3Rr`Duen-8r`244{b9kTM9wtekn!xr6l#**NmKK8h54tdVGZR z2P=t|cFs9}c{V0^DGnP$l8mi~swKgBw#|hrxcpB3GMn5*neQKke;QM#dwsYBDu;7( z!Yjt5kPY=RA4WuYDum;*oz$tuMRE9~q}PWZ{y1W&DpMu4FK<8QNMo6k)&V!X+8}`w zXETh2EgdH{gKx@ zs~Hn5Q^DNRF8PCndb2ihH`QD8vVIH8oxIYiiRH;RyeF>Mu}ZP-Xs;wP`s>TW=xW;p ztEP5QZi_YFl;U~Zt}!6*I_Z(JGNMr;8i5s-4~t?g5sleTVtX=n#K(*uH`>6 z7I4FO({7$gEA*!OR@HS#IEs6FZp_Wf4w_dtB#q}6FcHC(vVDs^>kni_G zs1ct)G8|`KwvrT5<~SI%T3LE!)x?R>KO=i**>+xLhZK*UG(p?p)db=g?~)J-(P_T ze#}1yHFryREINm}I=0lJ^rqAWHzF~PyQtK7MCH#z|Nd&Qy39SeExs}Tv15`g(Xr^6 zF-XE~#d^|E#KR3+3GJ!>>p7b6V_tMDGSI*rJTV?!d12o#p%>6~lMJoemyo3$k`EH6vG^jq0kh)L{ozEiKQJ5 zUZ1IiJRjlMo1 zOSr9fV9=k7_}WSxX+<-}!<6vDyeOxUDy1dO7`~ z=~TIkqKlD3z6O#XSg5s8_3K>f6&?{-b$$vp17Wc4(8fd3Kj9S{kipsK2IBWc#kFqrM5v3}N zQaJZ3E{M2zzG4z zxcF@N(SO(iB4qd(DmyH@U_EwIl&bdiq^QExfOUbv-25IMUGBCf+~_=8-wTIz83j8X z(9r**`QuGVx}($gVfW7$%(|;A<|Q3XW4uefuo@s_vJx|+lr!;g`3;W_Y z`gjA?jQj2X`trY|d3PEDcbe!Sb(7v_J8i9o%c|>YQ<5T~tk9XC|9(JlKymp$_{}S} z?z&FVH~hyBc*Bqs8aw&JlKCh8yeTgfZG^sIIEjAebR#)$UE$gPdY}K}p8fy7{1aFF z4^!}8hW)?H;s1AgX2F}0jWQ#O`Oh^ip!JcN{8Hzos`}1MMT;v0SC?h>%T<8HE^Brg zOL==Ua}C4f4&8+(S}$Ka3E&s>gXhB(KIlg&}@qZtyj75ZnsRN8x|F!B+ z@{9w>-IPZ5mN0Y8>p3o>HanybXnwGZ;yVGgz+<#Sgw;4^N+*r~)4q>9L{PyjMIm62`u&1` zJEwmy^(G;lAmsLN)%2gQye;y9ym2C6-Q8A604@- zqD>83t+R5nqEe~2vPrG#GGqSkzT%|M?mzx>-20w3zuCP=l7F_L=X2YP(yz0D>f7(S zM_vi7CZ72hV(Vr}{kMbHrHpVlC*P>HgcMG&hgdl@snpuW65z2f7S>E{fNulEazHbN4>@YwF*++07q$4K6Z! zjce>J&Nrpt8^3VBdb&N-l!QN#MmZRtFwC58b?bNGmAKPlQWHXcSviT!@De>IoiIlk zmy@y1^KL)HKE?Dlp#C{9bn5F}al&$`SN(mTL?t`sd)K`f(#^_F&Tb8ED=+kqkO!UK z(Hp2X-F5B9PuNj8@{IlSG5l&&koN*!Z9KrCdxei zm1|*d&1Zc}jI6ASv2%Sh))x~5JQ~_F*6$q$2pbd#8{!YnkjqpJmr>*yifND}Z(G*F z)T%5(V{Bs-s4zpBIVP?(kKUg_-E7J(c#m`)lTv>gNJ4&g52PcFUDyA7rL)(#Ug6P& z(cx~QgXBIjqw45GFEM;>w!X}9FuZjWG^-||q|}6`r?qud)>Sph)g0?~7t+k5%7vp% zANJSx^a((Jb-JV4`TA?Qo5v@zmp@Wkot>M;dDZG$g$9=&B<)qIW z6|YV7Ds1G(wK=(K=*)fk=n>^X^%r4Rf5!$P_D%$39)q$-^`ikM6kEF^YlTUbkaS}@ z^b-1-Fircwi=ZXlU^SWKyDs;H3&(X=>7*Lxl8dzU?1BD0m4=qJ`hJa*INEn!3mW|6 zhU*K*P4tZM5hr%(#@#~eX`^V!JM7aMN43!-ZY1VTUt}J|x;53$V9z?l5n(Tw4sJ&) z{R~~#Lck&n{$_fldxV;NV7~9q$+gozc*bItGqGCFSm`l`_y6)8vTuE?6{N9AM;V2V z2-iKo4#Ojx*-MzO(h|QsTstDfGJ>2xSiij%pxS^&^@VRt(MEER26>srW@`q?ECRiwJC^|v6`fE z-{Oy;F$^6!N~MM8&xRtYX=hC7i7UUx3}#3>oS7fYM+=ggYw+AJ?_ly zTUpi2l!|9j_-8+d|;{3Il&r-sWhb}(U8|@wWiwHs@9_svK$o{cC-T?0TktE%9 zHq&?CN!Qm3xBqGY@r%VOibq8tz8csyQ`j! zGIo@tOe9T&ISMRVp48fAZBfN-U>_X~bSHKz?W=ZQV2KDyWb@K zd+tK|#aGeTH{(4vAA+0c4-XB4q2la-Q2=9E@gmWso5 z#7J>G8cJv;PH1&ZEtMmN<&@=^U{abxib_u8kd$IsNooj~#~|$pr8y)OQ7RX2S?8>C z|J@&Vt-J32wbx$j+xuPbe!u5^p7(pdy+5bFKtu~yJ-1e4AM(Df`+`W%c^JRLH1zBr zWX$?(_v9_VOic5uWrM31o>G0HYH*=s->oh8^PH6bfQqmhr7)-#v5%XJfZ z^8kkFtrXa1rCgJ~&N*m!bI@>Wc1HBmQh1QR?eDx!2O@0?YrD$87#s~}<6iGn+k)A> z(cvM3K{eJqp+S_X2{lkl0Z*L@Fpln!&)qsQ{^Yg{$_XOURns`PHb}`DHVU?N`k?j-8u&L z?j}M^0~zO=L(c7vAgk(IronBVJCrD*8D=nEZcL$NIONg1-gkMKlp#O(h0~rvu)e+Q zvqt$OytP@?X0b}GL{(*=?pRYP^%tpn3K&5Is{ z4M2_>awQO6(K5}6+i}ma(Hx>WA@h}sppmOaKf4n>l2FNdb6$Gu(C@EOp>^-XU8Ut{ zjgf1{>`T5E{l^Gw(V=@I#5vW5e@xl7>kCK*Fzw656CXF9K^&W|v9!#Gl7;0V1(SpW z$*;#J5q*JdGPn5wf;)9K1`-Szj*k@H;NM7KYE2e~(F6BXzxS(UeL<2nmUfCQd4zDu z3fqA&@e90Vyd3E*I?{KfNg0NME9nr#PWN3aoZ9t*)fvisK%G%cM0{czXuie_J|3!A ze7Llm?PN2PY1LM0wpEipnhksx4ZyMylR*g_gkTY^p@>$3awDf}+(zjFj{L63R*9?T z=uoNUTldzt!Cd#HC3{Xlok$+88S(!_p0o zgLkkpdF11QzR07A3L#~O-N)J^j;~bssqCcE-fn%sbF^e1 zO6$|m4^?6nA@+b#aE@VDCy+S{Bp)l~O6(y8@+;wA=bn{B0a)^Zv>miuu5mS6rIdPP zZ5ng8T4D&gho9whY$W*p8No?L^F? zU`OsEEvl-RZVan42qHX<@yfN+SfRyfv@}ORzp~_`* z&RR^4?{PKq^xA3gvrbLGSjhb>-vHA&BaLmMfGD^HZ^_#0kN#Yw{+7oww^K$i)o@Sg zzQe{qOA9qTIQuoWcfkUz1r6{G-{RY;&4-XIHKaV`&iUjxYyX9lr2U>A5pmi*-c^S) zvxNdACFaPp$FX=eA+B@o{N#PrmYe8$8Aqf;1lKi{ zMaY{l;&y0Yn`S9ms&Ib`OOp4@j5?faz?Gbu$*OXFB2Y3({cHQd5@G`-GBz6-l2I<{ z)llwE=iX;3VC3{(052f1NQ~m=^dk3(1YL*9QqlRW1@oSnI;K3Ofnj7q+Ezpg96cv> zbs9^MVS5HGvcM92oWaN&@l78ut>K_E4U|jj1D~?R`$F<|<*+wxgxRqP zdA236x9ng%mXIzw-C8M~_L8D@9QfI}>IK zvsGRJL!BFL_h@l`JAZ>8DJzyrH^NW#wly5jD)VdZKH3b4b`R0(M3WXlRj_;ALgfAwh{|G_If>^@PH31eaL=u2~GHY2eyQMaFAxHX6{p1=Pu@E~L4-#(XD{b9W$mwD?6T_tv1qWaR6KLq#raS5ppE1>< z;}*gezVxn&b#O0dFLkGnC?Tx(!*rEj9YHdHNGS2G7JMO51#X7=bKgMwI}KeSXPZxij{>P(b!7iS+beA*ZhF#E?f-@&ROgFfwGP)K1twlc`{@*AiEt8yO mkpI68f0MKSQ!bGPq-3?UK9i7~uamt(dN|n~v8}Z^hWjTg`AY@> diff --git a/docs/petr4spec/figs/switcharch.png b/docs/petr4spec/figs/switcharch.png deleted file mode 100644 index c3de121ea4103d9b8ed27bad938128689ee69f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48395 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

    J4ExuRC=hwTP5;L4 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 Q0RcZUuM{LpB=kT0AJU=qo&W#< diff --git a/docs/petr4spec/figs/vssarch.png b/docs/petr4spec/figs/vssarch.png deleted file mode 100644 index 2ce0622e2951fe3b82e6e748cc519429a29483d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231408 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%0AiVJ`pDt*5(AX9&=7`!ER=~m=JWw{`IQ(? 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
    gy5&5Sq&X}*j4yzEm9_OOk-Tb4HJcJeq4_NmLf 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ğ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 From 711c0e1a1b850966b35ee2fd80c2b922ac93247c Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 21 Jun 2022 13:00:29 -0400 Subject: [PATCH 08/30] fixed in-line math --- docs/petr4spec/Makefile | 4 +- docs/petr4spec/Petr4-spec.mdk | 470 ++++++++++++++++++++++------------ docs/petr4spec/make.bat | 2 +- docs/petr4spec/ops.tex | 33 ++- lib/checker.ml | 22 +- 5 files changed, 363 insertions(+), 168 deletions(-) diff --git a/docs/petr4spec/Makefile b/docs/petr4spec/Makefile index 62c04f908..af5cf6272 100644 --- a/docs/petr4spec/Makefile +++ b/docs/petr4spec/Makefile @@ -4,12 +4,12 @@ SPEC=Petr4-spec all: build/${SPEC}.pdf build/${SPEC}.pdf: ${SPEC}.mdk - madoko --pdf -vv --png --odir=build $< + madoko --pdf -vv --odir=build $< build/${SPEC}.pdf: grammar.mdk p4.json html: ${SPEC}.mdk grammar.mdk p4.json - madoko -vv --png --odir=build $< + madoko -vv --odir=build $< clean: ${RM} -rf build diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index be7a91645..239abbc7d 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -5,6 +5,8 @@ Affiliation : Cornell University Heading depth : 5 Math Mode : static +Pdf Latex : xelatex +Math Latex Full : pdflatex Document Class : [11pt]article @@ -160,7 +162,9 @@ with its implementation. The target audience of this document includes developers and debuggers who work on P4 implementations such as Petr4 and P4C. In essence, this document may be of interest to programmers who are interested in understanding -the implementation of Petr4 deeply. +the implementation of Petr4 deeply. Additionally, it points out +the discrepencies of Petr4's type system with P4 spec and Petr4's +limitations. ~ End Abstract ~ MathDefs @@ -171,10 +175,6 @@ the implementation of Petr4 deeply. # Overview { #sec-overview } -test $a \leq b$. - -test2 $ \var$. - This document defines the type system of Petr4. The type system conducts three tasks simultaneously: @@ -192,6 +192,7 @@ The following locates each data type in the implementation - The type of programs of the surface syntax is _types.type.t_ - The first IR is _prog.program_ - The type of the first IR is _prog.type.t_ +- The type system is implemented in _checker.ml_ file. For simplicity, we have removed the information that is needed to report when an error happens. Such information is passed around in the surface syntax as a field (called @@ -215,30 +216,136 @@ program is evaluated. # Type System -some general explanation of the type system and the judgments. - -## Expression's Typing Rules -translate typ translate a surface type to the IR's type. we don't present these types -since their difference isn't much. -saturate typ saturates a type. Eliminate all type references in typ and replace them with the type they refer to. The result of saturation will contain no TypeName constructors anywhere. It may contain TypeName constructors. -e(name) looks up name in the environment and returns its type and direction. -is array determines whether a type is an array type. -is numberic determines whether a type is numeric. -compile time evaluation evaluates the expression expr at compile time. -explicit cast ok checks whether typ1 can be converted to typ2 under e based on P4's specification of 8.9.1. Explicit casts. -reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match.. -fieldOrMethodTyp checks if the type is -1) header, headerunion, or struct. if so checks the name of each field with the name of exprmem and if they're the same returns the field's type. if no field matches (passes to type_expression_member_builtin) takes the type, name, context. if type is an array and name is either size or lastindex it returns the type Bit<32>. if type is an array and name is next or last and context is parser state it returns the initial type passed in. ow. error. -2) if type is specialized with base as an extern, checks the env for the extern name, if it exists, finds the extern method with the name same as expmem name and returns a reduced type of function with that method type. if it doesn't find a method with the same name as expmem uses type_expression_member_builtin. -3) if type is an extern, converts it to specialized with base as extern and empty args. -4) any other type uses type_epxression_member_builtin. -arg can be exp, key value, or missing. - -I couldn't find the followings in section 8 of p4 spec: -array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). +A P4 program is mainly a list of declarations. A declaration could be declaring a +parser or control plane, instantiating an object, calling a (extern) function or method, +and defining a type or an object. Each declaration may contain multiple statements and +expressions within it. Thus, Petr4's type system contains multiple typing judgments for +three main categories: +[expressions][#sec-exp-typing], +[statements][#sec-stmt-typing], +and [declarations][#sec-decl-typing]. +In addition, types themselves have judgments for checking their [well-formness][#sec-type-well-formed] and [equality][#sec-type-eq]. +Each typing judgment may use auxiliary judgment and helper functions. The auxiliary +judgments are included in this document while the helper functions are just explained +in plain English. + +**PL Note:** +A _type system_ is made up of typing _judgments_ +and each typing judgment contains multiple +_typing rules_. A typing rule, in essence, is an _inference rule_. +An inference rule contains zero or more _propositions_ above the line +and one _conclusion_ below the line +with the name of the rule on top or next to the line. +For example, the rule $RuleName$ below reads as +$C$ is concluded if propositions $A$ and $B$ hold. ~ Center {padding:1ex} ~~ Snippet +\begin{mathpar} + + \inferrule[RuleName] + {A \\ B} + {C} + +\end{mathpar} +~~ +~ + +## Expression's Typing Rules { #sec-exp-typing } + +The judgment $\expenv {\exp} {\prim \exp} \typ \dir $ states that expression $\exp$ +written in surface syntax translates to expression $\prim \exp$ in the IR syntax with +the type $\typ$ and direction $\dir$ under enviornment $\env$. For now, we do not +present the syntax of the surface syntax and IR. Note that there is not much difference +between the two. **TODO** We plan to add the abstract syntax of them in appendix later. + +Note the following notes: + +- We use $\overline x$ to denote a list of $x$. +- For simplicity, we omit mapping a function on a list of elements. Instead, we just apply the function to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. + +There are multiple helper functions used in judgements that are explained below: + +- $\sat \typ$ satuarates a type, that is, it eliminates all type references in type +$\typ$ and replaces them with the type they refer to. Thus, the result of saturation +contains no _TypeName_ constructors that are used to give a name to a new type. +- $\lookupEnv \name$ looks up a variable (indicated with $\name$ which is the variable +name) in the enviornment and it returns its type and direction. When we only need the +type or the direction of the variable we simply ignore the other one. So you could see +formalization such as $\typ = \lookupEnv \name$ which states that we looked up variable +$\name$ from the enviornment and we found out that its type is $\typ$. Similarly, the +formalization $(\typ, \dir) = \lookupEnv \name$ states that we looked up variable +$\name$ in the enviornment $\env$ and it has the type $\typ$ and direction $\dir$. +- $\mathit{is\_X} (\typ)$ checks if the type $\typ$ is of the specific kind of type $X$. +For example, $\isArray \typ$ checks if the type $\typ$ is an array. Or $\isNumeric \typ$ +check is the type $\typ$ is of numeric nature, that is, if it is fixed length signed or +unsigned integer or arbitrary precision integer. +- $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the +compilation. It does so by evaluating the expression $\exp$ at compile time, if that is +possible then we know the value at compile time. Otherwise, if the expression $\exp$ is +a specialized type, extern, package, control, or parser but we cannot evaluate it at +compile time we still consider it known at compile time. +- $\reduce \typ $ saturates the type $\typ$ ... **TODO** (reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match..) +- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. +- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\validatePars \params \env \kind$ validates parameters $\params$ under the enviornment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). +- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). +- Did I miss anything else? + +Additionally, some of the typing rules use auxiliary judgments. The following is a brief +explanatin of auxiliary judgments that are used in expression's typing rules: + +- The [casting auxiliary judgment][#sec-cast] defines rules for implicitly +and/or explicitly casting one type to another. Sepcifically, the judgment +$\castenv \ {\typ_1} {\typ_2}$ states that under enviornment $\env$ +the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. +However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only +done implicitly or explicitly, respectively. +- The [coerce binary operation's arguments auxiliary judgment][#sec-coerce-bin-args] +allows the operands of a binary operation to be casted to another type when applicable. +It has the judgment form +$\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ +which statees that under enviornment $\env$ and context $\ctxt$ +the expression $\exp$ written in the surface syntax has +two operands $\exp_1$ and $\exp_2$ in the IR with types and directions +$\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have +resulted from casting. +- The [binary operation judgment][#sec-bin-op] confirms that an expression using a +binary operation follows the constraints of that binary operation. For example, if +an expression is checking the equality of two subexpression it checks that both +subexpression are of a type that equality is meaningful for it. It has the judgment +form $\binOpEnv \exp \typ \dir $ which states that the expression $\exp$ +written in the IR is well-typed (that is, it follows all the restrictions applied to the +binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. +- The [expression memeber builtin judgment][#sec-exp-mem-builtin] is a helper judgment +for expression member (field access) rule. +It has the form $\fieldAccessEnv \ctxt \exp \typ {\prim \typ}$ +which states that under enviornment $\env$ and context $\ctxt$, the field $\name$ +has the type $\prim \typ$ in the expression $\exp$ of type $\typ$. +Note that $\exp$ has to be an expression +that contains fields, such as a struct or a header. +- The [type well-formedness judgment][#sec-type-well-formed] checks if a type is +well-formed. It has the form $\typWellFormed \typ$ which states that the type $\typ$ +is well-formed under the enviornment $\env$, that is, the type is syntactically correct. +- The [type equality judgment][#sec-type-eq] checks the equality of two types. It has +the form $\typEqEnv {\typ_1} {\typ_2}$ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the enviornment $\env$. +- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1) it checks +if the expression $\exp$ called from the function call is a ...; +2) it checks if the expression $\exp$ either has a function type or an action typ, and if so it returns the type parameteres, parameters, kind, and return type; +and 3) it resolves function overload. +It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function call with arguments $\args$ under enviornment $\env$ and context $\ctxt$ translates to expressio $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\params$, kind $\kind$, and the return type $\typ_\ret$. +- The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function. It has the judgment form $\inferTypParArg {\typ_\ret} {\overline {\typVar : \typ}} {\overline {\param = {\maybe \exp}}} {\overline {\prim \typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}$ which states that the type parameters $\typVars$ have the type $\pprim \typ$ under enviornment $\env$ and context $\ctxt$ with the return type of $\typ_\ret$, the assignment of type parameters $\typVars$ to types $\typs$, the assignment of parameters $\params$ to optional expressions $\maybe \exp$, and constraints $fill\ later$. + +**NOTE**: I couldn't find the followings in section 8 of p4 spec: +array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). + +**TODO** explanation of some of the rules. start with a couple of simple ones (bool and name), then +intermediate (biststringaccess, record, cast) and then complicated (function call, exp mem, instantiation). + + +~ Center {padding:1ex} +~~ Snippet \begin{mathpar} \small @@ -259,7 +366,7 @@ array access, bist string access, type member, anonymous instant (this is probab {\expenv {\bitWidth \bit \width} {\bitWidth \bit \width} {\bitWidthTyp \width} \less} \inferrule[Int] - { } + {} {\expenv {\intWidth \int \width} {\intWidth \int \width} {\intWidthTyp \width} {\less}} \inferrule[Name] @@ -310,7 +417,7 @@ array access, bist string access, type member, anonymous instant (this is probab \inferrule[BinaryOps] {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}} {\prim {\exp_2}} \\ - \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} {\pprim {\exp_1} \oplus \pprim {\exp_2}} \typ \dir } + \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } \end{mathpar} @@ -339,65 +446,14 @@ array access, bist string access, type member, anonymous instant (this is probab {\lookupEnv {\errMem \name} = (\errTyp, \dir) } {\expenv {\errMem \name} {\errMem \name} \errTyp \less } - \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion] + \inferrule[ExpressionMember] { \expenv \exp {\prim \exp} {\typ} \dir \\ - \structTypDef = \reduce \typ \\ + \prim \typ = \reduce \typ \\ % \structTypDef = \prim \typ\\ - \field_{n+1} = \isValid\\ - \exists 1 \leq i \leq n+1; \field_i = \name - } - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\typ_i} {\less} } - - \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-BuiltInMethods] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \structTypDef = \reduce \typ \\ - % = \prim \typ\\ - \field_{n+1} = \isValid\\ - \fieldAccessEnv {\structTypDef} \name {\prim \typ} + \fieldAccessEnv \ctxt {\prim \typ} {\pprim \typ} } - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} {\less} } - - \inferrule[ExpressionMember-Specialized] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ - % names in the following are actually methods. have to see what they contain. - \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - % \prim \env = \insertToEnv \typParams \typs \\ - \exists \name_i \in \names; \name_i = \name \\ - \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim {\typ_i}} \less} - - \inferrule[ExpressionMember-Specialized-BuiltInMethods] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ - % names in the following are actually methods. have to see what they contain. - % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - \fieldAccessEnv {\spcTyp {\externTyp {\prim \name}} {\typs}} \name {\prim \typ}} - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} \less} - - \inferrule[ExpressionMember-Extern] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \externTyp {\prim \name} = \reduce \typ \\ - \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - % \prim \env = \insertToEnv \typParams \typs \\ - \exists \name_i \in \names; \name_i = \name \\ - \pprim {\typ_i} = \reduce {\prim {\typ_i}}} - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim {\typ_i}} \less} - - \inferrule[ExpressionMember-Extern-BuiltInMethods] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \externTyp {\prim \name} = \reduce \typ \\ - % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - \fieldAccessEnv {\spcTyp {\externTyp {\prim \name}} {\ }} \name {\prim \typ}} - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\prim \typ} \less} - - \inferrule[ExpressionMember-Rest] - {\expenv \exp {\prim \exp} {\typ} \dir \\ - \prim \typ = \reduce \typ \\ - \fieldAccessEnv {\prim \typ} \name {\pprim \typ}} { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } - \inferrule[Ternary] {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\ @@ -406,33 +462,32 @@ array access, bist string access, type member, anonymous instant (this is probab \typ_1 \neq \integerTyp} {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } - \inferrule[Ternary(AllowedInP4ButNotePetr4)] - {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\integerTyp} {\dir_2} \\ - \expenv {\exp_3} {\prim {\exp_3}} {\integerTyp} {\dir_3}\\ - % \typ_1 = \typ_2 \\ - % \typ_1 \eq \integerTyp \\ - \compTimeKnown {\exp_1}} - {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + % \inferrule[ Ternary(AllowedInP4ButNotePetr4)] + % {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ + % \expenv {\exp_2} {\prim {\exp_2}} {\integerTyp} {\dir_2} \\ + % \expenv {\exp_3} {\prim {\exp_3}} {\integerTyp} {\dir_3}\\ + % % \typ_1 = \typ_2 \\ + % % \typ_1 \eq \integerTyp \\ + % \compTimeKnown {\exp_1}} + % {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } - \inferrule[FunctionCall-Function] - { \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}} \dir\\ - % (\exp', \funcType \kind {\typVars} \params {\prim \typ}, \dir) = \resolveFuncOverload \exp \args \\ - % 1 \leq i \leq n; \prim {\typ_i} = \trans {\typ_i} \emp\\ - \prim \typs = \trans \typs \emp \\ + \inferrule[FunctionCall] + { + \resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret} \\ + % \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}}\\ + \overline {\prim \typ} = \trans \typs \emp \\ % \match \params \args\\ - |\typs| = |\typVars| \\ - \prim \typ = \sat {\typ_\ret}\\ - infer + |\typs| = |\typVars|\\ + \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ + {\prim \typ}_{\ret} = \sat {\typ_\ret} \\ + \overline {\param = \pprim {\maybe \exp}} = \matchParArg \params \args\\ + \inferTypParArg {\typ_\ret} {\overline {\typVar : \prim \typ}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}\\ + \validatePars {\params} {\addTypEnvv {\overline {\typVar : \pprim \typ}} } \kind \\ + \overline {\param = \maybe {(\ppprim \exp, \ppprim \typ, \dir)}} = \castParArg {\overline {\param = \pprim {\maybe \exp}}}\\ + \callOK \ctxt \kind } - { \expenv {\funcCall \exp \typs {\argkvss 1, \ldots, \argkvss n}} {} {\prim \typ} \less } - - \inferrule[FunctionCall-Action] - { } - { blah } - -% function type: (x1,...,xn) {...} + { \expenv {\funcCall \exp \typs \args} {\funcCall {\prim \exp} {\overline {\pprim \typ}} {\overline{\maybe {(\ppprim \exp, \ppprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } \inferrule[AnonymousInstantiation] { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } @@ -466,22 +521,40 @@ array access, bist string access, type member, anonymous instant (this is probab ~~ ~ -### Petr4 Restrictions Compared to P4 Spec -conditional operatior (ternary exp). petr4 doesn't support the case where both tru and fls expression have the infinite precision integer type when the condition can be evaluated at compilation time. This is allowed by P4 spec. -Petr4 doesn't have the product operation where multiple sets can be combined using cartesian product and the type of a product of sets is a set of tuples. section 8.12.5. (question) -Petr4 uses Ocaml's field access of records as its field access for structs. NO! field access is expression member. +### Petr4 Restrictions Compared to P4 Spec { #sec-exp-restrictions } +Petr4 does not support all features of P4. This section gathers Petr4's restriction for +expressions: + +- Petr4 doesn't support the case where both the +true and the false expressions have the infinite precision integer type when the +condition can be evaluated at compilation time. However, this is allowed by P4 spec. +- Petr4 doesn't have the product operation where multiple sets can be combined using +cartesian product and the type of a product of sets is a set of tuples. (refer to +section 8.12.5. of P4 spec (**DISCUSS**)) + + +### Petr4 Discrepencies with P4 Spec { #sec-exp-discrepencies } +This section documents the discrepencies of Petr4 with P4 spec: + +- P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) +- P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) +- P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) +- P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) +- P4 spec states that all expressions of type int MUST be compile-time known values but +Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) +### Side Notes { #sec-exp-note } +There are also small differencies between P4 and Petr4's terminologies: -### Petr4 Discrepencies with P4 Spec -P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. -p4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. divops rule. section 8.7. check_binary_op impl. -p4 spec defines bitwise complement only for bit but petr4 also allows it for int. type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule. -p4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but petr4's type system doesn't check this. I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment. -p4 spec states that all expression of type int MUST be compile-time known values but petr4 doesn't always check this. section 8.7 spec. e.g., unaryminus or binaryops rules. -at first glance, it might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. +- Petr4 calls field access for structs _expression member_. +For ease of understanding, we provide notes that help the reader understand some of +the differences of Petr4 and P4 spec that may seem as discrepencies in the first glance: -### Coerce Binary Operation Arguments Auxiliary Judgment +- It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. + + +### Coerce Binary Operation Arguments Auxiliary Judgment { #sec-coerce-bin-args } Let implicitCast typ typ be defined as follows to describe P4's implicit casting behavior on operands in binary expressions: @@ -522,7 +595,7 @@ The restJ rule stands for all other binary operations. ~~ ~ -### Check Binary Operation Auxiliary Judgment +### Binary Operation Auxiliary Judgment { #sec-bin-op } reduce enums removes all the enums recursively after reducing a type. in_or_dirless(typ1, typ2) retunrs direction of In if both typ1 and typ2 have In direction, o.w., it returns a directionless direction. is true if and only if expression type t1 is equivalent to expression type t2 under environment env. Alpha equivalent types are equal. it takes the list of variables of the two types. @@ -540,35 +613,35 @@ compile time known determinez if the value of an expression can be known at comp \typ_2 = \reduceEnums {\exp_2} \\ \dir = \inOrLess {\typ_1} {\typ_2} \\ \typ_1 = \typ_2 = \boolTyp} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } \inferrule[NumericOps($+, -, *$)] { \typ_1 = \reduceEnums {\exp_1} \\ \typ_2 = \reduceEnums {\exp_2} \\ \dir = \inOrLess {\typ_1} {\typ_2} \\ \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } \inferrule[EqualityChecks($==, !=$)] { \typ_1 = \reduceEnums {\exp_1} \\ \typ_2 = \reduceEnums {\exp_2} \\ \typEq {\emp} {\typ_1} {\typ_2} \\ \typHasEq {\typ_1} } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } \inferrule[OpSat($\plusSat,\subSat$)] { \typ_1 = \reduceEnums {\exp_1} \\ \typ_2 = \reduceEnums {\exp_2} \\ \dir = \inOrLess {\typ_1} {\typ_2} \\ \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } \inferrule[BitwiseOps($\bitAnd, \bitOr, \bitXor, \bitComplement$)] { \typ_1 = \reduceEnums {\exp_1} \\ \typ_2 = \reduceEnums {\exp_2} \\ \dir = \inOrLess {\typ_1} {\typ_2} \\ \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } \inferrule[BitstringConcatenation] { \typ_1 = \reduceEnums {\exp_1} \\ @@ -576,7 +649,7 @@ compile time known determinez if the value of an expression can be known at comp \dir = \inOrLess {\typ_1} {\typ_2} \\ \left( \so {\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ \textOr \left( \so {\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right) } - { \binOpEnv {\exp_1 \concat \exp_2} {\exp_1 \concat \exp_2} {\typ} \dir } + { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir } \inferrule[ComparisonOps($<, \leq, >, \geq$)] { \typ_1 = \reduceEnums {\exp_1} \\ @@ -585,7 +658,7 @@ compile time known determinez if the value of an expression can be known at comp \left( \typ_1 = \typ_2 = \integerTyp \right) \\ \textOr \left( \typ_1 = \typ_2 = \bitWidthTyp \width \right) \\ \textOr \left( \typ_1 = \typ_2 = \intWidthTyp \width \right)} - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \boolTyp \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } \inferrule[DivOps($\div, \mod$)] { \typ_1 = \reduceEnums {\exp_1} \\ @@ -593,7 +666,7 @@ compile time known determinez if the value of an expression can be known at comp \dir = \inOrLess {\typ_1} {\typ_2} \\ \left( \so {\typ_1 = \typ_2 = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \\ \textOr \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} \typ \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir } \inferrule[ShiftOps($\shiftL,\shiftR$)] { \typ_1 = \reduceEnums {\exp_1} \\ @@ -602,13 +675,13 @@ compile time known determinez if the value of an expression can be known at comp \nonNeg {\exp_2} \\ \left( \typ_1 = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ \textOr \left( \typ_1 = \integerTyp, \compTimeKnown {\exp_2} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} {\exp_1 \restOps \exp_2} {\typ_1} \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } \end{mathpar} ~~ ~ -### Cast Auxiliary Judgment +### Cast Auxiliary Judgment { #sec-cast } The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. we use subscription of e or i to indicate if a rule only applies for explicit or implicit cast only, respecctively. o.w., the arrow doesn't have a subscription. @@ -773,50 +846,124 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the ~ -### Field Access Builtin Methods Auxiliary Judgment -ref to type_expression_member_function_builtin. +### Field Access Builtin Methods Auxiliary Judgment { #sec-exp-mem-builtin } + +**DISCUSSION** there is some dead code in the implementation of this judgment. +The function _type\_expression\_member_ calls the helper _type\_expression\_member\_builtin_ when it doesn't find the name of field that is to be accessed (that is, for size, +last index, next, or last) and there it checks if the type of the expression is an +array but it has already patterned matched on the type of the expression to be either +struct, header, header union, specilaized, or extern. Thus, the _None_ case would always +fail. what's the correct expected behavior here? ~ Center {padding:1ex} ~~ Snippet \begin{mathpar} \small - \inferrule[Control] - {} - { \fieldAccessEnv {\controlTyp \ \ } \apply {}} + \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \structTypDef = \reduce \typ \\ + % \structTypDef = \prim \typ\\ + (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ + \exists 1 \leq i \leq n+1; \field_i = \name + } + { \fieldAccessEnv \ctxt \structTypDef {\typ_i} } - \inferrule[Parser] - {} - {blah} + \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-SizeOrLastIndex] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \structTypDef = \reduce \typ \\ + % = \prim \typ\\ + % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ + % \isArray \typ \\ + \name = \sizeFlag \textOr \lastIndex\\ + \nexists 1 \leq i \leq n; \field_i = \name + } + { \fieldAccessEnv \ctxt {\arrayTyp \typ \size AND \ \structTypDef} {\bitWidthTyp {32}} } - \inferrule[Table] - {} - {blah} + \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-NextOrLast] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \structTypDef = \reduce \typ \\ + % = \prim \typ\\ + % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ + % \isArray {\reduce \typ} \\ + % \arrayTyp {\prim \typ} \size = \typ\\ + \name = \sizeFlag \textOr \lastIndex \\ + \nexists 1 \leq i \leq n; \field_i = \name + } + { \fieldAccessEnv \parserCtxt {\arrayTyp \typ \size AND \ \structTypDef} \typ } - \inferrule[Struct] - {} - {blah} + \inferrule[ExpressionMember-Specialized] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % names in the following are actually methods. have to see what they contain. + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % \prim \env = \insertToEnv \typParams \typs \\ + \exists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name \\ + \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} + { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} {\typs}} {\pprim {\typ_i}}} - \inferrule[Header] - {} - {blah} - \inferrule[Array] - {} - {blah} + \inferrule[ExpressionMember-Specialized-SizeOrLastIndex] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % names in the following are actually methods. have to see what they contain. + % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \name = \sizeFlag \textOr \lastIndex\\ + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name + } + { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} {\typs} AND \ \arrayTyp \typ \size} {\bitWidthTyp {32}}} + + \inferrule[ExpressionMember-Specialized-NextOrLast] + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % names in the following are actually methods. have to see what they contain. + % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \name = \sizeFlag \textOr \lastIndex\\ + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name + } + { \fieldAccessEnv \parserCtxt {\spcTyp {\externTyp {\prim \name}} {\typs} AND \ \arrayTyp \typ \size} {\typ}} + + \inferrule[ExpressionMember-Extern] + { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} \ } {\pprim \typ} } + { \fieldAccessEnv \ctxt {\externTyp {\prim \name}} {\pprim \typ}} + + % \inferrule[ExpressionMember-Extern-SizeOrLastIndex] + % { \name = \sizeFlag \textOr \lastIndex\\ + % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name \\ + % % \expenv \exp {\prim \exp} {\typ} \dir \\ + % % \externTyp {\prim \name} = \reduce \typ \\ + % % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % % \fieldAccessEnv \ {\spcTyp {\externTyp {\prim \name}} {\ }} \name {\prim \typ}} + % { \fieldAccessEnv \ctxt {\externTyp {\prim \name} AND \ \arrayTyp \typ \size} } + + % \inferrule[ExpressionMember-Rest] + % {\expenv \exp {\prim \exp} {\typ} \dir \\ + % \prim \typ = \reduce \typ \\ + % \fieldAccessEnv {\prim \typ} \name {\pprim \typ}} + % { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } - \inferrule[HeaderUnion] - {} - {blah} \end{mathpar} ~~ ~ -## Type Related Judgments +### Function Call Auxiliary Judgment { #sec-func-call } + +### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } -### Type Well-Formed Auxiliary Judgment +## Type Related Judgments { #sec-types-typing } + +### Type Well-Formed Auxiliary Judgment { #sec-type-well-formed } it saturates all types first and then checks well-formedness. for breviety, we don't include the saturation in rules. is valid nested type outer inner checks whether the nested type is taking valid types in its inner and outer type based on P4's description of type nesting rules section 7.2.7 (provide link). @@ -923,6 +1070,15 @@ names to type env. { \typWellFormed \typ } { \typWellFormed {\newTypeTyp \typ \name} } +\end{mathpar} +~~ +~ + +~ Center {padding:1ex} +~~ Snippet +\begin{mathpar} + \small + \inferrule[SpecializedType] { \prim \typ = \sat \typ \\ \{\param_1, \ldots, \param_m \} = \getTypeParams {\prim \typ} \\ @@ -984,10 +1140,10 @@ names to type env. ~~ ~ -### Type Equality Judgment -TODO: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. +### Type Equality Judgment { #sec-type-eq } +**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. -## Statement's Typing Rules +## Statement's Typing Rules { #sec-stmt-typing } this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. cast_expr takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. @@ -1082,7 +1238,7 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums ~ -## Declaration's Typing Rules +## Declaration's Typing Rules { #sec-decl-typing } is allowed type for variable checks if a type is allowed for declaring a variable. it includes all types after saturation except for string, integer, list, set, void, specialized type, package, control, parser, extern, function, action, constructor, and table. check parameter shadowing takes two lists of paramets and checks if there is any duplicate in them. diff --git a/docs/petr4spec/make.bat b/docs/petr4spec/make.bat index 6bbdd63d5..e04fcfcc9 100644 --- a/docs/petr4spec/make.bat +++ b/docs/petr4spec/make.bat @@ -1 +1 @@ -madoko --pdf -vv --png --odir=build Petr4-spec.mdk +madoko --pdf -vv --odir=build Petr4-spec.mdk diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 6dcf95b01..b2de2d82a 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -9,6 +9,7 @@ \newcommand{\cond}{\mathit{cond}} \newcommand{\prim}[1]{{#1}^\prime} \newcommand{\pprim}[1]{{#1}^{\prime\prime}} +\newcommand{\ppprim}[1]{{#1}^{\prime\prime\prime}} \newcommand{\so}[2]{{#1} \Rightarrow {#2}} \newcommand{\lookupEnv}[1]{\env({#1})} \newcommand{\emp}{[\ ]} @@ -26,10 +27,12 @@ \newcommand{\expenvv}[5]{\env_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} \newcommand{\expenvWithCtxt}[5]{\env, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} \newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}; {#3})} -\newcommand{\binOpEnv}[4]{\env \vdash {#1} \hookrightarrow {#2}, {#3}, {#4}} +\newcommand{\binOpEnv}[3]{\env \vdash {#1} : {#2}, {#3}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} -\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash {#2} : {#3}} +\newcommand{\typEqEnv}[2]{\env \vdash {#1}, {#2}} +%context. type of expression. type of returned name.exp +\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash \name, {#2} : {#3}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} \newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} @@ -38,6 +41,11 @@ \newcommand{\explCast}[2]{\castenv {e} {#1} {#2}} \newcommand{\castenv}[3]{\env \vdash {#2} \rightarrow_{#1} {#3}} \newcommand{\implCast}[2]{\castenv {i} {#1} {#2}} +%exp, args. exp', type pars, pars, kind, return type. +%check if you need the dir to be returned as well. +\newcommand{\resolveFuncOver}[7]{\env, \ctxt \vdash {#1}, {#2} \leadsto {#3}, {#4}, {#5}, {#6}, {#7}} +%return type. typ par : typ arg. par = exp. constraints (init to typ par : typ arg). typ par : typ arg (infered). +\newcommand{\inferTypParArg}[5]{\env, \ctxt \vdash {#1}, {#2}, {#3}, {#4} \mapsto {#5}} @@ -46,7 +54,7 @@ \newcommand{\applyBlockCtxt}{\mathit{APPLYBLOCK}} \newcommand{\actionCtxt}{\mathit{ACTION}} \newcommand{\funcCtxt}[1]{\mathit{FUNCTION}\ {#1}} -\newcommand{\parserCtxt}{\mathit{PARSER}} +\newcommand{\parserCtxt}{\mathit{PARSERSTATE}} \newcommand{\toplevel}{\mathit{TOPLEVEL}} %operators: @@ -146,6 +154,7 @@ %function helpers \newcommand{\addTypeEnv}[2]{\typEnv[{#1}:{#2}]} +\newcommand{\addTypEnvv}[1]{\typEnv[{#1}]} \newcommand{\addConstEnv}[2]{\constEnv[{#1}={#2}]} \newcommand{\isNumeric}[1]{\mathit{is\_numeric}({#1})} \newcommand{\isArray}[1]{\mathit{is\_array}({#1})} @@ -174,12 +183,20 @@ \newcommand{\reduceWithEnv}[2]{\mathit{reduce}({#2})_{#1}} %% \newcommand{\fieldOrMethodTyp}[1]{\mathit{field\_or\_method\_type}({#1})} \newcommand{\isLval}[1]{\mathit{is\_lvalue}({#1})} +%type. exp. \newcommand{\castExpression}[2]{\mathit{cast\_expression}({#1},{#2})} \newcommand{\ifVoidTyp}[1]{\mathit{if\_void\_type}({#1})} \newcommand{\allowedTypeForVar}[1]{\mathit{is\_allowed\_type\_for\_variable}({#1})} \newcommand{\checkParamShadow}[2]{\mathit{check\_parameter\_shadowing}({#1}, {#2})} -%% \newcommand{\resolveFuncOverload}[2]{\mathit{resolve\_function\_overload}({#1},{#2})} \newcommand{\match}[2]{\mathit{match}({#1},{#2})} +\newcommand{\zip}[2]{\mathit{zip} ({#1},{#2})} +\newcommand{\matchParArg}[2]{\mathit{macth\_parameter\_argument}({#1},{#2})} +\newcommand{\validatePars}[3]{\mathit{validate\_parameter}({#1})_{{#2},{#3}}} +\newcommand{\maybe}[1]{{#1}_{\bot}} +\newcommand{\castParArg}[1]{\mathit{cast\_parameter\_argument}({#1})} +\newcommand{\callOK}[2]{\mathit{call\_ok}({#1},{#2})} + +%fields \newcommand{\isValid}{\mathit{isValid}} \newcommand{\apply}{\mathit{apply}} \newcommand{\minSizeBits}{\mathit{minSizeInBits}} @@ -188,6 +205,14 @@ \newcommand{\setInvalid}{\mathit{setInvalid}} \newcommand{\pushFront}{\mathit{push\_front}} \newcommand{\popFront}{\mathit{pop\_front}} +\newcommand{\sizeFlag}{\mathit{size}} +\newcommand{\lastIndex}{\mathit{lastIndex}} +\renewcommand{\next}{\mathit{next}} +\newcommand{\last}{\mathit{last}} + + +%kinds +\newcommand{\builtin}{\mathit{builtin}} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} diff --git a/lib/checker.ml b/lib/checker.ml index 8d5309ccd..a0efe94e3 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2524,6 +2524,10 @@ and type_expression_member env ctx expr (name: P4String.t) : Prog.Expression.t = let open Expression in begin match List.find ~f:matches fs with | Some field -> field.typ + (* TODO: DISCUSSION. THIS WILL ALWAYS FAIL. expr_typ is either + header, header_union or struct. so it will never be array. + while type_expression_member_builtin only returns non-fail + for array. *) | None -> type_expression_member_builtin env ctx (tags expr) expr_typ name end | SpecializedType { base = Extern { name = extern_name }; args } -> @@ -2610,6 +2614,12 @@ and match_params_to_args call_site_tags params (args: Argument.t list) : (Typed. | Some `Named -> match_named_args_to_params call_site_tags params args +(* matches arguments to parameters based on position and returns [(parameter, option expression)]. + if an argument is missing, it bundles up the parameter to none. + if the argument list becomes empty but there are still parameters, it checks if + the parameter has opt_value, if so it bundles the parameter with an expression that has the + value of opt_value. if the parameter doesn't have opt_value, it checks if the parameter is + optional, if so, it bundles up the parameter with a missing argument. ow., it raises an error.*) and match_positional_args_to_params call_site_tags params args = let conv param arg = let open Types.Argument in @@ -2639,6 +2649,13 @@ and match_positional_args_to_params call_site_tags params args = in go params args +(* matches the arguments to parameters based on parameter names. + if the parameter and argument have the same name it bundles up the parameter name and the + argument value. + if the parameter has opt_value and there is no argument with the name of parameter it + bundles up the parameter name with its opt_value. but if the paremeter doesn't have + opt_value and is optional, it bundles up the parameter name with none. ow., it raises a + mismatch error. *) and match_named_args_to_params call_site_tags (params: Typed.Parameter.t list) args = let open Types.Argument in let open Typed.Parameter in @@ -2751,10 +2768,7 @@ and call_ok (ctx: ExprContext.t) (fn_kind: Typed.FunctionType.kind) : bool = | _, Builtin -> true end -(* TODO - - -*) +(* TODO *) and type_function_call env ctx call_tags func type_args (args: Argument.t list) : Prog.Expression.t = let open Prog.Expression in (* Printf.printf "we're here!!!"; *) From dc34acdf27aebae98ef60ea5ffc715f0248091f9 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 28 Jun 2022 11:41:23 -0400 Subject: [PATCH 09/30] type well formed done --- docs/petr4spec/Petr4-spec.mdk | 1459 +++++++++++++++++++++------------ docs/petr4spec/ops.tex | 147 +++- 2 files changed, 1061 insertions(+), 545 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 239abbc7d..b52b1b4c7 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -3,6 +3,8 @@ Title Footer : &date; Author : Petr4 Team Affiliation : Cornell University Heading depth : 5 +Cite Style : numeric +BibTex : False Math Mode : static Pdf Latex : xelatex @@ -10,8 +12,7 @@ Math Latex Full : pdflatex Document Class : [11pt]article -Package : amssymb -Package : amscd +Package : mathtools Package : fancyhdr Package : mathpartir @@ -20,6 +21,10 @@ Tex Header: \setlength{\headheight}{30pt} \renewcommand{\footrulewidth}{0.5pt} +.code: background-color=Gainsboro +.code2: background-color=LightCoral +.code3: background-color=Fuchsia + @if html { body.madoko { font-family: utopia-std, serif; @@ -143,15 +148,98 @@ p4grammar { } } +@if html { +infrule { + replace: "~ Begin InfRuleBlock&nl;\ + ~~ Center {padding:1ex}&nl;\ + ~~~ Snippet&nl;\ + \begin{mathpar}&nl;\ + \small&nl;\ + &source;&nl;\ + \end{mathpar}&nl;\ + ~~~&nl;\ + ~~&nl;\ + ~ End InfRuleBlock"; + border: solid; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #fffaf0; + border-width: 0.5pt; +} +} + +@if tex { +infrule { + replace: "~ Begin InfRuleBlock&nl;\ + ~~ Center {padding:1ex}&nl;\ + ~~~ Snippet&nl;\ + \begin{mathpar}&nl;\ + \small&nl;\ + &source;&nl;\ + \end{mathpar}&nl;\ + ~~~&nl;\ + ~~&nl;\ + ~ End InfRuleBlock"; + breakable: true; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #fffaf0; + border: solid; + border-width: 0.5pt; +} +} + +@if html { +infrulehelper { + replace: "~ Begin InfRuleHelperBlock&nl;\ + ~~ Center {padding:1ex}&nl;\ + ~~~ Snippet&nl;\ + \begin{mathpar}&nl;\ + \small&nl;\ + &source;&nl;\ + \end{mathpar}&nl;\ + ~~~&nl;\ + ~~&nl;\ + ~ End InfRuleHelperBlock"; + border: solid; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #ECE1FB; + border-width: 0.5pt; +} +} + +@if tex { +infrulehelper { + replace: "~ Begin InfRuleHelperBlock&nl;\ + ~~ Center {padding:1ex}&nl;\ + ~~~ Snippet&nl;\ + \begin{mathpar}&nl;\ + \small&nl;\ + &source;&nl;\ + \end{mathpar}&nl;\ + ~~~&nl;\ + ~~&nl;\ + ~ End InfRuleHelperBlock"; + breakable: true; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #ECE1FB; + border: solid; + border-width: 0.5pt; +} +} + + ~Aligned : replace:"~Math&nl;\begin{aligned}&nl;&source;&nl;\end{aligned}&nl;~" [TITLE] -~ TexRaw -\mdDefineUnicode{10214}{\ensuremath{\llbracket}} -\mdDefineUnicode{10215}{\ensuremath{\rrbracket}} -~ ~ Begin Abstract P4 is a language for programming the data plane of network @@ -171,32 +259,62 @@ limitations. [INCLUDE="ops.tex"] ~ +~ Bibliography { caption:"00" } +~~Bibitem {#harper-types-PL} +Rober Harper. +Types and Prgarmming Languages. + +~~ +~~Bibitem {#wiki-type-sys} +Type System. + +~~ +~ + [TOC] # Overview { #sec-overview } -This document defines the type system of Petr4. The type system -conducts three tasks simultaneously: - -1. It type checks P4 programs. -2. It conducts type inference. -3. It does a pass from the surface syntax to the first IR. - - -## Connecting To The Implementation { #sec-conn } - -The following locates each data type in the implementation -(): +This document recognizes the need for having a formal type system for Petr4 and +defines such type system. It is organized as follows: + +- It first expresses the need to have a formal type system for P4 and familiarizes the +reader with the concept of a type system, its role in language design, and how to read +and understand a type system (Section [#sec-note-type-sys]). +- It then focuses on the architecture of Petr4 and points out the part that this document focues on (Section [#sec-arch]). +- It also describes the structure of Petr4's type system (Section [#sec-petr4-type-sys]) and defines the metavariables used throughout this document (Section [#sec-metavar]). +- For those interested, it connects the formalziation in this document to the impelemntation of Petr4 (Section [#sec-conn]). + +## Brief Notes on Type System { #sec-note-type-sys } + +It is important that the reader understands the reason for having a type system and what its role is. +You can simply think of types as a set of language elements that share some features. +For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. +Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. +That is why [@harper-types-PL] states: "The central organizing principle of language desing is the dientitfication of language features with types." + +A simple reasoning about programs of a language can be done by a _type system_. +A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expression, etc[@wiki-type-sys]. +A type system formally defines many aspects of a programming language. +Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. + +Additionally, it is important for the reader to be able to read and understand inference rules. +A type system is made up of typing _rules_ that each has a specific _judgment form_. +A typing rule, in essence, is an _inference rule_. +An inference rule contains zero or more _premises_ above the line +and one _conclusion_ below the line +with the name of the rule on top or next to the line. +For example, the rule $\ruleName$ below reads as +$C$ is concluded if premises $A$ and $B$ hold. -- The surface AST is _types.program_ -- The type of programs of the surface syntax is _types.type.t_ -- The first IR is _prog.program_ -- The type of the first IR is _prog.type.t_ -- The type system is implemented in _checker.ml_ file. +~ Begin InfRule + \inferrule[\ruleName] + {A \\ B} + {C} +~ End InfRule -For simplicity, we have removed the information that is needed to report when an error -happens. Such information is passed around in the surface syntax as a field (called -`tags`) of record for all data types. +A rule without the line and premises above it is called an _axiom_ and it states that +the conclusion holds uncoditionally. ## Architecture { #sec-arch } @@ -214,345 +332,582 @@ program is evaluated. ~ [arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } -# Type System -A P4 program is mainly a list of declarations. A declaration could be declaring a +## Petr4's Type System { #sec-petr4-type-sys } + +A P4 program is mainly a list of declarations and a declaration could be declaring a parser or control plane, instantiating an object, calling a (extern) function or method, and defining a type or an object. Each declaration may contain multiple statements and -expressions within it. Thus, Petr4's type system contains multiple typing judgments for -three main categories: +expressions within it. + Thus, Petr4's type system contains multiple typing judgments for +four main categories: +[types][#sec-types-typing], [expressions][#sec-exp-typing], [statements][#sec-stmt-typing], and [declarations][#sec-decl-typing]. -In addition, types themselves have judgments for checking their [well-formness][#sec-type-well-formed] and [equality][#sec-type-eq]. + Each typing judgment may use auxiliary judgment and helper functions. The auxiliary judgments are included in this document while the helper functions are just explained in plain English. -**PL Note:** -A _type system_ is made up of typing _judgments_ -and each typing judgment contains multiple -_typing rules_. A typing rule, in essence, is an _inference rule_. -An inference rule contains zero or more _propositions_ above the line -and one _conclusion_ below the line -with the name of the rule on top or next to the line. -For example, the rule $RuleName$ below reads as -$C$ is concluded if propositions $A$ and $B$ hold. +Conventionally, in this document we accompany rule names with four possible suffixes: -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} +- $\ruleNameT$ indicates that the rule is describing a rule for a type +- $\ruleNameE$ and $\ruleNameAE$ indicate that the rules are for an expression and an auxiliary judgment for an expression +- $\ruleNameS$ indicates that the rule is describing a rule for a statement +- $\ruleNameD$ indicates that the rule is describing a rule for a declaration - \inferrule[RuleName] - {A \\ B} - {C} +The type system conducts three tasks simultaneously: -\end{mathpar} -~~ +1. It type checks P4 programs. +2. It conducts type inference. +3. It does a pass from the surface syntax to the first IR. + +```**TODO** maybe have more explanation on IR.``` + + +### Metavariables { #sec-metavar } + +Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. + +We use the notation of $\overline {\mathit{something}}$ to denote a list of $\mathit{something}$s. + +The following describes the metavariables used in this document: + +~ Center +| **metavariable** | **type represented** | +|:----------------:|:------------------| +| $\bool$ | booleans | +| $\str$ | strings | +| $\int$ | arbitrary length integer | +| $\bitWidth \bit \width$ | fixed length integer | +| $\intWidth \int \width$ | signed integer | +| $\name$ | strings represing any kinds of names | +| $\typ$ | types | +| $\dir$ | directions | +| $\typVar$ | type variables | +| $\field$ | field names | +| $\env$ | environments | +| $\emp$ | empty list of elements | ~ -## Expression's Typing Rules { #sec-exp-typing } +## Connecting To The Implementation { #sec-conn } -The judgment $\expenv {\exp} {\prim \exp} \typ \dir $ states that expression $\exp$ -written in surface syntax translates to expression $\prim \exp$ in the IR syntax with -the type $\typ$ and direction $\dir$ under enviornment $\env$. For now, we do not -present the syntax of the surface syntax and IR. Note that there is not much difference -between the two. **TODO** We plan to add the abstract syntax of them in appendix later. +The following locates each data type in the implementation +(): -Note the following notes: +- The surface AST is _types.program_ +- The type of programs of the surface syntax is _types.type.t_ +- The first IR is _prog.program_ +- The type of the first IR is _prog.type.t_ +- The type system is implemented in _checker.ml_ file. -- We use $\overline x$ to denote a list of $x$. -- For simplicity, we omit mapping a function on a list of elements. Instead, we just apply the function to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. +For simplicity, we have removed the information that is needed to report when an error +happens. Such information is passed around in the surface syntax as a field (called +`tags`) of record for all data types. -There are multiple helper functions used in judgements that are explained below: +# Type Related Judgments { #sec-types-typing } -- $\sat \typ$ satuarates a type, that is, it eliminates all type references in type -$\typ$ and replaces them with the type they refer to. Thus, the result of saturation -contains no _TypeName_ constructors that are used to give a name to a new type. -- $\lookupEnv \name$ looks up a variable (indicated with $\name$ which is the variable -name) in the enviornment and it returns its type and direction. When we only need the -type or the direction of the variable we simply ignore the other one. So you could see -formalization such as $\typ = \lookupEnv \name$ which states that we looked up variable -$\name$ from the enviornment and we found out that its type is $\typ$. Similarly, the -formalization $(\typ, \dir) = \lookupEnv \name$ states that we looked up variable -$\name$ in the enviornment $\env$ and it has the type $\typ$ and direction $\dir$. -- $\mathit{is\_X} (\typ)$ checks if the type $\typ$ is of the specific kind of type $X$. -For example, $\isArray \typ$ checks if the type $\typ$ is an array. Or $\isNumeric \typ$ -check is the type $\typ$ is of numeric nature, that is, if it is fixed length signed or -unsigned integer or arbitrary precision integer. -- $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the -compilation. It does so by evaluating the expression $\exp$ at compile time, if that is -possible then we know the value at compile time. Otherwise, if the expression $\exp$ is -a specialized type, extern, package, control, or parser but we cannot evaluate it at -compile time we still consider it known at compile time. -- $\reduce \typ $ saturates the type $\typ$ ... **TODO** (reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match..) -- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. -- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. -- $\validatePars \params \env \kind$ validates parameters $\params$ under the enviornment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). -- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. -- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). -- Did I miss anything else? +Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. +Additionally, it is sometimes required to check two types for equality. Petr4's type equality considers alpha equivalent[^alpha-equiv-wiki] types equal. -Additionally, some of the typing rules use auxiliary judgments. The following is a brief -explanatin of auxiliary judgments that are used in expression's typing rules: +[^alpha-equiv-wiki]: <> + + +## Type Well-Formed Judgment { #sec-type-well-formed } + +This judgment checks if a type is well-formed. Note that this judgment is defined over the types defined in the IR and not the surface syntax. +It has the form $\typWellFormed \typ$ which states that the type $\typ$ +is well-formed under the environment $\env$, that is, the type is syntactically correct. + +All typing rules first saturate all types and then checks well-formedness. +For breviety, we don't include the saturation in rules. + +### Base Types { #sec-base-t } + +The following base types are well-formed unconditionally since there is not any room for an error while constructing a value of these types. For example, the $\boolTyp$ only has two constructors $\mathit{true}$ and $\mathit{false}$ which do not take any arguement so there is no room to construct a value incorrectly. + +~ Begin InfRule + + \inferrule[\boolT] + {} + { \typWellFormed \boolTyp } + + \inferrule[\stringT] + {} + { \typWellFormed \stringTyp } + + \inferrule[\intT] + {} + { \typWellFormed \integerTyp } + + \inferrule[\varbitT] + {} + { \typWellFormed {\varBitTyp \width} } + + \inferrule[\errT] + {} + { \typWellFormed \errTyp} + + \inferrule[\voidT] + {} + { \typWellFormed \voidTyp} + + \inferrule[\matchKindT] + {} + { \typWellFormed \matchKindTyp} + +~ End InfRule + +``**DISCUSSION** +Petr4 doesn't check the length of a fixed-length integer, either signed or unsigned. However, P4 spec specifies that for signed integers the length must be more than 1 and for unsigned integers the length must be equal or more than zero.`` + +~ Begin InfRule + + \inferrule[\intWidthT] + % { 1 < \width} % p4 spec has this + {} + { \typWellFormed {\intWidthTyp \width} } + + \inferrule[\bitWidthT] + % { 0 \leq \width} % p4 spec has this + {} + { \typWellFormed {\bitWidthTyp \width} } + +~ End InfRule + +### Array Type { #sec-array-t } + +An array type has a specific type and size. +The rule $\arrayT$ states that under environment $\env$ an array is well-formed if its +type is well-formed and it follows the nesting rules of P4. + +- $\isValidNestedTyp {\typ_1} {\typ_2}$ outer inner checks whether a nested type is taking valid types as its outer ($\typ_1$) and outer ($\typ_2$) types based on [P4's description of type nesting rules][sec7-2-7]. + +[sec7-2-7]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-type-nesting + +~ Begin InfRule + + \inferrule[\arrayT] + { \typWellFormed \typ \\ + \isValidNestedTyp {\arrayTyp \typ \size} {\typ}} + { \typWellFormed {\arrayTyp \typ \size} } + +~ End InfRule + +### Tuple Type { #sec-tuple-t } + +Each element of a tuple can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under +environment $\env$ a tuple type is well-formed if all its types are well-formed and it +follows the nesting typing rules of P4. + +~ Begin InfRule + + \inferrule[\tupleT] + { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + 1 \leq i \leq n. \isValidNestedTyp {\tupleTyp {\typ_1} {\typ_n}} {\typ_i}} + { \typWellFormed {\tupleTyp {\typ_1} {\typ_n}} } + + % \inferrule[List] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp {\listTyp {\typ_1} {\typ_n}} {\typ_i}} + % { \typWellFormed {\listTyp {\typ_1} {\typ_n}} } + +~ End InfRule + +### Set Type { #sec-set-t } + +In P4, unlike tuples, elements of a set must all have the same type and the set type is well-formed if the type of its elements is well-formed, which is stated by the $\setT$ rule. + +~ Begin InfRule + + \inferrule[\setT] + { \typWellFormed \typ } + { \typWellFormed {\setTyp \typ} } + +~ End InfRule + +### Enumeration Type { #sec-enum-t } + +An enumeration type contains a number of constants of string type and its declaration introduces a new identifier in the current naming scope. It could also have an underlying representation which states what is the type of its constants. +The rules below state that an enum type is well-formed if the underlying representation is well-formed, if it has one. + + +``**DISCREPENCY**`` +Petr4 doesn't allow for an enum to have default values for constants, however, P4 spec does. Here's an [example][enum-ex]. + +[enum-ex]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-enum-types + + +~ Begin InfRule + + \inferrule[\enumOneT] + {} + { \typWellFormed \enumTypNoTyp } + + \inferrule[\enumTwoT] + { \typWellFormed \typ } + { \typWellFormed \enumTyp } + +~ End InfRule + +### Record Type { #sec-record-t } + +A record has zero or more fields, which each field has a name and a type. +The rule $\recordT$ states that a record type is well-formed if all its fields have well-formed types, all fields have types that can be nested in a record, and fields have distinct names. + +Note that headers, header unions, and struct also have a record type. + +~ Begin InfRule + \inferrule[\recordT] + { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + 1 \leq i \leq n. \isValidNestedTyp \recordTypDef {\typ_i} \\ + 1 \leq i < j \leq n. \field_i \neq \field_j} + { \typWellFormed \recordTypDef } + + % \inferrule[HeaderUnion] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \headerUnionTyp {\typ_i} \\ + % % \noDup {\field_1, \ldots, \field_n}\\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \headerUnionTyp } + + % \inferrule[Struct] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \structTypDef {\typ_i} \\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \structTypDef } + + % \inferrule[Header] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \headerTypDef {\typ_i} \\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \headerTypDef } + +~ End InfRule + +### New Type Type { #sec-newtype-t } + +New type assings a name to a type. So the $\newTypeT$ checks if the assignee type $\typ$ is well-formed. + +~ Begin InfRule + + \inferrule[\newTypeT] + { \typWellFormed \typ } + { \typWellFormed {\newTypeTyp \typ \name} } + +~ End InfRule + +### Specialized Type { #sec-specialized-t } + +An specialized type specifies the types of parameters in a generic type, the underlying generic type in an specialized type is called the base type. An specialized type is necessary when the compiler cannot infer type arguments. + +The rule $\specializedExternT$ states that the specialization of an extern type is well-formed if the extern $\name$ exists in the environment $\env$ and the specialization specifies the type of all its type parameters. Similarly, the rule $\specializedRestT$ states that the specialization of a package/control/parser/function is well-formed if it specifies the type of all its type parameters. + +- Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. + +- $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. + +~ Begin InfRule + + \inferrule[\specializedExternT] + { ([\param_1, \ldots, \param_m], _)= \lookupEnv \name \\ + 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + n = m} + { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } + + + \inferrule[\specializedRestT] + { \{\param_1, \ldots, \param_m \} = \getTypeParams \typ \\ + 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + n = m} + { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } + +~ End InfRule + +### Package Type { #sec-package-t } + +A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. ```TODO: question for Ryan, what's the purpose of them?``` +The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are directionless and their types are well-formed. + +- A parameter $\prm \ $ has direction $\dir$, type $\typ$, and name $\name$. +- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. + +~ Begin InfRule + + \inferrule[\packageT] + { 1 \leq i \leq n. \dir_i = \less \\ + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} + { \typWellFormed {\packageTyp {\typParams} {\prm 1, \ldots, \prm n} {\wildcardParams}} } + +~ End InfRule + +### Control Type { #sec-control-t } + +A control type is similar to a type signature of a function in that it defines the type parameters used in the control and its parameters, however, it does not have a return type. The rule $\controlT$ states that the control type is well-formed under the environment $\env$ extended with type variables $\typParams$ if all the types of its parameters are well-formed. + +Parsers also have a control type. + +``**DISCREPENCY** +P4 spec states that "The types parser, control, and package cannot be used as types of arguments for methods, parsers, controls, tables, actions. They can be used as types for the arguments passed to constructors." We could check this in the well-formedness of types or even when we're declaring a method, parser, control, table, or action, instead of when we're defining their type (make sure we're not checking it then).`` ([p4 spec ref][parser-type]) + +[parser-type]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-parser-control-types + +~ Begin InfRule + + \inferrule[\controlT] + { 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} + { \typWellFormed {\controlTyp {\typParams} {\prm 1, \ldots, \prm n} } } + + % \inferrule[Parser] + % { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + % 1 \leq i \leq n. \typWellFormedWithEnv {\prim \env} {\typ_i}} + % { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } + +~ End InfRule + +### Extern Type { #sec-extern-t } + +The rule $\externT$ states that an extern type is well-formed if it has no type parameter in the environment. +lookup extern in env returns an externMethods type which includes a list of strings as +type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. + +```**DISCUSSION** +This seems way too simple and loose.``` + +~ Begin InfRule + + \inferrule[\externT] + { ([], _ ) =\lookupEnv \name } + { \typWellFormed {\externTyp \name} } + +~ End InfRule + +### Function Type { #sec-func-t } + +A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$ extended with function's type parameters. + +~ Begin InfRule + + \inferrule[\functionT] + { \typWellFormed \typ \\ + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } + % (x1,...,xn) {...} + { \typWellFormed {\funcTyp \typ {\typParams} {\prm 1, \ldots, \prm n}} } + +~ End InfRule + +### Action Type { #sec-action-t } + +An action type defines data and control parameters and it is well-formed if the types of all parameters are well-formed and the control parameters are directionless. + +~ Begin InfRule + + \inferrule[\actionT] + { 1 \leq k \leq n. \typWellFormed {\typ_k} \\ + i < k \leq n. \dir_k = \less } + { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm {i+1}, \ldots, \prm n}} } + +~ End InfRule + +### Constructor Type { #sec-constructor-t } + +The rule $\constructorT$ states that a constructor type is well-formed if its return type $\typ$ is well formed and the types of its parameters are well-formed under the environment $\env$ extended with the constructor's type parameters. Note that \_ indicates the wildcard parameters. + +~ Begin InfRule + + \inferrule[\constructorT] + { \typWellFormed \typ \\ + % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_n} } + { \typWellFormed {\constructorTyp \typ \name \typParams {\prm 1, \ldots, \prm n}} } + +~ End InfRule + +### Table Type { #sec-table-t } + +A table type is well-formed under an environment if it exists in the environment. + +~ Begin InfRule + + \inferrule[\tableT] + { \typ = \lookupEnv \name } + { \typWellFormed {\tableTyp \name} } + +~ End InfRule + +### Typename Type { #sec-typename-t } + +The rule $\typeNameT$ states that the type name $\name$ is well-formed under the environment $\env$ if it exists in the environment. + +~ Begin InfRule + + \inferrule[\typeNameT] + { \typ = \lookupEnv \name } + { \typWellFormed {\typNameTyp \name} } + +~ End InfRule + +## Type Equality Judgment { #sec-type-eq } +```**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. ``` -- The [casting auxiliary judgment][#sec-cast] defines rules for implicitly -and/or explicitly casting one type to another. Sepcifically, the judgment -$\castenv \ {\typ_1} {\typ_2}$ states that under enviornment $\env$ -the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. -However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only -done implicitly or explicitly, respectively. -- The [coerce binary operation's arguments auxiliary judgment][#sec-coerce-bin-args] -allows the operands of a binary operation to be casted to another type when applicable. -It has the judgment form -$\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ -which statees that under enviornment $\env$ and context $\ctxt$ -the expression $\exp$ written in the surface syntax has -two operands $\exp_1$ and $\exp_2$ in the IR with types and directions -$\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have -resulted from casting. -- The [binary operation judgment][#sec-bin-op] confirms that an expression using a -binary operation follows the constraints of that binary operation. For example, if -an expression is checking the equality of two subexpression it checks that both -subexpression are of a type that equality is meaningful for it. It has the judgment -form $\binOpEnv \exp \typ \dir $ which states that the expression $\exp$ -written in the IR is well-typed (that is, it follows all the restrictions applied to the -binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. -- The [expression memeber builtin judgment][#sec-exp-mem-builtin] is a helper judgment -for expression member (field access) rule. -It has the form $\fieldAccessEnv \ctxt \exp \typ {\prim \typ}$ -which states that under enviornment $\env$ and context $\ctxt$, the field $\name$ -has the type $\prim \typ$ in the expression $\exp$ of type $\typ$. -Note that $\exp$ has to be an expression -that contains fields, such as a struct or a header. -- The [type well-formedness judgment][#sec-type-well-formed] checks if a type is -well-formed. It has the form $\typWellFormed \typ$ which states that the type $\typ$ -is well-formed under the enviornment $\env$, that is, the type is syntactically correct. - The [type equality judgment][#sec-type-eq] checks the equality of two types. It has -the form $\typEqEnv {\typ_1} {\typ_2}$ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the enviornment $\env$. -- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1) it checks -if the expression $\exp$ called from the function call is a ...; -2) it checks if the expression $\exp$ either has a function type or an action typ, and if so it returns the type parameteres, parameters, kind, and return type; -and 3) it resolves function overload. -It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function call with arguments $\args$ under enviornment $\env$ and context $\ctxt$ translates to expressio $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\params$, kind $\kind$, and the return type $\typ_\ret$. -- The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function. It has the judgment form $\inferTypParArg {\typ_\ret} {\overline {\typVar : \typ}} {\overline {\param = {\maybe \exp}}} {\overline {\prim \typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}$ which states that the type parameters $\typVars$ have the type $\pprim \typ$ under enviornment $\env$ and context $\ctxt$ with the return type of $\typ_\ret$, the assignment of type parameters $\typVars$ to types $\typs$, the assignment of parameters $\params$ to optional expressions $\maybe \exp$, and constraints $fill\ later$. +the form $\typEqEnv {\typ_1} {\typ_2}$ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$. -**NOTE**: I couldn't find the followings in section 8 of p4 spec: -array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). +# Expression's Typing Rules { #sec-exp-typing } + +The judgment form +$\expenv {\exp} {\prim \exp} \typ \dir $ states that expression $\exp$ +written in surface syntax translates to expression $\prim \exp$ in the IR syntax with +the type $\typ$ and direction $\dir$ under environment $\env$. For now, we do not +present the syntax of the surface syntax and IR. Note that there is not much difference +between the two. -**TODO** explanation of some of the rules. start with a couple of simple ones (bool and name), then -intermediate (biststringaccess, record, cast) and then complicated (function call, exp mem, instantiation). +```**TODO** We plan to add the abstract syntax of them in appendix later.``` +## Boolean, String, and Integer Constructor Rules +The rule $\boolE$ states that a boolean expression in surface syntax has the type $\boolTyp$, it translates to the same boolean expression in the IR syntax, and has the $\less$ direction. +The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar to $\boolE$. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRule - \inferrule[Bool] + \inferrule[\boolE] {} {\expenv \bool \bool \boolTyp \less} - \inferrule[String] + \inferrule[\stringE] {} {\expenv \str \str \stringTyp \less} - \inferrule[Integer] + \inferrule[\integerE] {} {\expenv \int \int \integerTyp \less} - \inferrule[Bit] + \inferrule[\bitStringE] {} {\expenv {\bitWidth \bit \width} {\bitWidth \bit \width} {\bitWidthTyp \width} \less} - \inferrule[Int] + \inferrule[\signedIntE] {} {\expenv {\intWidth \int \width} {\intWidth \int \width} {\intWidthTyp \width} {\less}} - \inferrule[Name] - {\lookupEnv \name = (\typ, \dir)} - {\expenv \name \name \typ \dir} +~ End InfRule - \inferrule[ArrayAccess] - {\expenv {\array} {\prim \array} {\arrayTyp \typ \size} \dir \\ - \expenv \index {\prim \index} {\prim \typ} {\prim \dir} \\ - \isArray {\arrayTyp \typ \size} \\ - \isNumeric {\prim \typ}} - {\expenv {\arrayAccess \array \index} {\arrayAccess {\prim \array} {\prim \index}} \typ \dir } - - \inferrule[BitStringAccess] - {\expenvWithCtxt \cte \high {\prim \high} {\typ_\high} {\dir_\high} \\ - \isNumeric {\typ_\high} \\ - \pprim \high = \compileTimeEval {\prim \high} \\ - \expenvWithCtxt \cte \low {\prim \low} {\typ_\low} {\dir_\low} \\ - \isNumeric {\typ_\low} \\ - \pprim \low = \compileTimeEval {\prim \low} \\ - 0 \leq \pprim \low < \width \\ - \pprim l \leq \pprim h < \width \\ - \expenv \bitString {\prim \bitString} \typ \dir \\ - \typ = \intWidthTyp \width \textOr \bitWidthTyp \width} - {\expenv {\bitStringAccess \bitString \low \high} {\bitStringAccess \bitString {\pprim \low} {\pprim \high}} {\bitStringTyp {\pprim \high - \pprim \low}} \dir } - - \inferrule[List] - {1 \leq i \leq n; \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} - {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\exp_1, \ldots, \exp_n}} {\listTyp {\typ_1} {\typ_n}} \less } +## Name Rule - \inferrule[Record] - {1 \leq i \leq n; \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } - {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } +The rule $\nameE$ looks up the name of a variable from the environment and returns its type and direction. Note that if the environment doesn't contain the name the rule will fail. - \inferrule[LogicalNegation] - { \expenv \exp {\prim \exp} \boolTyp \dir } - { \expenv {!\exp} {!\prim \exp} \boolTyp \dir } - - \inferrule[BitwiseComplement] - { \expenv \exp {\prim \exp} \typ \dir \\ - \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} - { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\typ} \dir } - - \inferrule[UnaryMinus] - { \expenv \exp {\prim \exp} \typ \dir \\ - \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp} - { \expenv {-\exp} {-\prim \exp} {\intWidthTyp \width} \dir } +- $\lookupEnv \name$ looks up a name in the environment and it returns its type and direction. When we only need the +type or the direction of the variable we simply ignore the other one. So you could see +formalization such as $\lookupEnv \name = \typ$ which states that we looked up variable +$\name$ from the environment and we found out that its type is $\typ$. Similarly, the +formalization $\lookupEnv \name = (\typ, \dir)$ states that we looked up variable +$\name$ in the environment $\env$ and it has the type $\typ$ and direction $\dir$. - \inferrule[BinaryOps] - {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}} {\prim {\exp_2}} \\ - \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } - { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } +~ Begin InfRule -\end{mathpar} -~~ -~ + \inferrule[\nameE] + {\lookupEnv \name = (\typ, \dir)} + {\expenv \name \name \typ \dir} -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ End InfRule - \inferrule[Cast] - { \expenv \exp {\exp_1} {\typ_1} \dir \\ - \typ_2 = \sat {\typ_1} \\ - \typ_3 = \trans {\typ_2} {\emp} \\ - \typ_4 = \sat {\typ_3} \\ - \typWellFormed {\typ_3} \\ - \explicitCastOK {\typ_1} {\typ_3}} - { \expenv {\cast \typ \exp} {\cast {\typ_1} {\exp_1}} {\typ_3} \less } +## Array Access Rule - \inferrule[TypeMember] - {\lookupEnv {\typMem \typ \name} = (\typ, \dir) } - {\expenv {\typMem \typ \name} {\typMem \typ \name} \typ \less } +The rule $\arrayAccessE$ states that expression $\arrayAccess {\exp_1} {\exp_2}$ +translates to $\arrayAccess {\prim {\exp_1}} {\prim {\exp_2}}$ +when $\exp_1$ has the array type $\arrayTyp \typ \size$ and $\exp_2$ has a numeric type. - \inferrule[ErrorMember] - {\lookupEnv {\errMem \name} = (\errTyp, \dir) } - {\expenv {\errMem \name} {\errMem \name} \errTyp \less } +- $\mathit{is\_X} (\typ)$ checks if the type $\typ$ is of the specific kind/type/structure $X$. +For example, $\isNumeric \typ$ +checks that the type $\typ$ is of numeric nature, that is, if it is fixed length signed or +unsigned integer or arbitrary precision integer. - \inferrule[ExpressionMember] - { \expenv \exp {\prim \exp} {\typ} \dir \\ - \prim \typ = \reduce \typ \\ - % \structTypDef = \prim \typ\\ - \fieldAccessEnv \ctxt {\prim \typ} {\pprim \typ} - } - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } +~ Begin InfRule - \inferrule[Ternary] - {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\ - \expenv {\exp_3} {\prim {\exp_3}} {\typ_2} {\dir_3}\\ - \typ_1 = \typ_2 \\ - \typ_1 \neq \integerTyp} - {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + \inferrule[\arrayAccessE] + {\expenv {\exp_1} {\prim {\exp_1}} {\arrayTyp \typ \size} \dir \\ + \expenv {\exp_2} {\prim {\exp_2}} {\prim \typ} {\prim \dir} \\ + % \isArray {\arrayTyp \typ \size} \\ + \isNumeric {\prim \typ}} + {\expenv {\arrayAccess {\exp_1} {\exp_2}} {\arrayAccess {\prim {\exp_1}} {\prim {\exp_2}}} \typ \dir } - % \inferrule[ Ternary(AllowedInP4ButNotePetr4)] - % {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ - % \expenv {\exp_2} {\prim {\exp_2}} {\integerTyp} {\dir_2} \\ - % \expenv {\exp_3} {\prim {\exp_3}} {\integerTyp} {\dir_3}\\ - % % \typ_1 = \typ_2 \\ - % % \typ_1 \eq \integerTyp \\ - % \compTimeKnown {\exp_1}} - % {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } +~ End InfRule +## Bit String Access (Slice) Rule - \inferrule[FunctionCall] - { - \resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret} \\ - % \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}}\\ - \overline {\prim \typ} = \trans \typs \emp \\ - % \match \params \args\\ - |\typs| = |\typVars|\\ - \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ - {\prim \typ}_{\ret} = \sat {\typ_\ret} \\ - \overline {\param = \pprim {\maybe \exp}} = \matchParArg \params \args\\ - \inferTypParArg {\typ_\ret} {\overline {\typVar : \prim \typ}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}\\ - \validatePars {\params} {\addTypEnvv {\overline {\typVar : \pprim \typ}} } \kind \\ - \overline {\param = \maybe {(\ppprim \exp, \ppprim \typ, \dir)}} = \castParArg {\overline {\param = \pprim {\maybe \exp}}}\\ - \callOK \ctxt \kind - } - { \expenv {\funcCall \exp \typs \args} {\funcCall {\prim \exp} {\overline {\pprim \typ}} {\overline{\maybe {(\ppprim \exp, \ppprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } +The rule $\bitStringAccessE$ states that accessing $\exp_2$ to $\exp_1$ from the bit string $\exp_1$ translates to accessing $\int_1$ to $\int_2$ from the bit string $\prim {\exp_1}$ which has the type bit string of length $\int_2 - \int_1$ if $\exp_1$ either has the type $\bitWidthTyp \width$ or $\intWidthTyp \width$ and both expressions $\exp_2$ and $\exp_3$ are of numeric types under the $\cte$ context and their values can be known at the compile time and the values respectively are $\int_1$ and $\int_2$. It only makes sense that when slicing (accessing) a bit string, the start $\int_1$ must be smaller than or equal to the end of access $\int_2$ and both must be smaller than the length of the bit string $\width$. - \inferrule[AnonymousInstantiation] - { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } - { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} +- $\sat \typ$ satuarates a type, that is, it eliminates all type references in type +$\typ$ and replaces them with the type they refer to. Thus, the result of saturation +contains no _TypeName_ constructors that are used to give a name to a new type. +- ```$\reduce \typ $ saturates the type $\typ$ ... **TODO** (reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match..)``` +- ```$\compileTimeEval \exp$ **TODO**``` - \inferrule[AnonymousInstatnt2] - { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} - { \expenv {\instantiation {\name} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir } +~ Begin InfRule - \inferrule[Mask] + \inferrule[\bitStringAccessE] {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) \\ - \textOr - \left( \so {\typ_1 = \typ_2 = \integerTyp} {\typ = \integerTyp}\right) \\ - \textOr - \left( \so {\typ_1 = \bitWidthTyp \width, \typ_2 = \integerTyp} {\typ = \bitWidthTyp \width}\right) \\ - \textOr - \left( \so {\typ_1 = \integerTyp, \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) + \reduce {\typ_1} = \intWidthTyp \width \textOr \bitWidthTyp \width\\ + \expenvWithCtxt \cte {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + \isNumeric {\sat {\typ_2}} \\ + \int_1 = \compileTimeEval {\prim {\exp_2}} \\ + \expenvWithCtxt \cte {\exp_2} {\prim {\exp_3}} {\typ_3} {\dir_3} \\ + \isNumeric {\sat {\typ_3}} \\ + \int_2 = \compileTimeEval {\prim {\exp_3}} \\ + 0 \leq \int_1 < \width \\ + \int_1 \leq \int_2 < \width } - {\expenv {\mask {\exp_1} {\exp_2}} {\mask {\prim \exp_1} {\prim \exp_2}} {\setTyp \typ} \less } + {\expenv {\bitStringAccess {\exp_1} {\exp_2} {\exp_3}} {\bitStringAccess {\prim {\exp_1}} {\pprim {\exp_2}} {\pprim {\exp_3}}} {\bitStringTyp {\int_2 - \int_1}} {\dir_1} } - \inferrule[Range] - { \expenv \low {\prim \low} \typ {\dir_\low} \\ - \expenv \high {\prim \high} \typ {\dir_\high} \\ - \typ_\low = \typ_\high = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} - { \expenv {\range \low \high} {\range {\prim \low} {\prim \high}} {\setTyp \typ} \dir } +~ End InfRule +## List Constructor Rule -\end{mathpar} -~~ -~ +The rule $\listE$ ... -### Petr4 Restrictions Compared to P4 Spec { #sec-exp-restrictions } -Petr4 does not support all features of P4. This section gathers Petr4's restriction for -expressions: +~ Begin InfRule -- Petr4 doesn't support the case where both the -true and the false expressions have the infinite precision integer type when the -condition can be evaluated at compilation time. However, this is allowed by P4 spec. -- Petr4 doesn't have the product operation where multiple sets can be combined using -cartesian product and the type of a product of sets is a set of tuples. (refer to -section 8.12.5. of P4 spec (**DISCUSS**)) + \inferrule[\listE] + {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} + {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\exp_1, \ldots, \exp_n}} {\listTyp {\typ_1} {\typ_n}} \less } + \inferrule[\recordE] + {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } + {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } -### Petr4 Discrepencies with P4 Spec { #sec-exp-discrepencies } -This section documents the discrepencies of Petr4 with P4 spec: +~ End InfRule -- P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) -- P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) -- P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) -- P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) -- P4 spec states that all expressions of type int MUST be compile-time known values but -Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) +## Unary Operations Rules + +~ Begin InfRule + + \inferrule[\logicalNegE] + { \expenv \exp {\prim \exp} \boolTyp \dir } + { \expenv {!\exp} {!\prim \exp} \boolTyp \dir } + + \inferrule[\bitwiseComplementE] + { \expenv \exp {\prim \exp} \typ \dir \\ + \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} + { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\typ} \dir } + + \inferrule[\unaryMinusE] + { \expenv \exp {\prim \exp} \typ \dir \\ + \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp} + { \expenv {-\exp} {-\prim \exp} {\intWidthTyp \width} \dir } -### Side Notes { #sec-exp-note } -There are also small differencies between P4 and Petr4's terminologies: +~ End InfRule -- Petr4 calls field access for structs _expression member_. +## Binary Operations Rules -For ease of understanding, we provide notes that help the reader understand some of -the differences of Petr4 and P4 spec that may seem as discrepencies in the first glance: +~ Begin InfRule -- It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. + \inferrule[\binaryOpsE] + {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}} {\prim {\exp_2}} \\ + \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } + { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } +~ End InfRule ### Coerce Binary Operation Arguments Auxiliary Judgment { #sec-coerce-bin-args } Let implicitCast typ typ be defined as follows to describe P4's implicit @@ -561,29 +916,36 @@ casting behavior on operands in binary expressions: cast typ exp produces a cast expression if the type of exp is different from the type typ. -The restJ rule stands for all other binary operations. +The restJ rule stands for all other binary operations. + +- The [coerce binary operation's arguments auxiliary judgment][#sec-coerce-bin-args] +allows the operands of a binary operation to be casted to another type when applicable. +It has the judgment form +$\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ +which statees that under environment $\env$ and context $\ctxt$ +the expression $\exp$ written in the surface syntax has +two operands $\exp_1$ and $\exp_2$ in the IR with types and directions +$\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have +resulted from casting. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRuleHelper - \inferrule[ShiftRight] + \inferrule[\shiftRAE] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} { \coerceBinArgsEnv {\exp_1 \shiftR \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - \inferrule[ShiftLeft] + \inferrule[\shiftLAE] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - \inferrule[BitConcatenation] + \inferrule[\bitConcatAE] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} { \coerceBinArgsEnv {\exp_1 \concat \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - \inferrule[Rest] + \inferrule[\restAE] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ \typ = \implicitCast {\typ_1} {\typ_2} \\ @@ -591,9 +953,7 @@ The restJ rule stands for all other binary operations. \pprim {\exp_2} = \cast \typ {\prim {\exp_2}}} { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}, {\typ_1}, {\dir_1}} {\pprim {\exp_2}, {\typ_2}, {\dir_2}} } -\end{mathpar} -~~ -~ +~ End InfRuleHelper ### Binary Operation Auxiliary Judgment { #sec-bin-op } reduce enums removes all the enums recursively after reducing a type. @@ -603,10 +963,15 @@ is nonneg and is pos evaluate an expression at compile time and check if it's a compile time known determinez if the value of an expression can be known at compile time. it returns true for externs, packages, controls, and parsers.. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +- The [binary operation judgment][#sec-bin-op] confirms that an expression using a +binary operation follows the constraints of that binary operation. For example, if +an expression is checking the equality of two subexpression it checks that both +subexpression are of a type that equality is meaningful for it. It has the judgment +form $\binOpEnv \exp \typ \dir $ which states that the expression $\exp$ +written in the IR is well-typed (that is, it follows all the restrictions applied to the +binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. + +~ Begin InfRuleHelper \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] { \typ_1 = \reduceEnums {\exp_1} \\ @@ -677,9 +1042,22 @@ compile time known determinez if the value of an expression can be known at comp \textOr \left( \typ_1 = \integerTyp, \compTimeKnown {\exp_2} \right) } { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } -\end{mathpar} -~~ -~ +~ End InfRuleHelper + +## Cast Rule + +~ Begin InfRule + + \inferrule[\castE] + { \expenv \exp {\exp_1} {\typ_1} \dir \\ + \typ_2 = \sat {\typ_1} \\ + \typ_3 = \trans {\typ_2} {\emp} \\ + \typ_4 = \sat {\typ_3} \\ + \typWellFormed {\typ_3} \\ + \explicitCastOK {\typ_1} {\typ_3}} + { \expenv {\cast \typ \exp} {\cast {\typ_1} {\exp_1}} {\typ_3} \less } + +~ End InfRule ### Cast Auxiliary Judgment { #sec-cast } The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. @@ -688,17 +1066,21 @@ we use subscription of e or i to indicate if a rule only applies for explicit or P4 spec specifies casts up to Sets rule. The rest might be stated throughout the spec but I haven't found them yet. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +- The [casting auxiliary judgment][#sec-cast] defines rules for implicitly +and/or explicitly casting one type to another. Sepcifically, the judgment +$\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$ +the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. +However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only +done implicitly or explicitly, respectively. + +~ Begin InfRuleHelper \inferrule[Bit<1>ToBool] - { } + {} { \explCast {\bitWidthTyp 1} \boolTyp } \inferrule[BoolToBit<1>] - { } + {} { \explCast \boolTyp {\bitWidthTyp 1} } \inferrule[UnsignedIntToSigned] @@ -710,7 +1092,7 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the { \explCast {\intWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[UnsignedIntToUnsignedInt-Explicit] - { } + {} { \explCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[UnsignedIntToUnsignedInt-Implicit] @@ -718,7 +1100,7 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the { \implCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[SignedIntToSignedInt-Explicit] - { } + {} { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} \inferrule[SignedIntToSignedInt-Implicit] @@ -778,62 +1160,62 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the { \castenv \ {\listTyps {\typs_1} } {\tupleTyps {\typs_2}}} \inferrule[ListToHeader-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} \inferrule[ListToHeader-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} \inferrule[ListToStruct-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} \inferrule[ListToStruct-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} \inferrule[RecordToHeader-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\headerTypp 1 n}} \inferrule[RecordToHeader-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\headerTypp 1 n}} \inferrule[RecordToStruct-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\structTypp 1 n}} \inferrule[RecordToStruct-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\structTypp 1 n}} \inferrule[HeaderToHeader-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\explCast {\headerTyp 1 n } {\headerTypp 1 n}} \inferrule[HeaderToHeader-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\implCast {\headerTyp 1 n } {\headerTypp 1 n}} \inferrule[StructToStruct-Explicit] - {(1 \leq i \leq n; \explCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} {\explCast {\structTyp 1 n } {\structTypp 1 n}} \inferrule[StructToStruct-Implicit] - {(1 \leq i \leq n; \implCast {\typ_i} {\prim {\typ_i}}) \textOr + {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} {\implCast {\structTyp 1 n } {\structTypp 1 n}} @@ -841,10 +1223,29 @@ P4 spec specifies casts up to Sets rule. The rest might be stated throughout the { \typ_1 == \typ_2} {\implCast {\typ_1} {\typ_2}} -\end{mathpar} -~~ -~ +~ End InfRuleHelper + +## Membership Rules + +~ Begin InfRule + + \inferrule[\typeMemE] + {\lookupEnv {\typMem \typ \name} = (\typ, \dir) } + {\expenv {\typMem \typ \name} {\typMem \typ \name} \typ \less } + + \inferrule[\errMemE] + {\lookupEnv {\errMem \name} = (\errTyp, \dir) } + {\expenv {\errMem \name} {\errMem \name} \errTyp \less } + + \inferrule[\expMemE] + { \expenv \exp {\prim \exp} {\typ} \dir \\ + \prim \typ = \reduce \typ \\ + % \structTypDef = \prim \typ\\ + \fieldAccessEnv \ctxt {\prim \typ} {\pprim \typ} + } + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } +~ End InfRule ### Field Access Builtin Methods Auxiliary Judgment { #sec-exp-mem-builtin } @@ -855,10 +1256,15 @@ array but it has already patterned matched on the type of the expression to be e struct, header, header union, specilaized, or extern. Thus, the _None_ case would always fail. what's the correct expected behavior here? -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +- The [expression memeber builtin judgment][#sec-exp-mem-builtin] is a helper judgment +for expression member (field access) rule. +It has the form $\fieldAccessEnv \ctxt \exp \typ {\prim \typ}$ +which states that under environment $\env$ and context $\ctxt$, the field $\name$ +has the type $\prim \typ$ in the expression $\exp$ of type $\typ$. +Note that $\exp$ has to be an expression +that contains fields, such as a struct or a header. + +~ Begin InfRuleHelper \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion] { @@ -866,7 +1272,7 @@ fail. what's the correct expected behavior here? % \structTypDef = \reduce \typ \\ % \structTypDef = \prim \typ\\ (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ - \exists 1 \leq i \leq n+1; \field_i = \name + \exists 1 \leq i \leq n+1. \field_i = \name } { \fieldAccessEnv \ctxt \structTypDef {\typ_i} } @@ -878,7 +1284,7 @@ fail. what's the correct expected behavior here? % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ % \isArray \typ \\ \name = \sizeFlag \textOr \lastIndex\\ - \nexists 1 \leq i \leq n; \field_i = \name + \nexists 1 \leq i \leq n. \field_i = \name } { \fieldAccessEnv \ctxt {\arrayTyp \typ \size AND \ \structTypDef} {\bitWidthTyp {32}} } @@ -891,7 +1297,7 @@ fail. what's the correct expected behavior here? % \isArray {\reduce \typ} \\ % \arrayTyp {\prim \typ} \size = \typ\\ \name = \sizeFlag \textOr \lastIndex \\ - \nexists 1 \leq i \leq n; \field_i = \name + \nexists 1 \leq i \leq n. \field_i = \name } { \fieldAccessEnv \parserCtxt {\arrayTyp \typ \size AND \ \structTypDef} \typ } @@ -952,208 +1358,239 @@ fail. what's the correct expected behavior here? % { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } -\end{mathpar} -~~ -~ +~ End InfRuleHelper + +## Ternary Rule + +~ Begin InfRule + + \inferrule[\ternaryE] + {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\ + \expenv {\exp_3} {\prim {\exp_3}} {\typ_2} {\dir_3}\\ + \typ_1 = \typ_2 \\ + \typ_1 \neq \integerTyp} + {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + + % \inferrule[ Ternary(AllowedInP4ButNotePetr4)] + % {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ + % \expenv {\exp_2} {\prim {\exp_2}} {\integerTyp} {\dir_2} \\ + % \expenv {\exp_3} {\prim {\exp_3}} {\integerTyp} {\dir_3}\\ + % % \typ_1 = \typ_2 \\ + % % \typ_1 \eq \integerTyp \\ + % \compTimeKnown {\exp_1}} + % {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + +~ End InfRule + +## Function Call Rule + +~ Begin InfRule + + \inferrule[\funcCallE] + { + \resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret} \\ + % \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}}\\ + \overline {\prim \typ} = \trans \typs \emp \\ + % \match \params \args\\ + |\typs| = |\typVars|\\ + \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ + {\prim \typ}_{\ret} = \sat {\typ_\ret} \\ + \overline {\param = \pprim {\maybe \exp}} = \matchParArg \params \args\\ + \inferTypParArg {\typ_\ret} {\overline {\typVar : \prim \typ}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}\\ + \validatePars {\params} {\addTypEnvv {\overline {\typVar : \pprim \typ}} } \kind \\ + \overline {\param = \maybe {(\ppprim \exp, \ppprim \typ, \dir)}} = \castParArg {\overline {\param = \pprim {\maybe \exp}}}\\ + \callOK \ctxt \kind + } + { \expenv {\funcCall \exp \typs \args} {\funcCall {\prim \exp} {\overline {\pprim \typ}} {\overline{\maybe {(\ppprim \exp, \ppprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } +~ End InfRule ### Function Call Auxiliary Judgment { #sec-func-call } -### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } +This judgment carries out the main details of the $\funcCallE$ rule. -## Type Related Judgments { #sec-types-typing } +The helpers used are: -### Type Well-Formed Auxiliary Judgment { #sec-type-well-formed } -it saturates all types first and then checks well-formedness. for breviety, we don't -include the saturation in rules. -is valid nested type outer inner checks whether the nested type is taking valid types in its inner and outer type based on P4's description of type nesting rules section 7.2.7 (provide link). -insert type var adds a type variable to the env. -lookup extern in env returns an externMethods type which includes a list of strings as -type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. -getTypeParams get type parameters from types that have type parameters including package, control, parser, function, and it's equivalent to look up for extern. +- Remember that parameters could be optional or have some default expression set as their expression. $\removeOptionalPars \params$ removes those parameters. +- $\concatList$ denotes concatenating two lists, in this case two lists of parameters. -names to type env. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +Concerns/questions: - \inferrule[Bool] - { } - { \typWellFormed \boolTyp } +- when does the expression typing returns an expression of type action (the $\nameActionE$ rule may never be trigured)? - \inferrule[String] - { } - { \typWellFormed \stringTyp } +- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1) it checks +if the expression $\exp$ called from the function call is a ...; +2) it checks if the expression $\exp$ either has a function type or an action typ, and if so it returns the type parameteres, parameters, kind, and return type; +and 3) it resolves function overload. +It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function call with arguments $\args$ under environment $\env$ and context $\ctxt$ translates to expressio $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\params$, kind $\kind$, and the return type $\typ_\ret$. + +~ Begin InfRuleHelper + + \inferrule[\nameFuncNameE] + { (\overline {\typ, \dir}) = \lookupEnv \name \\ + \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } + { \resolveFuncOver \name {\argkvss 1 n} \typParams {\pars 1 n} \kind {\typ_\ret} \dir } + + \inferrule[\nameFuncCountE] + { (\overline {\typ, \dir}) = \lookupEnv \name \\ + \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ + |\removeOptionalPars \params| = n} + { \resolveFuncOver \name {\argexpss 1 n} \typParams \params \kind {\typ_\ret} \dir} + + \inferrule[\nameActionE] + { \expenv \name \exp {\actionTyp {\params_1} {\params_2}} \dir \\ + \params = \params_1 \concatList \params_2} + {\resolveFuncOver \name {\argkvss 1 n} \emp {\pars 1 n} \actionKind \voidTyp \dir} + % { (\overline {\typ, \dir}) = \lookupEnv \name \\ + % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \actionTyp {\pars 1 k} {\pars {k+1} n} } + % { \resolveFuncOver \name {\argkvss 1 n} \emp \params \actionKind \voidTyp \dir } + + % \inferrule[\nameActionCountE] + % { (\overline {\typ, \dir}) = \lookupEnv \name \\ + % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \actionTyp {\params_1} {\params_2}\\ + % \params = \params_1 \concatList \params_2 + % |\removeOptionalPars \params| = n} + % { \resolveFuncOver \name {\argexpss 1 n} \emp \params \actionKind \voidTyp \dir} + + \inferrule[\expMemFuncNameE] + { \expenv {\expMem \name \exp} {\prim \exp} {\typ} \dir\\ + \prim \typ = \reduce \typ \\ + } + {blah} - \inferrule[(InfinitPrecision)Integer] - { } - { \typWellFormed \integerTyp } + \inferrule[\expMemFuncCountE] + {} + {blah} - \inferrule[SignedInteger] - { 1 < \width} - { \typWellFormed {\intWidthTyp \width} } + \inferrule[\expMemActionNameE] + {} + {blah} - \inferrule[BitString(UnsignedInteger)] - { 0 \leq \width} - { \typWellFormed {\bitWidthTyp \width} } + \inferrule[\expMemActionCountE] + {} + {blah} - \inferrule[VarBit(DynamicallySizedBitString)] - { } - { \typWellFormed {\varBitTyp \width} } +~ End InfRuleHelper - \inferrule[Error] - { } - { \typWellFormed \errTyp} +### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } - \inferrule[Void] - { } - { \typWellFormed \voidTyp} - \inferrule[MatchKind] - { } - { \typWellFormed \matchKindTyp} +- The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function. It has the judgment form $\inferTypParArg {\typ_\ret} {\overline {\typVar : \typ}} {\overline {\param = {\maybe \exp}}} {\overline {\prim \typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}$ which states that the type parameters $\typVars$ have the type $\pprim \typ$ under environment $\env$ and context $\ctxt$ with the return type of $\typ_\ret$, the assignment of type parameters $\typVars$ to types $\typs$, the assignment of parameters $\params$ to optional expressions $\maybe \exp$, and constraints $fill\ later$. - \inferrule[Array] - { \typWellFormed \typ \\ - \isValidNestedTyp {\arrayTyp \typ \size} {\typ}} - { \typWellFormed {\arrayTyp \typ \size} } +## Anonymous Instantiation Rule - \inferrule[Tuple] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp {\tupleTyp {\typ_1} {\typ_n}} {\typ_i}} - { \typWellFormed {\tupleTyp {\typ_1} {\typ_n}} } +~ Begin InfRule - \inferrule[List] - { 1 \leq i \leq; \typWellFormed {\typ_i} \\ - 1 \leq i \leq; \isValidNestedTyp {\listTyp {\typ_1} {\typ_n}} {\typ_i}} - { \typWellFormed {\listTyp {\typ_1} {\typ_n}} } + \inferrule[\instE] + { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } + { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} - \inferrule[Set] - { \typWellFormed \typ } - { \typWellFormed {\setTyp \typ} } + \inferrule[\instE-2] + { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} + { \expenv {\instantiation {\name} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir } - \inferrule[EnumWithType] - { \typWellFormed \typ } - { \typWellFormed \enumTyp } +~ End InfRule - \inferrule[EnumWithoutType] - { } - { \typWellFormed \enumTypNoTyp } +## Mask Rule - \inferrule[Record] - { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \recordTypDef {\typ_i} \\ - 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \recordTypDef } +~ Begin InfRule - \inferrule[HeaderUnion] - { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \headerUnionTyp {\typ_i} \\ - % \noDup {\field_1, \ldots, \field_n}\\ - 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \headerUnionTyp } + \inferrule[\maskE] + {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) \\ + \textOr + \left( \so {\typ_1 = \typ_2 = \integerTyp} {\typ = \integerTyp}\right) \\ + \textOr + \left( \so {\typ_1 = \bitWidthTyp \width, \typ_2 = \integerTyp} {\typ = \bitWidthTyp \width}\right) \\ + \textOr + \left( \so {\typ_1 = \integerTyp, \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) + } + {\expenv {\mask {\exp_1} {\exp_2}} {\mask {\prim \exp_1} {\prim \exp_2}} {\setTyp \typ} \less } - \inferrule[Struct] - { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \structTypDef {\typ_i} \\ - 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \structTypDef } +~ End InfRule - \inferrule[Header] - { 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - 1 \leq i \leq n; \isValidNestedTyp \headerTypDef {\typ_i} \\ - 1 \leq i < j \leq n; \field_i \neq \field_j} - { \typWellFormed \headerTypDef } +## Range Rule - \inferrule[NewType(typedef)] - { \typWellFormed \typ } - { \typWellFormed {\newTypeTyp \typ \name} } +~ Begin InfRule -\end{mathpar} -~~ -~ + \inferrule[\rangeE] + { \expenv \low {\prim \low} \typ {\dir_\low} \\ + \expenv \high {\prim \high} \typ {\dir_\high} \\ + \typ_\low = \typ_\high = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} + { \expenv {\range \low \high} {\range {\prim \low} {\prim \high}} {\setTyp \typ} \dir } -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small - - \inferrule[SpecializedType] - { \prim \typ = \sat \typ \\ - \{\param_1, \ldots, \param_m \} = \getTypeParams {\prim \typ} \\ - % \prim \typ = \externTyp \name \\ - % ([\param_1, \ldots, \param_m], _)= \lookup \name \\ - 1 \leq i \leq n; \typWellFormed {\typ_i} \\ - n = m} - { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } +~ End InfRule - \inferrule[Package] - { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - 1 \leq i \leq n; \dir_i = \less \\ - 1 \leq i \leq n; \typWellFormed {\typ_i}} - { \typWellFormed {\packageTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} {\wildcardParam_1, \ldots, \wildcardParam_p}} } - \inferrule[Control] - { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} - { \typWellFormed {\controlTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } +Note the following notes: - \inferrule[Parser] - { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_i}} - { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } +- We use $\overline x$ to denote a list of $x$. +- For simplicity, we omit mapping a function on a list of elements. Instead, we just apply the function to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. - \inferrule[Extern] - { ([], {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n}} ) =\lookupEnv \name } - { \typWellFormed {\externTyp \name} } +There are multiple helper functions used in judgements that are explained below: - \inferrule[Function] - { \typWellFormed \typ \\ - \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } - % (x1,...,xn) {...} - { \typWellFormed {\funcTyp \typ {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n}} } +- $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the +compilation. It does so by evaluating the expression $\exp$ at compile time, if that is +possible then we know the value at compile time. Otherwise, if the expression $\exp$ is +a specialized type, extern, package, control, or parser but we cannot evaluate it at +compile time we still consider it known at compile time. +- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. +- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\validatePars \params \env \kind$ validates parameters $\params$ under the environment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). +- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). +- Did I miss anything else? - \inferrule[Action] - { i < j \\ - 1 \leq k \leq n; \typWellFormed {\typ_k} \\ - j \leq k \leq n; \dir_k = \less } - { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm j, \ldots, \prm n}} } - \inferrule[Constructor] - { \typWellFormed \typ \\ - \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ - 1 \leq i \leq n; \typWellFormedWithEnv {\prim \env} {\typ_n} } - { \typWellFormed {\constructorTyp \typ \name {\prm 1, \ldots, \prm n}} } +**NOTE**: I couldn't find the followings in section 8 of p4 spec: +array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). - \inferrule[Table] - { \typ = \lookupEnv \name } - { \typWellFormed {\tableTyp \name} } +```**TODO** explanation of some of the rules. start with a couple of simple ones (bool and name), then intermediate (biststringaccess, record, cast) and then complicated (function call, exp mem, instantiation). ``` - \inferrule[TypeName] - { \typ = \lookupEnv \name } - { \typWellFormed {\typNameTyp \name} } -% is_well_formed_type -\end{mathpar} -~~ -~ +### Petr4 Restrictions Compared to P4 Spec { #sec-exp-restrictions } +Petr4 does not support all features of P4. This section gathers Petr4's restriction for +expressions: + +- Petr4 doesn't support the case where both the +true and the false expressions have the infinite precision integer type when the +condition can be evaluated at compilation time. However, this is allowed by P4 spec. +- Petr4 doesn't have the product operation where multiple sets can be combined using +cartesian product and the type of a product of sets is a set of tuples. (refer to +section 8.12.5. of P4 spec (**DISCUSS**)) + + +### Petr4 Discrepencies with P4 Spec { #sec-exp-discrepencies } +This section documents the discrepencies of Petr4 with P4 spec: + +- P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) +- P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) +- P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) +- P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) +- P4 spec states that all expressions of type int MUST be compile-time known values but +Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) + +### Side Notes { #sec-exp-note } +There are also small differencies between P4 and Petr4's terminologies: -### Type Equality Judgment { #sec-type-eq } -**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. +- Petr4 calls field access for structs _expression member_. + +For ease of understanding, we provide notes that help the reader understand some of +the differences of Petr4 and P4 spec that may seem as discrepencies in the first glance: -## Statement's Typing Rules { #sec-stmt-typing } +- It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. + + +# Statement's Typing Rules { #sec-stmt-typing } this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. cast_expr takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. if void type returns a void type if a (or two) type is (are) void and otherwise returns a unit type. get enum typ takes a type and checks if it's an enum. if so it returns the enums of it. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRule \inferrule[Assignment] { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ @@ -1233,19 +1670,14 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums \dclenvv 0 \dcl {\prim \dcl} 1} { \stmtenvv 0 \dcl {\prim \dcl} \unitTyp 1 } -\end{mathpar} -~~ -~ +~ End InfRule -## Declaration's Typing Rules { #sec-decl-typing } +# Declaration's Typing Rules { #sec-decl-typing } is allowed type for variable checks if a type is allowed for declaring a variable. it includes all types after saturation except for string, integer, list, set, void, specialized type, package, control, parser, extern, function, action, constructor, and table. check parameter shadowing takes two lists of paramets and checks if there is any duplicate in them. -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRule \inferrule[Constant] { \prim \typ = \trans \typ \emp \\ @@ -1304,14 +1736,9 @@ check parameter shadowing takes two lists of paramets and checks if there is any { blah } { blah } -\end{mathpar} -~~ -~ +~ End InfRule -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRule \inferrule[Header] { blah } @@ -1353,14 +1780,9 @@ check parameter shadowing takes two lists of paramets and checks if there is any { blah } { blah } -\end{mathpar} -~~ -~ +~ End InfRule -~ Center {padding:1ex} -~~ Snippet -\begin{mathpar} - \small +~ Begin InfRule \inferrule[ControlType] { blah } @@ -1402,8 +1824,7 @@ check parameter shadowing takes two lists of paramets and checks if there is any % { } % { } -\end{mathpar} -~~ -~ +~ End InfRule + diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index b2de2d82a..cd945dbcf 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -1,3 +1,89 @@ +%rule names: +\newcommand{\rn}[1]{\TirName{#1}} +\newcommand{\rSep}{\rn{-}} +\newcommand*{\rE}{\rSep\rn{E}} +\newcommand*{\rAE}{\rSep\rn{AE}} +\newcommand*{\rT}{\rSep\rn{T}} +\newcommand*{\rS}{\rSep\rn{S}} +\newcommand*{\rAS}{\rSep\rn{AS}} +\newcommand*{\rD}{\rSep\rn{D}} +\newcommand*{\rAD}{\rSep\rn{AD}} + +\newcommand*{\ruleName}{\rn{RuleName}} +\newcommand*{\ruleNameE}{\ruleName\rE} +\newcommand*{\ruleNameAE}{\ruleName\rAE} +\newcommand*{\ruleNameT}{\ruleName\rT} +\newcommand*{\ruleNameS}{\ruleName\rS} +\newcommand*{\ruleNameD}{\ruleName\rD} + +\newcommand*{\boolT}{\rn{Bool}\rT} +\newcommand*{\stringT}{\rn{String}\rT} +\newcommand*{\intT}{\rn{(InfinitPrecision)Integer}\rT} +\newcommand*{\varbitT}{\rn{Varbit}\rT} +\newcommand*{\errT}{\rn{Error}\rT} +\newcommand*{\voidT}{\rn{Void}\rT} +\newcommand*{\matchKindT}{\rn{MatchKind}\rT} +\newcommand*{\enumOneT}{\rn{Enum}\rT} +\newcommand*{\intWidthT}{\rn{SignedInt}\rT} +\newcommand*{\bitWidthT}{\rn{BitString(UnsignedInteger)}\rT} +\newcommand*{\arrayT}{\rn{Array}\rT} +\newcommand*{\tupleT}{\rn{Tuple}\rT} +\newcommand*{\setT}{\rn{Set}\rT} +\newcommand*{\enumTwoT}{\rn{SerializableEnum}\rT} +\newcommand*{\recordT}{\rn{Record}\rT} +\newcommand*{\newTypeT}{\rn{NewType(typedef)}\rT} +\newcommand*{\specializedExternT}{\rn{SpecializedType}\rSep\rn{ExternBase}\rT} +\newcommand*{\specializedRestT}{\rn{SpecializedType}\rSep\rn{Rest}\rT} +\newcommand*{\packageT}{\rn{Package}\rT} +\newcommand*{\controlT}{\rn{Control}\rT} +\newcommand*{\externT}{\rn{Extern}\rT} +\newcommand*{\functionT}{\rn{Function}\rT} +\newcommand*{\actionT}{\rn{Action}\rT} +\newcommand*{\constructorT}{\rn{Constructor}\rT} +\newcommand*{\tableT}{\rn{Table}\rT} +\newcommand*{\typeNameT}{\rn{TypeName}\rT} + +\newcommand*{\boolE}{\rn{Bool}\rE} +\newcommand*{\stringE}{\rn{String}\rE} +\newcommand*{\integerE}{\rn{Integer}\rE} +\newcommand*{\bitStringE}{\rn{FixedLengthInt}\rE} +\newcommand*{\signedIntE}{\rn{SignedInt}\rE} +\newcommand*{\nameE}{\rn{Name}\rE} +\newcommand*{\arrayAccessE}{\rn{ArrayAccess}\rE} +\newcommand*{\bitStringAccessE}{\rn{BitStringAccess}\rE} +\newcommand*{\listE}{\rn{List}\rE} +\newcommand*{\recordE}{\rn{Record}\rE} +\newcommand*{\logicalNegE}{\rn{LogicalNegation}\rE} +\newcommand*{\bitwiseComplementE}{\rn{BitwiseComplement}\rE} +\newcommand*{\unaryMinusE}{\rn{UnaryMinus}\rE} +\newcommand*{\binaryOpsE}{\rn{BinaryOps}\rE} +\newcommand*{\castE}{\rn{cast}\rE} +\newcommand*{\typeMemE}{\rn{TypeMember}\rE} +\newcommand*{\errMemE}{\rn{ErrorMember}\rE} +\newcommand*{\expMemE}{\rn{ExpressionMember}\rE} +\newcommand*{\ternaryE}{\rn{Ternary}\rE} +\newcommand*{\funcCallE}{\rn{FunctionCall}\rE} +\newcommand*{\instE}{\rn{Instantiation}\rE} +\newcommand*{\maskE}{\rn{Mask}\rE} +\newcommand*{\rangeE}{\rn{Range}\rE} + +\newcommand*{\shiftRAE}{\rn{ShiftRight}\rAE} +\newcommand*{\shiftLAE}{\rn{ShiftLeft}\rAE} +\newcommand*{\bitConcatAE}{\rn{BitConcatenation}\rAE} +\newcommand*{\restAE}{\rn{Rest}\rAE} + + +%function call helper +\newcommand*{\nameFuncNameE}{\rn{NameExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByName}\rE} +\newcommand*{\nameFuncCountE}{\rn{NameExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByCount}\rE} +\newcommand*{\nameActionE}{\rn{NameExpression}\rSep\rn{ActionType}\rE} +%% \newcommand*{\nameActionNameE}{\rn{NameExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByName}\rE} +%% \newcommand*{\nameActionCountE}{\rn{NameExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByCount}\rE} +\newcommand*{\expMemFuncNameE}{\rn{ExpMemExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByName}\rE} +\newcommand*{\expMemFuncCountE}{\rn{ExpMemExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByCount}\rE} +\newcommand*{\expMemActionNameE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByName}\rE} +\newcommand*{\expMemActionCountE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByCount}\rE} + %stuff here and there: \renewcommand{\or}{\ | \ } \newcommand{\whereBulletIs}{,\textit{ where } \bullet \textit{ is }} @@ -14,12 +100,7 @@ \newcommand{\lookupEnv}[1]{\env({#1})} \newcommand{\emp}{[\ ]} \newcommand{\insertToEnv}[2]{\env, [{#1} : {#2} ]} -% separator -\newcommand{\rn}[1]{\TirName{#1}} -\newcommand{\rSep}{\rn{-}} - -\newcommand*{\rE}{\rSep\rn{E}} -\newcommand*{\restJ}{\rn{Rest}} +\newcommand{\insertToEnvv}[1]{\env, [{#1}]} %typing judgments: \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} @@ -110,16 +191,16 @@ \newcommand{\str}{s} \newcommand{\width}{w} \newcommand{\val}{v} -\newcommand{\bit}{\mathit{bit}} +\newcommand{\bit}{b} \renewcommand{\int}{n} \newcommand{\bitWidth}[2]{{#1}_{#2}} \newcommand{\intWidth}[2]{{#1}_{#2}} -\newcommand{\name}{\mathit{name}} +\newcommand{\name}{x} \newcommand{\var}{x} \newcommand{\typVar}{X} \newcommand{\typVars}{\overline \typVar} -\renewcommand{\array}{a} -\renewcommand{\index}{i} +%% \renewcommand{\array}{a} +%% \renewcommand{\index}{i} \newcommand{\arrayAccess}[2]{{#1}[{#2}]} \newcommand{\size}{n} \newcommand{\high}{h} @@ -131,9 +212,12 @@ \newcommand{\param}{x} \newcommand{\params}{\overline x} \newcommand{\prm}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} -\newcommand{\typParam}{X} +\newcommand{\typParam}{\typVar} \newcommand{\typParams}{\overline \typParam} +\newcommand{\pari}[1]{\dir_{#1} \typ_{#1} \typParam_{#1}} +\newcommand{\pars}[2]{\pari {#1}, \ldots, \pari {#2}} \newcommand{\wildcardParam}{w} +\newcommand{\wildcardParams}{\overline \wildcardParam} \renewcommand{\arg}{\mathit{arg}} \newcommand{\args}{\overline \arg} \newcommand{\stmt}{\mathit{stmt}} @@ -146,10 +230,12 @@ \newcommand{\ret}{\mathit{return}} \newcommand{\argexp}{\exp} \newcommand{\argexps}{\overline \argexp} -\newcommand{\argexpss}[1]{\argexp_{#1}} +\newcommand{\argexpi}[1]{\argexp_{#1}} +\newcommand{\argexpss}[2]{\argexpi {#1}, \ldots, \argexpi {#2}} \newcommand{\argkv}{\var = \exp} +\newcommand{\argkvi}[1]{\var_{#1}=\exp_{#1}} \newcommand{\argkvs}{\overline \argkv} -\newcommand{\argkvss}[1]{\var_{#1}=\exp_{#1}} +\newcommand{\argkvss}[2]{\argkvi {#1}, \ldots, \argkvi {#2}} \newcommand{\names}{\overline \name} %function helpers @@ -157,7 +243,7 @@ \newcommand{\addTypEnvv}[1]{\typEnv[{#1}]} \newcommand{\addConstEnv}[2]{\constEnv[{#1}={#2}]} \newcommand{\isNumeric}[1]{\mathit{is\_numeric}({#1})} -\newcommand{\isArray}[1]{\mathit{is\_array}({#1})} +%% \newcommand{\isArray}[1]{\mathit{is\_array}({#1})} \newcommand{\getEnum}[1]{\mathit{get\_enum}({#1})} \newcommand{\isConstant}[1]{\mathit{is\_constant} ({#1})} \newcommand{\isInstantiation}[1]{\mathit{is\_instantiation} ({#1})} @@ -195,6 +281,8 @@ \newcommand{\maybe}[1]{{#1}_{\bot}} \newcommand{\castParArg}[1]{\mathit{cast\_parameter\_argument}({#1})} \newcommand{\callOK}[2]{\mathit{call\_ok}({#1},{#2})} +\newcommand{\removeOptionalPars}[1]{\mathit{remove\_optional\_parameteres}({#1})} +\newcommand{\concatList}{++} %fields \newcommand{\isValid}{\mathit{isValid}} @@ -213,6 +301,7 @@ %kinds \newcommand{\builtin}{\mathit{builtin}} +\newcommand{\actionKind}{\mathit{action}} %types: \newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} @@ -234,20 +323,26 @@ \newcommand{\enumTyp}{\mathit{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\enumTypNoTyp}{\mathit{enum} \ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\recordTypDef}{\recordTyp 1 n} -\newcommand{\recordTyp}[2]{\mathit{record}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} -\newcommand{\recordTypp}[2]{\mathit{record}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} -\newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} -\newcommand{\headerTypDef}{\headerTyp 1 n} -\newcommand{\headerTyp}[2]{\mathit{header}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} -\newcommand{\headerTypp}[2]{\mathit{header}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} -\newcommand{\structTypDef}{\structTyp 1 n} -\newcommand{\structTyp}[2]{\mathit{struct}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} -\newcommand{\structTypp}[2]{\mathit{struct}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} -\newcommand{\newTypeTyp}[2]{\mathit{type}\ {#1}\ {#2}} +\newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\recordTypp}[2]{\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +\newcommand{\headerUnionTyp}[2]{\recordTyp {#1} {#2}} +\newcommand{\headerTyp}[2]{\recordTyp {#1} {#2}} +\newcommand{\structTyp}[2]{\recordTyp {#1} {#2}} +\newcommand{\headerTypp}[2]{\recordTypp {#1} {#2}} +\newcommand{\structTypp}[2]{\recordTypp {#1} {#2}} +\newcommand{\structTypDef}{\recordTypDef} +%% \newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} +%% \newcommand{\headerTypDef}{\headerTyp 1 n} +%% \newcommand{\headerTyp}[2]{\mathit{header}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +%% \newcommand{\headerTypp}[2]{\mathit{header}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +%% \newcommand{\structTypDef}{\structTyp 1 n} +%% \newcommand{\structTyp}[2]{\mathit{struct}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +%% \newcommand{\structTypp}[2]{\mathit{struct}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +\newcommand{\newTypeTyp}[2]{{#1}\ {#2}} \newcommand{\funcTyp}[3]{\mathit{function}\ {#1}<{#2}> ({#3})} %kind.type param. param. return type. \newcommand{\funcType}[4]{\mathit{function}\ {#1}<{#2}> ({#3})\rightarrow {#4}} -\newcommand{\constructorTyp}[3]{{#1}\ {#2}\ ({#3}, \_)} +\newcommand{\constructorTyp}[4]{{#1}\ {#2}\ <{#3}>\ ({#4}, \_)} \newcommand{\externTyp}[1]{\mathit{extern} \ {#1}} \newcommand{\spcTyp}[2]{{#1}<{#2}>} \newcommand{\parserTyp}[2]{\mathit{parser}<{#1}>({#2})} @@ -261,6 +356,6 @@ %directions: \newcommand{\less}{\mathit{directionless}} \newcommand{\dir}{d} -\renewcommand{\in}{\mathit{in}} +\newcommand{\inDir}{\mathit{in}} \newcommand{\out}{\mathit{out}} \newcommand{\inout}{\mathit{in\_out}} From c7fd06f3e1236b2da7032fc85f1a389c1322d012 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 28 Jun 2022 12:12:23 -0400 Subject: [PATCH 10/30] fix some typos --- docs/petr4spec/Petr4-spec.mdk | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index b52b1b4c7..dd5ba672a 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -371,6 +371,7 @@ The type system conducts three tasks simultaneously: Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. We use the notation of $\overline {\mathit{something}}$ to denote a list of $\mathit{something}$s. +We also use an underscore (that is, $\_$) when we do not need to use some specific information returned by some helper in judgements. The following describes the metavariables used in this document: @@ -606,12 +607,14 @@ The rule $\specializedExternT$ states that the specialization of an extern type - Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. + +- $\lookupEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. - $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. ~ Begin InfRule \inferrule[\specializedExternT] - { ([\param_1, \ldots, \param_m], _)= \lookupEnv \name \\ + { ([\param_1, \ldots, \param_m], \_ )= \lookupEnv \name \\ 1 \leq i \leq n. \typWellFormed {\typ_i} \\ n = m} { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } @@ -678,7 +681,7 @@ This seems way too simple and loose.``` ~ Begin InfRule \inferrule[\externT] - { ([], _ ) =\lookupEnv \name } + { (\emp, \_ ) =\lookupEnv \name } { \typWellFormed {\externTyp \name} } ~ End InfRule @@ -728,6 +731,8 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re A table type is well-formed under an environment if it exists in the environment. +- Looking up type variables returns the type assigned to it. + ~ Begin InfRule \inferrule[\tableT] From 543fc6e12ac1188c2573c478f9ecfdbc9a4991df Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 6 Jul 2022 15:58:23 -0400 Subject: [PATCH 11/30] only 4 exp left --- docs/petr4spec/Makefile | 6 - docs/petr4spec/Petr4-spec.mdk | 495 ++++++++++++++++++++-------------- docs/petr4spec/ops.tex | 30 ++- lib/checker.ml | 1 + 4 files changed, 314 insertions(+), 218 deletions(-) diff --git a/docs/petr4spec/Makefile b/docs/petr4spec/Makefile index af5cf6272..4990621ce 100644 --- a/docs/petr4spec/Makefile +++ b/docs/petr4spec/Makefile @@ -1,12 +1,6 @@ SPEC=Petr4-spec -all: build/${SPEC}.pdf - -build/${SPEC}.pdf: ${SPEC}.mdk - madoko --pdf -vv --odir=build $< - -build/${SPEC}.pdf: grammar.mdk p4.json html: ${SPEC}.mdk grammar.mdk p4.json madoko -vv --odir=build $< diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index dd5ba672a..70e506d69 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -370,8 +370,10 @@ The type system conducts three tasks simultaneously: Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. -We use the notation of $\overline {\mathit{something}}$ to denote a list of $\mathit{something}$s. -We also use an underscore (that is, $\_$) when we do not need to use some specific information returned by some helper in judgements. +- $\overline x$ denotes a list of $x$. +- For simplicity, we omit mapping a function/judgment on a list of elements. Instead, we just apply the function/judgment to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. +- An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgements. +- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. The following describes the metavariables used in this document: @@ -381,6 +383,8 @@ The following describes the metavariables used in this document: | $\bool$ | booleans | | $\str$ | strings | | $\int$ | arbitrary length integer | +| $\width$ | width of a data structure | +| $\size$ | size of a data structure | | $\bitWidth \bit \width$ | fixed length integer | | $\intWidth \int \width$ | signed integer | | $\name$ | strings represing any kinds of names | @@ -421,7 +425,10 @@ This judgment checks if a type is well-formed. Note that this judgment is define It has the form $\typWellFormed \typ$ which states that the type $\typ$ is well-formed under the environment $\env$, that is, the type is syntactically correct. -All typing rules first saturate all types and then checks well-formedness. +All typing rules first saturate all types, +that is, it eliminates all type references in type +$\typ$ and replaces them with the type they refer to. Thus, the result of saturation +contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. Then it checks the well-formedness of the saturated type. For breviety, we don't include the saturation in rules. ### Base Types { #sec-base-t } @@ -757,7 +764,8 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the ```**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. ``` - The [type equality judgment][#sec-type-eq] checks the equality of two types. It has -the form $\typEqEnv {\typ_1} {\typ_2}$ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$. +the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. + # Expression's Typing Rules { #sec-exp-typing } @@ -770,7 +778,19 @@ between the two. ```**TODO** We plan to add the abstract syntax of them in appendix later.``` -## Boolean, String, and Integer Constructor Rules +``**Restriction**`` +Petr4 doesn't have the product operation where multiple sets can be combined using +cartesian product and the type of a product of sets is a set of tuples. (refer to +section 8.12.5. of P4 spec (**DISCUSS**)) + +``**NOTE**`` +I couldn't find the followings in section 8 of p4 spec: +array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). + + +## Boolean, String, and Integer Constructor Rules { #sec-base-const-e } + +Base constructors such as boolean, string, and all integer constructors simply construct values of their type. The rule $\boolE$ states that a boolean expression in surface syntax has the type $\boolTyp$, it translates to the same boolean expression in the IR syntax, and has the $\less$ direction. The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar to $\boolE$. @@ -798,13 +818,13 @@ The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar ~ End InfRule -## Name Rule +## Name Rule { #sec-name-e } The rule $\nameE$ looks up the name of a variable from the environment and returns its type and direction. Note that if the environment doesn't contain the name the rule will fail. -- $\lookupEnv \name$ looks up a name in the environment and it returns its type and direction. When we only need the -type or the direction of the variable we simply ignore the other one. So you could see -formalization such as $\lookupEnv \name = \typ$ which states that we looked up variable +- When $\lookupEnv \name$ looks up a variable name in the environment, it returns its type and direction. When we only need the +type or the direction of the variable we simply ignore the other one by using an underscore for it. So you could see +formalization such as $\lookupEnv \name = (\typ, \_ )$ which states that we looked up variable $\name$ from the environment and we found out that its type is $\typ$. Similarly, the formalization $\lookupEnv \name = (\typ, \dir)$ states that we looked up variable $\name$ in the environment $\env$ and it has the type $\typ$ and direction $\dir$. @@ -817,8 +837,9 @@ $\name$ in the environment $\env$ and it has the type $\typ$ and direction $\dir ~ End InfRule -## Array Access Rule +## Array Access Rule { #sec-array-access-e } +$\arrayAccess {\exp_1} {\exp_2}$ denotes accessing the $\exp_2$^th^ element from the array $\exp_1$. The rule $\arrayAccessE$ states that expression $\arrayAccess {\exp_1} {\exp_2}$ translates to $\arrayAccess {\prim {\exp_1}} {\prim {\exp_2}}$ when $\exp_1$ has the array type $\arrayTyp \typ \size$ and $\exp_2$ has a numeric type. @@ -839,15 +860,17 @@ unsigned integer or arbitrary precision integer. ~ End InfRule -## Bit String Access (Slice) Rule +## Bitstring Access (Slice) Rule { #sec-bitstring-slice-e } +$\bitStringAccess {\exp_1} {\exp_2} {\exp_3}$ denotes slicing a the bitstring $\exp_1$ from bit $\exp_2$ to $\exp_3$. The rule $\bitStringAccessE$ states that accessing $\exp_2$ to $\exp_1$ from the bit string $\exp_1$ translates to accessing $\int_1$ to $\int_2$ from the bit string $\prim {\exp_1}$ which has the type bit string of length $\int_2 - \int_1$ if $\exp_1$ either has the type $\bitWidthTyp \width$ or $\intWidthTyp \width$ and both expressions $\exp_2$ and $\exp_3$ are of numeric types under the $\cte$ context and their values can be known at the compile time and the values respectively are $\int_1$ and $\int_2$. It only makes sense that when slicing (accessing) a bit string, the start $\int_1$ must be smaller than or equal to the end of access $\int_2$ and both must be smaller than the length of the bit string $\width$. -- $\sat \typ$ satuarates a type, that is, it eliminates all type references in type +- $\sat \typ$ satuarates a type. +Remember that saturating a type eliminates all type references in type $\typ$ and replaces them with the type they refer to. Thus, the result of saturation -contains no _TypeName_ constructors that are used to give a name to a new type. -- ```$\reduce \typ $ saturates the type $\typ$ ... **TODO** (reduce takes a type and saturates the type first and returns the base of a specialized type by removing all its type parameters as long as the number of type params and type args match..)``` -- ```$\compileTimeEval \exp$ **TODO**``` +contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. +- $\reduce \typ $ saturates the type $\typ$ saturates a type first and then applies the arguments to the parameters of a specialized type that its base has parameters. +- $\compileTimeEval \exp$ evaluates the expression $\exp$ at compile time and returns its value if $\exp$ is a well-typed expression. ~ Begin InfRule @@ -857,34 +880,67 @@ contains no _TypeName_ constructors that are used to give a name to a new type. \expenvWithCtxt \cte {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ \isNumeric {\sat {\typ_2}} \\ \int_1 = \compileTimeEval {\prim {\exp_2}} \\ - \expenvWithCtxt \cte {\exp_2} {\prim {\exp_3}} {\typ_3} {\dir_3} \\ + \expenvWithCtxt \cte {\exp_3} {\prim {\exp_3}} {\typ_3} {\dir_3} \\ \isNumeric {\sat {\typ_3}} \\ \int_2 = \compileTimeEval {\prim {\exp_3}} \\ 0 \leq \int_1 < \width \\ \int_1 \leq \int_2 < \width } - {\expenv {\bitStringAccess {\exp_1} {\exp_2} {\exp_3}} {\bitStringAccess {\prim {\exp_1}} {\pprim {\exp_2}} {\pprim {\exp_3}}} {\bitStringTyp {\int_2 - \int_1}} {\dir_1} } + {\expenv {\bitStringAccess {\exp_1} {\exp_2} {\exp_3}} {\bitStringAccess {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\bitStringTyp {\int_2 - \int_1}} {\dir_1} } ~ End InfRule ## List Constructor Rule -The rule $\listE$ ... +$\list {\exp_1, \ldots, \exp_n}$ constructs a list of expressions. +The rule $\listE$ states that under environment $\env$ and context $\ctxt$ +the list $\list {\exp_1, \ldots, \exp_n}$ translates to +$\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}$ in the IR and has the tuple type +${\listTyp {\typ_1} {\typ_n}}$ with direction $\less$ if each of its expressions $\exp_i \in \exps$ translate to $\prim {\exp_i}$ with type $\typ_i$ and direction $\dir_i$ under the same enviroment and context. + +The rule $\listAltE$ uses the notation of $\overline \exp$ instead of expanding the list. ~ Begin InfRule \inferrule[\listE] {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} - {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\exp_1, \ldots, \exp_n}} {\listTyp {\typ_1} {\typ_n}} \less } + {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}} {\listTyp {\typ_1} {\typ_n}} \less } + + \inferrule[\listAltE] + {\expenv {\exps} {\overline {\prim \exp}} {\typs} {\dirs}} + {\expenv {\list \exps} {\list {\overline {\prim \exp} }} {\listTyps \typ} \less } + +~ End InfRule + +## Record Constructor Rule + +${\record 1 n}$ denotes a record where $\exp_i$ is assigned to $\field_i$ for $1 \leq i \leq n$. +The rule $\recordE$ is similar to $\listE$ rule. + +~ Begin InfRule + + % \inferrule[\recordE] + % {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } + % {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } \inferrule[\recordE] - {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } - {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } + {\expenv {\exps} {\overline {\prim \exp}} {\typs} {\dirs}} + {\expenv {\records \exp} {\records {\prim \exp}} {\recordTyps} \less } ~ End InfRule ## Unary Operations Rules +The rule $\logicalNegE$ states that under the environment $\env$ and context $\ctxt$ +the expression $!\exp$ translates to the expression $!\prim\exp$ with the type $\boolTyp$ and direction $\dir$ if expression $\exp$ translates to $\prim\exp$ with type $\boolTyp$ and direction $\dir$ under the same environment and context. + +Rules $\bitwiseComplementE$ and $\unaryMinusE$ are similar to the rule $\logicalNegE$. +Additionally, they restrict the type of the $\exp$. + +``**Discrepency**`` +P4 spec states that all expressions of type int MUST be compile-time known values but +Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) + ~ Begin InfRule \inferrule[\logicalNegE] @@ -903,28 +959,18 @@ The rule $\listE$ ... ~ End InfRule -## Binary Operations Rules - -~ Begin InfRule +``**DISCREPENCY**`` - \inferrule[\binaryOpsE] - {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}} {\prim {\exp_2}} \\ - \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } - { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } +- P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) -~ End InfRule +## Binary Operations Rules -### Coerce Binary Operation Arguments Auxiliary Judgment { #sec-coerce-bin-args } -Let implicitCast typ typ be defined as follows to describe P4's implicit -casting behavior on operands in binary expressions: - -cast typ exp produces a cast expression if the type of exp is different from the -type typ. +- The operation $\oplus$ stands for all possible binary operations. -The restJ rule stands for all other binary operations. +The rule $\binaryOpsE$ uses two auxiliary judgments: - The [coerce binary operation's arguments auxiliary judgment][#sec-coerce-bin-args] -allows the operands of a binary operation to be casted to another type when applicable. +translates the operands from the surface syntax to the IR and when applicable, it allows the operands of a binary operation to be casted to another type. It has the judgment form $\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ which statees that under environment $\env$ and context $\ctxt$ @@ -932,6 +978,49 @@ the expression $\exp$ written in the surface syntax has two operands $\exp_1$ and $\exp_2$ in the IR with types and directions $\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have resulted from casting. +- The [binary operation judgment][#sec-bin-op] confirms that an expression using a +binary operation follows the constraints of that binary operation. For example, if +an expression is checking the equality of two subexpression it checks that both +subexpression are of a type that equality is meaningful for it. It has the judgment +form $\binOpEnv \exp \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}$ which states that the expression $\exp$ (that is written in the IR and has a binary operation applied to two operands with types $(\typ_1, \typ_2)$ and directions $(\dir_1,\dir_2)$) is well-typed (that is, it follows all the restrictions applied to the +binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. + +Having introduced the auxiliary judgments briefly, the rule $\binaryOpsE$ states that +under the environment $\env$ and context $\ctxt$, +the expression $\exp_1 \oplus \exp_2$ in surface syntax translates to the expression +$\prim {\exp_1} \oplus \prim {\exp_2}$ with type $\typ$ and direction $\dir$ if + +1. its operands $\exp_1$ and $\exp_2$ translate to $\prim {\exp_1}$ and $\prim {\exp_2}$, respectively, with corresponding types $\typ_1$, $\typ_2$ and directions $\dir_1$ and $\dir_2$ with potential casting when applicable +2. and the translated expressions $\prim {\exp_1}$ and $\prim {\exp_2}$ comply with the operation's restrictions. + +``**Discrepency**`` +P4 spec states that all expressions of type int MUST be compile-time known values but +Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) + +~ Begin InfRule + + \inferrule[\binaryOpsE] + {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}, \typ_1, \dir_1} {\prim {\exp_2}, \typ_2, \dir_2} \\ + \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } + +~ End InfRule + +### Coerce Binary Operation Arguments Auxiliary Judgment { #sec-coerce-bin-args } + +The rules $\shiftRAE$, $\shiftLAE$, and $\bitConcatAE$ are rather straight forward. +They only check if each operands can be translated to an expression in the IR. +The rule $\restAE$, which stands for all other binary operations. Additionally, +this rule checks if the type of one of the operands can implicitly be casted to the +other one and if so, it wraps the said operand in a cast constructor. + +- $\implicitCast {\typ_1} {\typ_2}$ denotes possible implicit casts between different kinds of integers and returns the type that the other type can be casted to. It is described below (Note that it follows P4's implicit +casting behavior and it is defined in more details in [cast auxiliary judgment][#sec-cast-helper].): + * $\implicitCast {\bitWidthTyp \width} \integerTyp = \bitWidthTyp \width$ + * $\implicitCast \integerTyp {\bitWidthTyp \width} = \bitWidthTyp \width$ + * $\implicitCast {\intWidthTyp \width} \integerTyp = \intWidthTyp \width$ + * $\implicitCast \integerTyp {\intWidthTyp \width} = \intWidthTyp \width$ +- $\cast \typ \exp$ generates a cast expression if the type of the expression $\exp$ is different from the type $\typ$. ~ Begin InfRuleHelper @@ -961,122 +1050,151 @@ resulted from casting. ~ End InfRuleHelper ### Binary Operation Auxiliary Judgment { #sec-bin-op } -reduce enums removes all the enums recursively after reducing a type. -in_or_dirless(typ1, typ2) retunrs direction of In if both typ1 and typ2 have In direction, o.w., it returns a directionless direction. -is true if and only if expression type t1 is equivalent to expression type t2 under environment env. Alpha equivalent types are equal. it takes the list of variables of the two types. -is nonneg and is pos evaluate an expression at compile time and check if it's a nonneg or pos numeric. -compile time known determinez if the value of an expression can be known at compile time. - it returns true for externs, packages, controls, and parsers.. -- The [binary operation judgment][#sec-bin-op] confirms that an expression using a -binary operation follows the constraints of that binary operation. For example, if -an expression is checking the equality of two subexpression it checks that both -subexpression are of a type that equality is meaningful for it. It has the judgment -form $\binOpEnv \exp \typ \dir $ which states that the expression $\exp$ -written in the IR is well-typed (that is, it follows all the restrictions applied to the +This judgment checks the restriction of each binary operation. +It has the judgment +form $\binOpEnv \exp \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} $ which states that the expression $\exp$ (that is written in the IR and has a binary operation applied to two operands with types $(\typ_1, \typ_2)$ and directions $(\dir_1,\dir_2)$) is well-typed (that is, it follows all the restrictions applied to the binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. +- $\reduceEnums \typ$ removes all the enums recursively from a type after reducing it. +- $\in_or_dirless {\dir_1} {\dir_2}$ retunrs the $\in$ direction if both directions $\dir_1$ and $\dir_2$ are $\in$, otherwise, it returns the $\less$ direction. +- $\typHasEq \typ$ checks if equality of two expressions from the type $\typ$ has been defined. Note that it first reduces the type $\typ$. +- $\nonNeg \exp$ and $\pos \exp$ evaluate an expression at compile time and check if it is a non-negative or positive number, respectively. +- $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the +compilation. It does so by evaluating the expression $\exp$ at compile time, if that is +possible then we know the value at compile time. Otherwise, if the expression $\exp$ is +a specialized type, extern, package, control, or parser but we cannot evaluate it at +compile time we still consider it known at compile time. + ~ Begin InfRuleHelper \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \boolTyp} - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } - - \inferrule[NumericOps($+, -, *$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width } - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } - - \inferrule[EqualityChecks($==, !=$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \typEq {\emp} {\typ_1} {\typ_2} \\ + { \reduceEnums {\typ_1} = \boolTyp \\ + \reduceEnums {\typ_2} = \boolTyp \\ + \dir = \inOrLess {\dir_1} {\dir_2} } + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } + + \inferrule[NumericOps($\ops=+, -, *$)] + { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ + \typ = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ + % \reduceEnums {\typ_2} = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ + \dir = \inOrLess {\dir_1} {\dir_2} + % \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width + } + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[EqualityChecks($\ops=\ ==, !=$)] + { \typEqEnv {\emp} {\reduceEnums {\typ_1}} {\reduceEnums {\typ_2}} \\ + % \typEq {\emp} {\typ_1} {\typ_2} \\ \typHasEq {\typ_1} } - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } - - \inferrule[OpSat($\plusSat,\subSat$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } - - \inferrule[BitwiseOps($\bitAnd, \bitOr, \bitXor, \bitComplement$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width} - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } + + \inferrule[OpSat($\ops = \plusSat,\subSat$)] + { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ + \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ + \dir = \inOrLess {\dir_1} {\dir_2}} + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[BitwiseOps($\ops=\bitAnd, \bitOr, \bitXor, \bitComplement$)] + { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ\\ + \typ = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ + \dir = \inOrLess {\dir_1} {\dir_2}} + { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} \inferrule[BitstringConcatenation] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \left( \so {\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ - \textOr \left( \so {\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right) } - { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir } - - \inferrule[ComparisonOps($<, \leq, >, \geq$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ + { \reduceEnums {\typ_1} = \prim {\typ_1} \\ + \reduceEnums {\typ_2} = \prim {\typ_2} \\ + \left( \so {\prim {\typ_1} = \bitWidthTyp {\width_1}, \prim {\typ_2} = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ + \textOr \left( \so {\prim {\typ_1} = \intWidthTyp {\width_1}, \prim {\typ_2} = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right)\\ + \dir = \inOrLess {\dir_1} {\dir_2}} + { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[ComparisonOps($\ops= <, \leq, >, \geq$)] + { \reduceEnums {\typ_1} = \prim {\typ_1} \\ + \reduceEnums {\typ_2} = \prim {\typ_2} \\ + \dir = \inOrLess {\dir_1} {\dir_2}\\ \left( \typ_1 = \typ_2 = \integerTyp \right) \\ - \textOr \left( \typ_1 = \typ_2 = \bitWidthTyp \width \right) \\ - \textOr \left( \typ_1 = \typ_2 = \intWidthTyp \width \right)} - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir } - - \inferrule[DivOps($\div, \mod$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ - \left( \so {\typ_1 = \typ_2 = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \\ - \textOr \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir } - - \inferrule[ShiftOps($\shiftL,\shiftR$)] - { \typ_1 = \reduceEnums {\exp_1} \\ - \typ_2 = \reduceEnums {\exp_2} \\ - \dir = \inOrLess {\typ_1} {\typ_2} \\ + \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \bitWidthTyp \width \right) \\ + \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \intWidthTyp \width \right) +} + { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[DivOps($\ops=\div, \mod$)] + { \reduceEnums {\typ_1} = \prim {\typ_1}\\ + \reduceEnums {\typ_2} = \prim {\typ_2}\\ + \left( \so {\prim {\typ_1} = \prim {\typ_2} = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \textOr \\ + \left( \so {\prim {\typ_1} = \prim {\typ_2} = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) \\ + \dir = \inOrLess {\dir_1} {\dir_2}} + { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[ShiftOps($\ops=\shiftL,\shiftR$)] + { + % \typ_1 = \reduceEnums {\typ_1} \\ + % \typ_2 = \reduceEnums {\typ_2} \\ \nonNeg {\exp_2} \\ - \left( \typ_1 = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ - \textOr \left( \typ_1 = \integerTyp, \compTimeKnown {\exp_2} \right) } - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ_1} \dir } + \left( \reduceEnums {\typ_1} = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ + \textOr \left( \reduceEnums {\typ_1} = \integerTyp, \compTimeKnown {\exp_2} \right)\\ + \dir = \inOrLess {\dir_1} {\dir_2}} + { \binOpEnv {\exp_1 \restOps \exp_2} {\reduceEnums {\typ_1}} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} ~ End InfRuleHelper -## Cast Rule +``**DISCREPENCY**`` + +- P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) +- P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) + +## Cast Rule { #sec-cast-e } + +The expression $\cast \typ \exp$ casts expression $\exp$ to type $\typ$. However, it is +not possible to cast an expression from every type to another type. Thus, the $\castE$ +rule states which casts are possible. Specifically, it states that the cast expression +$\cast \typ \exp$ translates to the expression $\cast {\typ_1} {\exp_1}$ in the IR with +the type $\typ_3$ and direction $\less$ if expression $\exp$ is translated to $\exp_1$, +the translation of type $\typ$ to types in the IR is well-formed, and the explicit cast +of the type of expression $\exp_1$ (that is, $\typ_1$) to the +translated type of casting type $\typ$ (that is, $\prim \typ$) is valid. + +- $\explicitCastOK {\typ_1} {\typ_2}$ is an auxiliary judgment for valid explicit cast +of types. +The [casting auxiliary judgment][#sec-cast-helper] defines rules for implicitly +and/or explicitly casting one type to another. Sepcifically, the judgment +$\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$ +the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. +However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only +done implicitly or explicitly, respectively. + +``**TODO**`` +The implementation saturates types both in the $\castE$ rule as well as saturating them +in the helper judgment. Fix this later. ~ Begin InfRule \inferrule[\castE] { \expenv \exp {\exp_1} {\typ_1} \dir \\ - \typ_2 = \sat {\typ_1} \\ - \typ_3 = \trans {\typ_2} {\emp} \\ - \typ_4 = \sat {\typ_3} \\ - \typWellFormed {\typ_3} \\ - \explicitCastOK {\typ_1} {\typ_3}} - { \expenv {\cast \typ \exp} {\cast {\typ_1} {\exp_1}} {\typ_3} \less } + % \typ_2 = \sat {\typ_1} \\ + \prim \typ = \trans {\typ} {\emp} \\ + % \pprim \typ = \sat {\prim \typ} \\ + \typWellFormed {\prim \typ} \\ + \explicitCastOK {\typ_1} {\prim \typ}} + % \explicitCastOK {\typ_2} {\pprim \typ}} + { \expenv {\cast \typ \exp} {\cast {\prim \typ} {\exp_1}} {\prim \typ} \less } ~ End InfRule -### Cast Auxiliary Judgment { #sec-cast } -The cast first saturates both types and then check if they can be explicitly casted. For simplicity, we omited the saturation from rules. -we use subscription of e or i to indicate if a rule only applies for explicit or implicit cast only, respecctively. o.w., the arrow doesn't have a subscription. +### Cast Auxiliary Judgment { #sec-cast-helper } +This auxiliary judgment states if casting of a type to another, either explicitly or implicitly or both, is valid. +The arrow subscription with $e$ or $i$ indicates if a rule only applies for explicit or implicit cast only, respecctively. Otherwise, the arrow does not have a subscription, +meaning that it applies for both explicit and implicit casts. +The cast first saturates both types and then checks if the cast is valid. For simplicity, we omited type saturations from the rules. +``**NOTE**`` P4 spec specifies casts up to Sets rule. The rest might be stated throughout the spec but I haven't found them yet. -- The [casting auxiliary judgment][#sec-cast] defines rules for implicitly -and/or explicitly casting one type to another. Sepcifically, the judgment -$\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$ -the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. -However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only -done implicitly or explicitly, respectively. +``**Discrepency**`` +P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) + ~ Begin InfRuleHelper @@ -1121,7 +1239,7 @@ done implicitly or explicitly, respectively. { \castenv \ \integerTyp {\intWidthTyp \width}} \inferrule[TypeDefs] - { (\typEq \emp {\typ_1} {\newTypeTyp \name {\typ_2}}) \textOr (\typEq \emp {\typ_2} {\newTypeTyp \name {\typ_1}})} + { (\typEqEnv \emp {\typ_1} {\newTypeTyp \name {\typ_2}}) \textOr (\typEqEnv \emp {\typ_2} {\newTypeTyp \name {\typ_1}})} { \castenv \ {\newTypeTyp \name {\typ_1}} {\newTypeTyp \name {\typ_2}}} \inferrule[TypeDefToType-Explicit] @@ -1141,96 +1259,98 @@ done implicitly or explicitly, respectively. { \implCast {\typ_1} {\newTypeTyp \name {\typ_2}}} \inferrule[Enums] - { \typEq \emp {\typ_1} {\typ_2}} + { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\enumTyp {\typ_2} {\name_2} {\names_2}}} \inferrule[EnumToUnderlyingType] - { \typEq \emp {\typ_1} {\typ_2}} + { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\typ_2}} \inferrule[TypeToEnumWithUndrlyingType] - { \typEq \emp {\typ_1} {\typ_2}} + { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\typ_1} {\enumTyp {\typ_2} {\name_2} {\names_2}}} \inferrule[Sets] - { \typEq \emp {\typ_1} {\typ_2}} + { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\setTyp {\typ_1}} {\setTyp {\typ_2}} } \inferrule[TypeToSet] - { \typEq \emp {\typ_1} {\typ_2}} + { \typEqEnv \emp {\typ_1} {\typ_2}} { \implCast {\typ_1} {\setTyp {\typ_2}}} \inferrule[ListToTuple] - { \typEq \emp {\tupleTyps {\typs_1}} {\tupleTyps {\typs_2}}} + { \typEqEnv \emp {\tupleTyps {\typs_1}} {\tupleTyps {\typs_2}}} { \castenv \ {\listTyps {\typs_1} } {\tupleTyps {\typs_2}}} \inferrule[ListToHeader-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} \inferrule[ListToHeader-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} \inferrule[ListToStruct-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} \inferrule[ListToStruct-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} + (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} \inferrule[RecordToHeader-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\headerTypp 1 n}} \inferrule[RecordToHeader-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\headerTypp 1 n}} \inferrule[RecordToStruct-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\structTypp 1 n}} \inferrule[RecordToStruct-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\recordTyp 1 n} {\recordTypp 1 n})} + (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\structTypp 1 n}} \inferrule[HeaderToHeader-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} + (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\explCast {\headerTyp 1 n } {\headerTypp 1 n}} \inferrule[HeaderToHeader-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\headerTyp 1 n} {\headerTypp 1 n})} + (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\implCast {\headerTyp 1 n } {\headerTypp 1 n}} \inferrule[StructToStruct-Explicit] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} + (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} {\explCast {\structTyp 1 n } {\structTypp 1 n}} \inferrule[StructToStruct-Implicit] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEq \emp {\structTyp 1 n} {\structTypp 1 n})} + (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} {\implCast {\structTyp 1 n } {\structTypp 1 n}} \inferrule[ID] - { \typ_1 == \typ_2} + { \typ_1 = \typ_2} {\implCast {\typ_1} {\typ_2}} ~ End InfRuleHelper -## Membership Rules +## Membership Rules { #sec-mem-e } + +- Petr4 calls field access for structs _expression member_. ~ Begin InfRule @@ -1388,6 +1508,12 @@ that contains fields, such as a struct or a header. ~ End InfRule +``**Restriction**`` +Petr4 doesn't support the case where both the +true and the false expressions have the infinite precision integer type when the +condition can be evaluated at compilation time. However, this is allowed by P4 spec. + + ## Function Call Rule ~ Begin InfRule @@ -1499,6 +1625,13 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ## Mask Rule +The expression $\mask {\exp_1} {\exp_2}$ denotes a masking expression where every 0 bit in $\exp_2$ is turned into don't care and the rest of the bits of expressions $\exp_1$ and $\exp_2$ are conjuncted. Thus, it returns a set of expressions: +$\mask {\exp_1} {\exp_2} = \{\exp_3 | \exp_1\ \&\ \exp_2 = \exp_3\ \&\ \exp_2 \}$. Thus, as +stated by the rule $\maskE$ both expressions $\exp_1$ and $\exp_2$ must have the same type of $\bitWidthTyp \width$, $\intWidthTyp \width$, or $\integerTyp$. + +``**ENSURE**`` +It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. So the mask operation can also operate on int or combination of int and bit. Similarly this applies to the range operation. + ~ Begin InfRule \inferrule[\maskE] @@ -1516,78 +1649,32 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ~ End InfRule -## Range Rule +## Range Rule { #sec-range-e } + +The expression $\range {\exp_1} {\exp_2}$ is a range expression and it returns the values between $\exp_1$ and $\exp_2$, inclusively. The rule $\rangeE$ states that the type of expression $\exp_1$ and $\exp_2$ must be the same and it must either be $\bitWidthTyp \width$ or $\intWidthTyp \width$ (and by extension of implicit cast of types it can also be $\integerTyp$). + +``**ENSURE**`` +p4 spec only states that the type can be bit or int but petr4 also allows integer. It's because of implicit cast, right? ~ Begin InfRule \inferrule[\rangeE] - { \expenv \low {\prim \low} \typ {\dir_\low} \\ - \expenv \high {\prim \high} \typ {\dir_\high} \\ - \typ_\low = \typ_\high = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} - { \expenv {\range \low \high} {\range {\prim \low} {\prim \high}} {\setTyp \typ} \dir } + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} + { \expenv {\range {\exp_1} {\exp_2}} {\range {\prim {\exp_1}} {\prim {\exp_2}}} {\setTyp {\typ_1}} \dir } ~ End InfRule -Note the following notes: - -- We use $\overline x$ to denote a list of $x$. -- For simplicity, we omit mapping a function on a list of elements. Instead, we just apply the function to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. - There are multiple helper functions used in judgements that are explained below: -- $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the -compilation. It does so by evaluating the expression $\exp$ at compile time, if that is -possible then we know the value at compile time. Otherwise, if the expression $\exp$ is -a specialized type, extern, package, control, or parser but we cannot evaluate it at -compile time we still consider it known at compile time. -- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. - $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. - $\validatePars \params \env \kind$ validates parameters $\params$ under the environment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). - $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. - $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). - Did I miss anything else? - -**NOTE**: I couldn't find the followings in section 8 of p4 spec: -array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). - -```**TODO** explanation of some of the rules. start with a couple of simple ones (bool and name), then intermediate (biststringaccess, record, cast) and then complicated (function call, exp mem, instantiation). ``` - - -### Petr4 Restrictions Compared to P4 Spec { #sec-exp-restrictions } -Petr4 does not support all features of P4. This section gathers Petr4's restriction for -expressions: - -- Petr4 doesn't support the case where both the -true and the false expressions have the infinite precision integer type when the -condition can be evaluated at compilation time. However, this is allowed by P4 spec. -- Petr4 doesn't have the product operation where multiple sets can be combined using -cartesian product and the type of a product of sets is a set of tuples. (refer to -section 8.12.5. of P4 spec (**DISCUSS**)) - - -### Petr4 Discrepencies with P4 Spec { #sec-exp-discrepencies } -This section documents the discrepencies of Petr4 with P4 spec: - -- P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) -- P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) -- P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) -- P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) -- P4 spec states that all expressions of type int MUST be compile-time known values but -Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) - -### Side Notes { #sec-exp-note } -There are also small differencies between P4 and Petr4's terminologies: - -- Petr4 calls field access for structs _expression member_. - -For ease of understanding, we provide notes that help the reader understand some of -the differences of Petr4 and P4 spec that may seem as discrepencies in the first glance: - -- It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. so the mask operation can also operate on int or combination of int and bit. similarly this applies to the range operation. - - # Statement's Typing Rules { #sec-stmt-typing } this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index cd945dbcf..e83edd249 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -52,6 +52,7 @@ \newcommand*{\arrayAccessE}{\rn{ArrayAccess}\rE} \newcommand*{\bitStringAccessE}{\rn{BitStringAccess}\rE} \newcommand*{\listE}{\rn{List}\rE} +\newcommand*{\listAltE}{\rn{List}\rSep\rn{Alt}\rE} \newcommand*{\recordE}{\rn{Record}\rE} \newcommand*{\logicalNegE}{\rn{LogicalNegation}\rE} \newcommand*{\bitwiseComplementE}{\rn{BitwiseComplement}\rE} @@ -101,17 +102,26 @@ \newcommand{\emp}{[\ ]} \newcommand{\insertToEnv}[2]{\env, [{#1} : {#2} ]} \newcommand{\insertToEnvv}[1]{\env, [{#1}]} +\newcommand{\suchThat}[2]{{#1} . \ {#2}} +%% \newcommand{\iLeqLeq}[2]{{#1} \leq i \leq {#2}. \ } %TODO: refactor 1 < i < n +%% \newcommand{\iLeqL}[2]{{#1} \leq i < {#2}. \ } +%% \newcommand{\iEqLeq}[2]{{#1} < i \leq {#2}. \ } +%% \newcommand{\iLL}[2]{{#1} < i < {#2}. \ } +%% \newcommand{\leqLeq}[3]{{#1} \leq {#2} \leq {#3}. \ } +%% \newcommand{\leqL}[3]{{#1} \leq {#2} < {#3}. \ } +%% \newcommand{\lLeq}[3]{{#1} < {#2} \leq {#3}. \ } +%% \newcommand{\lL}[3]{{#1} < {#2} < {#3}. \ } %typing judgments: \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} \newcommand{\expenv}[4]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3}, {#4}} \newcommand{\expenvv}[5]{\env_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} \newcommand{\expenvWithCtxt}[5]{\env, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} -\newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}; {#3})} -\newcommand{\binOpEnv}[3]{\env \vdash {#1} : {#2}, {#3}} +\newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}), ({#3})} +\newcommand{\binOpEnv}[7]{\env \vdash {#1}, ({#4}, {#5}), ({#6}, {#7}) : {#2}, {#3}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} -\newcommand{\typEqEnv}[2]{\env \vdash {#1}, {#2}} +\newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} %context. type of expression. type of returned name.exp \newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash \name, {#2} : {#3}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} @@ -139,7 +149,7 @@ \newcommand{\toplevel}{\mathit{TOPLEVEL}} %operators: -\newcommand{\mask}[2]{{#1} \&\&\& {#2}} +\newcommand{\mask}[2]{{#1}\ \&\&\&\ {#2}} \newcommand{\range}[2]{{#1}..{#2}} \newcommand{\ternary}[3]{{#1} ? {#2} : {#3}} \newcommand{\errMem}[1]{\mathit{error}.{#1}} @@ -178,6 +188,7 @@ %% \newcommand{\record}[2]{\{\field_{#1} = \exp_{#1}, \ldots, \field_{#2} = \exp_{#2}\}} \newcommand{\recordd}[3]{\{\field_{#1} = {#3}_{#1}, \ldots, \field_{#2} = {#3}_{#2}\}} \newcommand{\record}[2]{\recordd {#1} {#2} {\exp} } +\newcommand{\records}[1]{\{\overline {\field = {#1}} \}} %metavariables: @@ -208,6 +219,7 @@ \newcommand{\bitString}{bs} \newcommand{\bitStringAccess}[3]{{#1}[{#2}:{#3}]} \renewcommand{\exp}{\mathit{exp}} +\newcommand{\exps}{\overline {\exp}} \newcommand{\field}{f} \newcommand{\param}{x} \newcommand{\params}{\overline x} @@ -249,10 +261,10 @@ \newcommand{\isInstantiation}[1]{\mathit{is\_instantiation} ({#1})} \newcommand{\isVariable}[1]{\mathit{is\_variable} ({#1})} \newcommand{\compileTimeEval}[1]{\llbracket{#1}\rrbracket_\env} -\newcommand{\implicitCast}[2]{\implCast {#1} {#2}} -\newcommand{\reduceEnums}[1]{\mathit{reduce\_enums}({#1}.\typ)_\env} +\newcommand{\implicitCast}[2]{\mathit{implicit\_cast}({#1},{#2})} +\newcommand{\reduceEnums}[1]{\mathit{reduce\_enums}({#1})_\env} \newcommand{\inOrLess}[2]{\mathit{in\_or\_directionless}({#1},{#2})} -\newcommand{\typEq}[3]{{#2} ==_{\env,{#1}} {#3}} +%% \newcommand{\typEq}[3]{{#2} ==_{\env,{#1}} {#3}} \newcommand{\typHasEq}[1]{\mathit{has\_equality}({#1})_\env} \newcommand{\nonNeg}[1]{\mathit{is\_nonneg\_numeric}({#1})_\env} \newcommand{\pos}[1]{\mathit{is\_pos\_numeric}({#1})_\env} @@ -309,7 +321,7 @@ \newcommand{\boolTyp}{\mathit{bool}} \newcommand{\stringTyp}{\mathit{string}} \newcommand{\integerTyp}{\mathit{int}} -\newcommand{\bitStringTyp}[1]{\mathit{bit}<{#1}>} +\newcommand{\bitStringTyp}[1]{\bitWidthTyp {#1}} \newcommand{\setTyp}[1]{\mathit{set}<\!{#1}\!>} \newcommand{\errTyp}{\mathit{error}} \newcommand{\varBitTyp}[1]{\mathit{varbit}<{#1}>} @@ -325,6 +337,7 @@ \newcommand{\recordTypDef}{\recordTyp 1 n} \newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} \newcommand{\recordTypp}[2]{\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +\newcommand{\recordTyps}{\{\overline {\field : \typ}\}} \newcommand{\headerUnionTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\headerTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\structTyp}[2]{\recordTyp {#1} {#2}} @@ -356,6 +369,7 @@ %directions: \newcommand{\less}{\mathit{directionless}} \newcommand{\dir}{d} +\newcommand{\dirs}{\overline \dir} \newcommand{\inDir}{\mathit{in}} \newcommand{\out}{\mathit{out}} \newcommand{\inout}{\mathit{in\_out}} diff --git a/lib/checker.ml b/lib/checker.ml index a0efe94e3..b4fed659e 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -408,6 +408,7 @@ and saturate_type (env: CheckerEnv.t) (typ: Typed.Type.t) : Typed.Type.t = | Constructor ctor -> Constructor (saturate_constructor env ctor) +(* applies the arguments to the parameters of a specialized type that its base has parameters. *) and reduce_type (env: CheckerEnv.t) (typ: Typed.Type.t) : Typed.Type.t = let typ = saturate_type env typ in match typ with From f65269e554fda8212b039aee74f5dd5a52da00f3 Mon Sep 17 00:00:00 2001 From: pataei Date: Fri, 8 Jul 2022 09:15:38 -0400 Subject: [PATCH 12/30] fix typo in exp mem --- docs/petr4spec/Petr4-spec.mdk | 197 ++++++++++++++++++---------------- docs/petr4spec/ops.tex | 2 +- 2 files changed, 107 insertions(+), 92 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 70e506d69..19b2968f5 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -890,7 +890,7 @@ contains no type synonym (_TypeName_ in Petr4) constructors that are used to giv ~ End InfRule -## List Constructor Rule +## List Constructor Rule { #sec-list-e } $\list {\exp_1, \ldots, \exp_n}$ constructs a list of expressions. The rule $\listE$ states that under environment $\env$ and context $\ctxt$ @@ -912,7 +912,7 @@ The rule $\listAltE$ uses the notation of $\overline \exp$ instead of expanding ~ End InfRule -## Record Constructor Rule +## Record Constructor Rule { #sec-record-e } ${\record 1 n}$ denotes a record where $\exp_i$ is assigned to $\field_i$ for $1 \leq i \leq n$. The rule $\recordE$ is similar to $\listE$ rule. @@ -929,7 +929,7 @@ The rule $\recordE$ is similar to $\listE$ rule. ~ End InfRule -## Unary Operations Rules +## Unary Operations Rules { #sec-unary-ops-e } The rule $\logicalNegE$ states that under the environment $\env$ and context $\ctxt$ the expression $!\exp$ translates to the expression $!\prim\exp$ with the type $\boolTyp$ and direction $\dir$ if expression $\exp$ translates to $\prim\exp$ with type $\boolTyp$ and direction $\dir$ under the same environment and context. @@ -963,7 +963,7 @@ Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or bin - P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) -## Binary Operations Rules +## Binary Operations Rules { #sec-bin-ops-e } - The operation $\oplus$ stands for all possible binary operations. @@ -1068,13 +1068,13 @@ compile time we still consider it known at compile time. ~ Begin InfRuleHelper - \inferrule[LogicalOps($\ops=\&\&,\vert\vert$)] + \inferrule[LogicalOps\rAE($\ops=\&\&,\vert\vert$)] { \reduceEnums {\typ_1} = \boolTyp \\ \reduceEnums {\typ_2} = \boolTyp \\ \dir = \inOrLess {\dir_1} {\dir_2} } { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } - \inferrule[NumericOps($\ops=+, -, *$)] + \inferrule[NumericOps\rAE($\ops=+, -, *$)] { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ \typ = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ % \reduceEnums {\typ_2} = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ @@ -1083,25 +1083,25 @@ compile time we still consider it known at compile time. } { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[EqualityChecks($\ops=\ ==, !=$)] + \inferrule[EqualityChecks\rAE($\ops=\ ==, !=$)] { \typEqEnv {\emp} {\reduceEnums {\typ_1}} {\reduceEnums {\typ_2}} \\ % \typEq {\emp} {\typ_1} {\typ_2} \\ \typHasEq {\typ_1} } { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } - \inferrule[OpSat($\ops = \plusSat,\subSat$)] + \inferrule[OpSat\rAE($\ops = \plusSat,\subSat$)] { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ \dir = \inOrLess {\dir_1} {\dir_2}} { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[BitwiseOps($\ops=\bitAnd, \bitOr, \bitXor, \bitComplement$)] + \inferrule[BitwiseOps\rAE($\ops=\bitAnd, \bitOr, \bitXor, \bitComplement$)] { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ\\ \typ = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ \dir = \inOrLess {\dir_1} {\dir_2}} { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[BitstringConcatenation] + \inferrule[BitstringConcatenation\rAE] { \reduceEnums {\typ_1} = \prim {\typ_1} \\ \reduceEnums {\typ_2} = \prim {\typ_2} \\ \left( \so {\prim {\typ_1} = \bitWidthTyp {\width_1}, \prim {\typ_2} = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ @@ -1109,7 +1109,7 @@ compile time we still consider it known at compile time. \dir = \inOrLess {\dir_1} {\dir_2}} { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[ComparisonOps($\ops= <, \leq, >, \geq$)] + \inferrule[ComparisonOps\rAE($\ops= <, \leq, >, \geq$)] { \reduceEnums {\typ_1} = \prim {\typ_1} \\ \reduceEnums {\typ_2} = \prim {\typ_2} \\ \dir = \inOrLess {\dir_1} {\dir_2}\\ @@ -1119,7 +1119,7 @@ compile time we still consider it known at compile time. } { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[DivOps($\ops=\div, \mod$)] + \inferrule[DivOps\rAE($\ops=\div, \mod$)] { \reduceEnums {\typ_1} = \prim {\typ_1}\\ \reduceEnums {\typ_2} = \prim {\typ_2}\\ \left( \so {\prim {\typ_1} = \prim {\typ_2} = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \textOr \\ @@ -1127,7 +1127,7 @@ compile time we still consider it known at compile time. \dir = \inOrLess {\dir_1} {\dir_2}} { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[ShiftOps($\ops=\shiftL,\shiftR$)] + \inferrule[ShiftOps\rAE($\ops=\shiftL,\shiftR$)] { % \typ_1 = \reduceEnums {\typ_1} \\ % \typ_2 = \reduceEnums {\typ_2} \\ @@ -1198,151 +1198,151 @@ P4 spec states during the cast between int and bit or int the compiler wou ~ Begin InfRuleHelper - \inferrule[Bit<1>ToBool] + \inferrule[Bit<1>ToBool\rAE] {} { \explCast {\bitWidthTyp 1} \boolTyp } - \inferrule[BoolToBit<1>] + \inferrule[BoolToBit<1>\rAE] {} { \explCast \boolTyp {\bitWidthTyp 1} } - \inferrule[UnsignedIntToSigned] + \inferrule[UnsignedIntToSigned\rAE] { \width_1 = \width_2 } { \explCast {\bitWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} - \inferrule[SignedIntToUnsigned] + \inferrule[SignedIntToUnsigned\rAE] { \width_1 = \width_2 } { \explCast {\intWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} - \inferrule[UnsignedIntToUnsignedInt-Explicit] + \inferrule[UnsignedIntToUnsignedInt-Explicit\rAE] {} { \explCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} - \inferrule[UnsignedIntToUnsignedInt-Implicit] + \inferrule[UnsignedIntToUnsignedInt-Implicit\rAE] { \width_1 = \width_2} { \implCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} - \inferrule[SignedIntToSignedInt-Explicit] + \inferrule[SignedIntToSignedInt-Explicit\rAE] {} { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} - \inferrule[SignedIntToSignedInt-Implicit] + \inferrule[SignedIntToSignedInt-Implicit\rAE] { \width_1 = \width_2} { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} - \inferrule[ArbitraryPrecisionIntToUnsignedInt] + \inferrule[ArbitraryPrecisionIntToUnsignedInt\rAE] {} { \castenv \ \integerTyp {\bitWidthTyp \width}} - \inferrule[ArbitraryPrecisionIntToSignedInt] + \inferrule[ArbitraryPrecisionIntToSignedInt\rAE] {} { \castenv \ \integerTyp {\intWidthTyp \width}} - \inferrule[TypeDefs] + \inferrule[TypeDefs\rAE] { (\typEqEnv \emp {\typ_1} {\newTypeTyp \name {\typ_2}}) \textOr (\typEqEnv \emp {\typ_2} {\newTypeTyp \name {\typ_1}})} { \castenv \ {\newTypeTyp \name {\typ_1}} {\newTypeTyp \name {\typ_2}}} - \inferrule[TypeDefToType-Explicit] + \inferrule[TypeDefToType-Explicit\rAE] { \explCast {\typ_1} {\typ_2}} { \explCast {\newTypeTyp \name {\typ_1}} {\typ_2}} - \inferrule[TypeDefToType-Implicit] + \inferrule[TypeDefToType-Implicit\rAE] { \implCast {\typ_1} {\typ_2}} { \implCast {\newTypeTyp \name {\typ_1}} {\typ_2}} - \inferrule[TypeToTypeDef-Explicit] + \inferrule[TypeToTypeDef-Explicit\rAE] { \explCast {\typ_1} {\typ_2}} { \explCast {\typ_1} {\newTypeTyp \name {\typ_2}}} - \inferrule[TypeToTypeDef-Implicit] + \inferrule[TypeToTypeDef-Implicit\rAE] { \implCast {\typ_1} {\typ_2}} { \implCast {\typ_1} {\newTypeTyp \name {\typ_2}}} - \inferrule[Enums] + \inferrule[Enums\rAE] { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\enumTyp {\typ_2} {\name_2} {\names_2}}} - \inferrule[EnumToUnderlyingType] + \inferrule[EnumToUnderlyingType\rAE] { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\typ_2}} - \inferrule[TypeToEnumWithUndrlyingType] + \inferrule[TypeToEnumWithUndrlyingType\rAE] { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\typ_1} {\enumTyp {\typ_2} {\name_2} {\names_2}}} - \inferrule[Sets] + \inferrule[Sets\rAE] { \typEqEnv \emp {\typ_1} {\typ_2}} { \castenv \ {\setTyp {\typ_1}} {\setTyp {\typ_2}} } - \inferrule[TypeToSet] + \inferrule[TypeToSet\rAE] { \typEqEnv \emp {\typ_1} {\typ_2}} { \implCast {\typ_1} {\setTyp {\typ_2}}} - \inferrule[ListToTuple] + \inferrule[ListToTuple\rAE] { \typEqEnv \emp {\tupleTyps {\typs_1}} {\tupleTyps {\typs_2}}} { \castenv \ {\listTyps {\typs_1} } {\tupleTyps {\typs_2}}} - \inferrule[ListToHeader-Explicit] + \inferrule[ListToHeader-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} - \inferrule[ListToHeader-Implicit] + \inferrule[ListToHeader-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} - \inferrule[ListToStruct-Explicit] + \inferrule[ListToStruct-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\explCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} - \inferrule[ListToStruct-Implicit] + \inferrule[ListToStruct-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} {\implCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} - \inferrule[RecordToHeader-Explicit] + \inferrule[RecordToHeader-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\headerTypp 1 n}} - \inferrule[RecordToHeader-Implicit] + \inferrule[RecordToHeader-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\headerTypp 1 n}} - \inferrule[RecordToStruct-Explicit] + \inferrule[RecordToStruct-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\explCast {\recordTyp 1 n } {\structTypp 1 n}} - \inferrule[RecordToStruct-Implicit] + \inferrule[RecordToStruct-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} {\implCast {\recordTyp 1 n } {\structTypp 1 n}} - \inferrule[HeaderToHeader-Explicit] + \inferrule[HeaderToHeader-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\explCast {\headerTyp 1 n } {\headerTypp 1 n}} - \inferrule[HeaderToHeader-Implicit] + \inferrule[HeaderToHeader-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} {\implCast {\headerTyp 1 n } {\headerTypp 1 n}} - \inferrule[StructToStruct-Explicit] + \inferrule[StructToStruct-Explicit\rAE] {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} {\explCast {\structTyp 1 n } {\structTypp 1 n}} - \inferrule[StructToStruct-Implicit] + \inferrule[StructToStruct-Implicit\rAE] {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} {\implCast {\structTyp 1 n } {\structTypp 1 n}} - \inferrule[ID] + \inferrule[ID\rAE] { \typ_1 = \typ_2} {\implCast {\typ_1} {\typ_2}} @@ -1350,7 +1350,22 @@ P4 spec states during the cast between int and bit or int the compiler wou ## Membership Rules { #sec-mem-e } -- Petr4 calls field access for structs _expression member_. +A membership expression denoted by a dot, that is, $a.\name$ looks if $\name$ exists in $a$. And it can be a type, error, or expression membership depending on what $a$ is. +Petr4's _expression member_ is P4's _field access_. + +The rules $\typeMemE$ and $\errMemE$ are rather simple. +They just look up $\name$ extended with the type or error, respectively, in the environment. For example, the $\typeMemE$ states that under the environment $\env$ and context $\ctxt$, the expression $\typMem \typ \name$ is the same in the IR and has the type $\typ$ and direction $\less$ if $\typMem \typ \name$ exists in $\env$. + +The rule $\expMemE$ states that under the environment $\env$ and context $\ctxt$, the +expression $\expMem \exp \field$ translates to the expression $\expMem {\prim \exp} \field$ with type $\pprim \typ$ and direction $\less$ where $\prim \exp$ is the translation of the expression $\exp$ and $\pprim \typ$ is the type of the field $\field$ from the reduced type of expression $\exp$ (that is, $\reduce \typ$) which is returned by the expression member auxiliary judgment. + +- The [expression member auxiliary judgment][#sec-exp-mem-helper] is a helper judgment +for the $\expMemE$ rule. +It has the form $\fieldAccessEnv \ctxt \typ {\prim \typ}$ +which states that under environment $\env$ and context $\ctxt$, the field $\field$ +has the type $\prim \typ$ in an expression of type $\typ$. +Simply stated, it looks up the type of the field from the expression member passed from the $\expMemE$ rule. +Note that the expression has to be of a type that contains fields, such as a struct or a header. ~ Begin InfRule @@ -1368,40 +1383,27 @@ P4 spec states during the cast between int and bit or int the compiler wou % \structTypDef = \prim \typ\\ \fieldAccessEnv \ctxt {\prim \typ} {\pprim \typ} } - { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } + { \expenv {\expMem \exp \field} {\expMem {\prim \exp} \field} {\pprim \typ} {\less} } ~ End InfRule -### Field Access Builtin Methods Auxiliary Judgment { #sec-exp-mem-builtin } +### Expression Member Auxiliary Judgment { #sec-exp-mem-helper } -**DISCUSSION** there is some dead code in the implementation of this judgment. -The function _type\_expression\_member_ calls the helper _type\_expression\_member\_builtin_ when it doesn't find the name of field that is to be accessed (that is, for size, -last index, next, or last) and there it checks if the type of the expression is an -array but it has already patterned matched on the type of the expression to be either -struct, header, header union, specilaized, or extern. Thus, the _None_ case would always -fail. what's the correct expected behavior here? -- The [expression memeber builtin judgment][#sec-exp-mem-builtin] is a helper judgment -for expression member (field access) rule. -It has the form $\fieldAccessEnv \ctxt \exp \typ {\prim \typ}$ -which states that under environment $\env$ and context $\ctxt$, the field $\name$ -has the type $\prim \typ$ in the expression $\exp$ of type $\typ$. -Note that $\exp$ has to be an expression -that contains fields, such as a struct or a header. ~ Begin InfRuleHelper - \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion] + \inferrule[Type:StructOrHeaderOrHeaderUnion\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \structTypDef = \reduce \typ \\ % \structTypDef = \prim \typ\\ (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ - \exists 1 \leq i \leq n+1. \field_i = \name + \exists 1 \leq i \leq n+1. \field_i = \field } { \fieldAccessEnv \ctxt \structTypDef {\typ_i} } - \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-SizeOrLastIndex] + \inferrule[Type:StructOrHeaderOrHeaderUnion-Field:SizeOrLastIndex\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \structTypDef = \reduce \typ \\ @@ -1409,11 +1411,11 @@ that contains fields, such as a struct or a header. % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ % \isArray \typ \\ \name = \sizeFlag \textOr \lastIndex\\ - \nexists 1 \leq i \leq n. \field_i = \name + \nexists 1 \leq i \leq n. \field_i = \field } { \fieldAccessEnv \ctxt {\arrayTyp \typ \size AND \ \structTypDef} {\bitWidthTyp {32}} } - \inferrule[ExpressionMember-StructOrHeaderOrHeaderUnion-NextOrLast] + \inferrule[Type:StructOrHeaderOrHeaderUnion-Field:NextOrLast\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \structTypDef = \reduce \typ \\ @@ -1422,70 +1424,83 @@ that contains fields, such as a struct or a header. % \isArray {\reduce \typ} \\ % \arrayTyp {\prim \typ} \size = \typ\\ \name = \sizeFlag \textOr \lastIndex \\ - \nexists 1 \leq i \leq n. \field_i = \name + \nexists 1 \leq i \leq n. \field_i = \field } { \fieldAccessEnv \parserCtxt {\arrayTyp \typ \size AND \ \structTypDef} \typ } - \inferrule[ExpressionMember-Specialized] + \inferrule[Type:Specialized\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ % names in the following are actually methods. have to see what they contain. \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ % \prim \env = \insertToEnv \typParams \typs \\ - \exists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name \\ + \exists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \field \\ \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} {\typs}} {\pprim {\typ_i}}} - \inferrule[ExpressionMember-Specialized-SizeOrLastIndex] + \inferrule[Type:Specialized-Field:SizeOrLastIndex\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ + % \spcTyp {\externTyp {\prim \name}} {\typ} = \reduce \typ \\ % names in the following are actually methods. have to see what they contain. % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ \name = \sizeFlag \textOr \lastIndex\\ - \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name + \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ + \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \field_i = \field } - { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} {\typs} AND \ \arrayTyp \typ \size} {\bitWidthTyp {32}}} + { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \field}} {\typs} AND \ \arrayTyp \typ \size} {\bitWidthTyp {32}}} - \inferrule[ExpressionMember-Specialized-NextOrLast] + \inferrule[Type:Specialized-Field:NextOrLast\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ % names in the following are actually methods. have to see what they contain. - % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + % \lookupEnv {\prim \field} = (\typParams,\overline {\name:\prim \typ}) \\ \name = \sizeFlag \textOr \lastIndex\\ - \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name + \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ + \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \field_i = \field } - { \fieldAccessEnv \parserCtxt {\spcTyp {\externTyp {\prim \name}} {\typs} AND \ \arrayTyp \typ \size} {\typ}} + { \fieldAccessEnv \parserCtxt {\spcTyp {\externTyp {\prim \field}} {\typs} AND \ \arrayTyp \typ \size} {\typ}} - \inferrule[ExpressionMember-Extern] + \inferrule[Type:Extern\rAE] { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} \ } {\pprim \typ} } { \fieldAccessEnv \ctxt {\externTyp {\prim \name}} {\pprim \typ}} - % \inferrule[ExpressionMember-Extern-SizeOrLastIndex] + % \inferrule[Type:Extern-Field:SizeOrLastIndex\rAE] % { \name = \sizeFlag \textOr \lastIndex\\ % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ % \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name \\ % % \expenv \exp {\prim \exp} {\typ} \dir \\ - % % \externTyp {\prim \name} = \reduce \typ \\ - % % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - % % \fieldAccessEnv \ {\spcTyp {\externTyp {\prim \name}} {\ }} \name {\prim \typ}} - % { \fieldAccessEnv \ctxt {\externTyp {\prim \name} AND \ \arrayTyp \typ \size} } + % % \externTyp {\prim \field} = \reduce \typ \\ + % % \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ + % % \fieldAccessEnv \ {\spcTyp {\externTyp {\prim \field}} {\ }} \field {\prim \typ}} + % { \fieldAccessEnv \ctxt {\externTyp {\prim \field} AND \ \arrayTyp \typ \size} } - % \inferrule[ExpressionMember-Rest] + % \inferrule[Rest\rAE] % {\expenv \exp {\prim \exp} {\typ} \dir \\ % \prim \typ = \reduce \typ \\ % \fieldAccessEnv {\prim \typ} \name {\pprim \typ}} - % { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } + % { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \field} {\pprim \typ} {\less} } ~ End InfRuleHelper -## Ternary Rule +``**DISCUSSION**`` +There is some dead code in the implementation of this judgment. +The function _type\_expression\_member_ calls the helper _type\_expression\_member\_builtin_ when it doesn't find the name of field that is to be accessed (that is, for size, +last index, next, or last) and there it checks if the type of the expression is an +array but it has already patterned matched on the type of the expression to be either +struct, header, header union, specilaized, or extern. Thus, the _None_ case would always +fail. what's the correct expected behavior here? + +## Ternary Rule { #sec-ternary-e } + +The expression $\ternary {\exp_1} {\exp_2} {\exp_3}$ is a conditional expression. +The rule $\ternaryE$ states that $\exp_1$ must be a boolean and expressions $\exp_2$ +and $\exp_3$ must have the same type but they cannot have the $\integerTyp$ type. In +that case it translates the conditional expression by translating all its subexpressions. ~ Begin InfRule @@ -1623,7 +1638,7 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ~ End InfRule -## Mask Rule +## Mask Rule { #sec-mask-e } The expression $\mask {\exp_1} {\exp_2}$ denotes a masking expression where every 0 bit in $\exp_2$ is turned into don't care and the rest of the bits of expressions $\exp_1$ and $\exp_2$ are conjuncted. Thus, it returns a set of expressions: $\mask {\exp_1} {\exp_2} = \{\exp_3 | \exp_1\ \&\ \exp_2 = \exp_3\ \&\ \exp_2 \}$. Thus, as diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index e83edd249..d6b2c4fc1 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -123,7 +123,7 @@ \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} \newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} %context. type of expression. type of returned name.exp -\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash \name, {#2} : {#3}} +\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash \field, {#2} : {#3}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} \newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} From 45f908efee5922aa92b3b48d58fa321e6be541b5 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 12 Jul 2022 13:49:08 -0400 Subject: [PATCH 13/30] instant in progress --- docs/petr4spec/Petr4-spec.mdk | 183 +++++++++++----------------------- docs/petr4spec/ops.tex | 55 +++++----- lib/checker.ml | 11 +- 3 files changed, 92 insertions(+), 157 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 19b2968f5..c0a55fee0 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -438,31 +438,31 @@ The following base types are well-formed unconditionally since there is not any ~ Begin InfRule \inferrule[\boolT] - {} + { } { \typWellFormed \boolTyp } \inferrule[\stringT] - {} + { } { \typWellFormed \stringTyp } \inferrule[\intT] - {} + { } { \typWellFormed \integerTyp } \inferrule[\varbitT] - {} + { } { \typWellFormed {\varBitTyp \width} } \inferrule[\errT] - {} + { } { \typWellFormed \errTyp} \inferrule[\voidT] - {} + { } { \typWellFormed \voidTyp} \inferrule[\matchKindT] - {} + { } { \typWellFormed \matchKindTyp} ~ End InfRule @@ -474,12 +474,12 @@ Petr4 doesn't check the length of a fixed-length integer, either signed or unsig \inferrule[\intWidthT] % { 1 < \width} % p4 spec has this - {} + { } { \typWellFormed {\intWidthTyp \width} } \inferrule[\bitWidthT] % { 0 \leq \width} % p4 spec has this - {} + { } { \typWellFormed {\bitWidthTyp \width} } ~ End InfRule @@ -550,7 +550,7 @@ Petr4 doesn't allow for an enum to have default values for constants, however, P ~ Begin InfRule \inferrule[\enumOneT] - {} + { } { \typWellFormed \enumTypNoTyp } \inferrule[\enumTwoT] @@ -621,7 +621,7 @@ The rule $\specializedExternT$ states that the specialization of an extern type ~ Begin InfRule \inferrule[\specializedExternT] - { ([\param_1, \ldots, \param_m], \_ )= \lookupEnv \name \\ + { \lookupEnv \name = ([\param_1, \ldots, \param_m], \_ ) \\ 1 \leq i \leq n. \typWellFormed {\typ_i} \\ n = m} { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } @@ -688,7 +688,7 @@ This seems way too simple and loose.``` ~ Begin InfRule \inferrule[\externT] - { (\emp, \_ ) =\lookupEnv \name } + { \lookupEnv \name = (\emp, \_ )} { \typWellFormed {\externTyp \name} } ~ End InfRule @@ -743,7 +743,7 @@ A table type is well-formed under an environment if it exists in the environment ~ Begin InfRule \inferrule[\tableT] - { \typ = \lookupEnv \name } + { \lookupEnv \name = \typ} { \typWellFormed {\tableTyp \name} } ~ End InfRule @@ -755,7 +755,7 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the ~ Begin InfRule \inferrule[\typeNameT] - { \typ = \lookupEnv \name } + { \lookupEnv \name = \typ} { \typWellFormed {\typNameTyp \name} } ~ End InfRule @@ -797,23 +797,23 @@ The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar ~ Begin InfRule \inferrule[\boolE] - {} + { } {\expenv \bool \bool \boolTyp \less} \inferrule[\stringE] - {} + { } {\expenv \str \str \stringTyp \less} \inferrule[\integerE] - {} + { } {\expenv \int \int \integerTyp \less} \inferrule[\bitStringE] - {} + { } {\expenv {\bitWidth \bit \width} {\bitWidth \bit \width} {\bitWidthTyp \width} \less} \inferrule[\signedIntE] - {} + { } {\expenv {\intWidth \int \width} {\intWidth \int \width} {\intWidthTyp \width} {\less}} ~ End InfRule @@ -1199,11 +1199,11 @@ P4 spec states during the cast between int and bit or int the compiler wou ~ Begin InfRuleHelper \inferrule[Bit<1>ToBool\rAE] - {} + { } { \explCast {\bitWidthTyp 1} \boolTyp } \inferrule[BoolToBit<1>\rAE] - {} + { } { \explCast \boolTyp {\bitWidthTyp 1} } \inferrule[UnsignedIntToSigned\rAE] @@ -1215,7 +1215,7 @@ P4 spec states during the cast between int and bit or int the compiler wou { \explCast {\intWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[UnsignedIntToUnsignedInt-Explicit\rAE] - {} + { } { \explCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[UnsignedIntToUnsignedInt-Implicit\rAE] @@ -1223,7 +1223,7 @@ P4 spec states during the cast between int and bit or int the compiler wou { \implCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} \inferrule[SignedIntToSignedInt-Explicit\rAE] - {} + { } { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} \inferrule[SignedIntToSignedInt-Implicit\rAE] @@ -1231,11 +1231,11 @@ P4 spec states during the cast between int and bit or int the compiler wou { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} \inferrule[ArbitraryPrecisionIntToUnsignedInt\rAE] - {} + { } { \castenv \ \integerTyp {\bitWidthTyp \width}} \inferrule[ArbitraryPrecisionIntToSignedInt\rAE] - {} + { } { \castenv \ \integerTyp {\intWidthTyp \width}} \inferrule[TypeDefs\rAE] @@ -1351,21 +1351,24 @@ P4 spec states during the cast between int and bit or int the compiler wou ## Membership Rules { #sec-mem-e } A membership expression denoted by a dot, that is, $a.\name$ looks if $\name$ exists in $a$. And it can be a type, error, or expression membership depending on what $a$ is. -Petr4's _expression member_ is P4's _field access_. +An expression member looks up a _member_ in an expression. +The member could be a field in +a record type such as struct and header, or it could be a method in an extern or specialized type, or a special look up of an element of an array such as next, last, size, and last index. + The rules $\typeMemE$ and $\errMemE$ are rather simple. They just look up $\name$ extended with the type or error, respectively, in the environment. For example, the $\typeMemE$ states that under the environment $\env$ and context $\ctxt$, the expression $\typMem \typ \name$ is the same in the IR and has the type $\typ$ and direction $\less$ if $\typMem \typ \name$ exists in $\env$. The rule $\expMemE$ states that under the environment $\env$ and context $\ctxt$, the -expression $\expMem \exp \field$ translates to the expression $\expMem {\prim \exp} \field$ with type $\pprim \typ$ and direction $\less$ where $\prim \exp$ is the translation of the expression $\exp$ and $\pprim \typ$ is the type of the field $\field$ from the reduced type of expression $\exp$ (that is, $\reduce \typ$) which is returned by the expression member auxiliary judgment. +expression $\expMem \exp \name$ translates to the expression $\expMem {\prim \exp} \name$ with type $\pprim \typ$ and direction $\less$ where $\prim \exp$ is the translation of the expression $\exp$ and $\pprim \typ$ is the type of the member $\name$ from the reduced type of expression $\exp$ (that is, $\reduce \typ$) which is returned by the expression member auxiliary judgment. - The [expression member auxiliary judgment][#sec-exp-mem-helper] is a helper judgment for the $\expMemE$ rule. -It has the form $\fieldAccessEnv \ctxt \typ {\prim \typ}$ -which states that under environment $\env$ and context $\ctxt$, the field $\field$ +It has the form $\fieldAccessEnv \ctxt \name \typ {\prim \typ}$ +which states that under environment $\env$ and context $\ctxt$, the member $\name$ has the type $\prim \typ$ in an expression of type $\typ$. -Simply stated, it looks up the type of the field from the expression member passed from the $\expMemE$ rule. -Note that the expression has to be of a type that contains fields, such as a struct or a header. +Simply stated, it looks up the type of the member from the expression passed from the $\expMemE$ rule. +Note that the expression has to be of a one of the types: record, extern, speciliazed, or arry. ~ Begin InfRule @@ -1381,19 +1384,20 @@ Note that the expression has to be of a type that contains fields, such as a str { \expenv \exp {\prim \exp} {\typ} \dir \\ \prim \typ = \reduce \typ \\ % \structTypDef = \prim \typ\\ - \fieldAccessEnv \ctxt {\prim \typ} {\pprim \typ} + \fieldAccessEnv \ctxt \name {\prim \typ} {\pprim \typ} } - { \expenv {\expMem \exp \field} {\expMem {\prim \exp} \field} {\pprim \typ} {\less} } + { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } ~ End InfRule ### Expression Member Auxiliary Judgment { #sec-exp-mem-helper } - +This judgment ensures that the type of an expression in an expression member is either +a record type, a specialized type, an extern type, or an array. Then, it looks up the member that is being accessed by the expression member. ~ Begin InfRuleHelper - \inferrule[Type:StructOrHeaderOrHeaderUnion\rAE] + \inferrule[\rn{Type:StructOrHeaderOrHeaderUnion}\rAE] { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \structTypDef = \reduce \typ \\ @@ -1401,100 +1405,31 @@ Note that the expression has to be of a type that contains fields, such as a str (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ \exists 1 \leq i \leq n+1. \field_i = \field } - { \fieldAccessEnv \ctxt \structTypDef {\typ_i} } + { \fieldAccessEnv \ctxt \field \structTypDef {\typ_i} } - \inferrule[Type:StructOrHeaderOrHeaderUnion-Field:SizeOrLastIndex\rAE] + \inferrule[\rn{Type:Specialized}\rAE] { - % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \structTypDef = \reduce \typ \\ - % = \prim \typ\\ - % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ - % \isArray \typ \\ - \name = \sizeFlag \textOr \lastIndex\\ - \nexists 1 \leq i \leq n. \field_i = \field - } - { \fieldAccessEnv \ctxt {\arrayTyp \typ \size AND \ \structTypDef} {\bitWidthTyp {32}} } - - \inferrule[Type:StructOrHeaderOrHeaderUnion-Field:NextOrLast\rAE] - { - % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \structTypDef = \reduce \typ \\ - % = \prim \typ\\ - % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ - % \isArray {\reduce \typ} \\ - % \arrayTyp {\prim \typ} \size = \typ\\ - \name = \sizeFlag \textOr \lastIndex \\ - \nexists 1 \leq i \leq n. \field_i = \field - } - { \fieldAccessEnv \parserCtxt {\arrayTyp \typ \size AND \ \structTypDef} \typ } - - \inferrule[Type:Specialized\rAE] - { - % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ % names in the following are actually methods. have to see what they contain. - \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ + \lookupEnv {\prim \name} = (\typParams,\overline {\name:\simpFuncTyp {\typ_{\mathit{in}}} {\typ_{\mathit{out}}}}) \\ % \prim \env = \insertToEnv \typParams \typs \\ - \exists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \field \\ + \exists \name_i: \prim {\typ_i} \in \overline {\name:\simpFuncTyp {\typ_{\mathit{in}}} {\typ_{\mathit{out}}}}. \name_i = \name \\ \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} - { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} {\typs}} {\pprim {\typ_i}}} + { \fieldAccessEnv \ctxt \name {\spcTyp {\externTyp {\prim \name}} {\typs}} {\pprim {\typ_i}}} + \inferrule[\rn{Type:Extern}\rAE] + { \fieldAccessEnv \ctxt \name {\spcTyp {\externTyp {\prim \name}} \ } {\pprim \typ} } + { \fieldAccessEnv \ctxt \name {\externTyp {\prim \name}} {\pprim \typ}} - \inferrule[Type:Specialized-Field:SizeOrLastIndex\rAE] - { - % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \spcTyp {\externTyp {\prim \name}} {\typ} = \reduce \typ \\ - % names in the following are actually methods. have to see what they contain. - % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - \name = \sizeFlag \textOr \lastIndex\\ - \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ - \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \field_i = \field - } - { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \field}} {\typs} AND \ \arrayTyp \typ \size} {\bitWidthTyp {32}}} - - \inferrule[Type:Specialized-Field:NextOrLast\rAE] - { - % \expenv \exp {\prim \exp} {\typ} \dir \\ - % \spcTyp {\externTyp {\prim \name}} {\typs} = \reduce \typ \\ - % names in the following are actually methods. have to see what they contain. - % \lookupEnv {\prim \field} = (\typParams,\overline {\name:\prim \typ}) \\ - \name = \sizeFlag \textOr \lastIndex\\ - \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ - \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \field_i = \field - } - { \fieldAccessEnv \parserCtxt {\spcTyp {\externTyp {\prim \field}} {\typs} AND \ \arrayTyp \typ \size} {\typ}} - - \inferrule[Type:Extern\rAE] - { \fieldAccessEnv \ctxt {\spcTyp {\externTyp {\prim \name}} \ } {\pprim \typ} } - { \fieldAccessEnv \ctxt {\externTyp {\prim \name}} {\pprim \typ}} - - % \inferrule[Type:Extern-Field:SizeOrLastIndex\rAE] - % { \name = \sizeFlag \textOr \lastIndex\\ - % \lookupEnv {\prim \name} = (\typParams,\overline {\name:\prim \typ}) \\ - % \nexists \name_i: \typ_i \in \overline {\name:\prim \typ}; \name_i = \name \\ - % % \expenv \exp {\prim \exp} {\typ} \dir \\ - % % \externTyp {\prim \field} = \reduce \typ \\ - % % \lookupEnv {\prim \field} = (\typParams,\overline {\field:\prim \typ}) \\ - % % \fieldAccessEnv \ {\spcTyp {\externTyp {\prim \field}} {\ }} \field {\prim \typ}} - % { \fieldAccessEnv \ctxt {\externTyp {\prim \field} AND \ \arrayTyp \typ \size} } - - % \inferrule[Rest\rAE] - % {\expenv \exp {\prim \exp} {\typ} \dir \\ - % \prim \typ = \reduce \typ \\ - % \fieldAccessEnv {\prim \typ} \name {\pprim \typ}} - % { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \field} {\pprim \typ} {\less} } + \inferrule[\rn{Type:Array}\rSep\rn{Member:SizeOrLastIndex}\rAE] + { \name = \sizeFlag \textOr \lastIndex} + { \fieldAccessEnv \ctxt \name {\arrayTyp \typ \size} {\bitWidthTyp {32}}} + \inferrule[\rn{Type:Array}\rSep\rn{Member:}\rn{Field:NextOrLast}\rAE] + { \name = \sizeFlag \textOr \lastIndex} + { \fieldAccessEnv \parserCtxt \name {\arrayTyp \typ \size} {\typ}} ~ End InfRuleHelper -``**DISCUSSION**`` -There is some dead code in the implementation of this judgment. -The function _type\_expression\_member_ calls the helper _type\_expression\_member\_builtin_ when it doesn't find the name of field that is to be accessed (that is, for size, -last index, next, or last) and there it checks if the type of the expression is an -array but it has already patterned matched on the type of the expression to be either -struct, header, header union, specilaized, or extern. Thus, the _None_ case would always -fail. what's the correct expected behavior here? - ## Ternary Rule { #sec-ternary-e } The expression $\ternary {\exp_1} {\exp_2} {\exp_3}$ is a conditional expression. @@ -1574,12 +1509,12 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ~ Begin InfRuleHelper \inferrule[\nameFuncNameE] - { (\overline {\typ, \dir}) = \lookupEnv \name \\ + { \lookupEnv \name = (\overline {\typ, \dir})\\ \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } { \resolveFuncOver \name {\argkvss 1 n} \typParams {\pars 1 n} \kind {\typ_\ret} \dir } \inferrule[\nameFuncCountE] - { (\overline {\typ, \dir}) = \lookupEnv \name \\ + { \lookupEnv \name = (\overline {\typ, \dir})\\ \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ |\removeOptionalPars \params| = n} { \resolveFuncOver \name {\argexpss 1 n} \typParams \params \kind {\typ_\ret} \dir} @@ -1624,17 +1559,17 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par - The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function. It has the judgment form $\inferTypParArg {\typ_\ret} {\overline {\typVar : \typ}} {\overline {\param = {\maybe \exp}}} {\overline {\prim \typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}$ which states that the type parameters $\typVars$ have the type $\pprim \typ$ under environment $\env$ and context $\ctxt$ with the return type of $\typ_\ret$, the assignment of type parameters $\typVars$ to types $\typs$, the assignment of parameters $\params$ to optional expressions $\maybe \exp$, and constraints $fill\ later$. -## Anonymous Instantiation Rule +## Instantiation Rule { #sec-inst-e } ~ Begin InfRule - \inferrule[\instE] + \inferrule[\instE:SpecializedType] { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } - { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} + { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typArg_1, \ldots, \typArg_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} \inferrule[\instE-2] { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} - { \expenv {\instantiation {\name} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir } + { \expenv {\instantiation {\typName} {\args}} {\prim \exp} \typ \dir } ~ End InfRule diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index d6b2c4fc1..2e71683a9 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -123,7 +123,7 @@ \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} \newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} %context. type of expression. type of returned name.exp -\newcommand{\fieldAccessEnv}[3]{\env, {#1} \vdash \field, {#2} : {#3}} +\newcommand{\fieldAccessEnv}[4]{\env, {#1} \vdash {#2}, {#3} : {#4}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} \newcommand{\stmtenvv}[5]{\env_{#1}, \ctxt_{#1} \vdash {#2} \leadsto {#3}, {#4} \dashv \env_{#5}} \newcommand{\dclenv}[2]{\env, \ctxt \vdash {#1} \leadsto {#2} \dashv \env} @@ -168,7 +168,7 @@ \newcommand{\bitComplement}{\sim} \renewcommand{\div}{/} \renewcommand{\mod}{\%} -\newcommand{\funcCall}[3]{{#1}<{#2}>({#3})} +\newcommand{\funcCall}[3]{{#1}\langle{#2}\rangle({#3})} \newcommand{\expMem}[2]{{#1}.{#2}} \newcommand{\instantiation}[2]{{#1}({#2})} \newcommand{\assign}[2]{{#1}={#2}} @@ -316,24 +316,24 @@ \newcommand{\actionKind}{\mathit{action}} %types: -\newcommand{\bitWidthTyp}[1]{\mathit{bit}<\!{#1}\!>} -\newcommand{\intWidthTyp}[1]{\mathit{int}<\!{#1}\!>} -\newcommand{\boolTyp}{\mathit{bool}} -\newcommand{\stringTyp}{\mathit{string}} -\newcommand{\integerTyp}{\mathit{int}} +\newcommand{\bitWidthTyp}[1]{\mathsf{bit}\langle{#1}\rangle} +\newcommand{\intWidthTyp}[1]{\mathsf{int}\langle{#1}\rangle} +\newcommand{\boolTyp}{\mathsf{bool}} +\newcommand{\stringTyp}{\mathsf{string}} +\newcommand{\integerTyp}{\mathsf{int}} \newcommand{\bitStringTyp}[1]{\bitWidthTyp {#1}} -\newcommand{\setTyp}[1]{\mathit{set}<\!{#1}\!>} -\newcommand{\errTyp}{\mathit{error}} -\newcommand{\varBitTyp}[1]{\mathit{varbit}<{#1}>} -\newcommand{\matchKindTyp}{\mathit{match\_kind}} -\newcommand{\voidTyp}{\mathit{void}} +\newcommand{\setTyp}[1]{\mathsf{set}\langle{#1}\rangle} +\newcommand{\errTyp}{\mathsf{error}} +\newcommand{\varBitTyp}[1]{\mathsf{varbit}\langle{#1}\rangle} +\newcommand{\matchKindTyp}{\mathsf{match\_kind}} +\newcommand{\voidTyp}{\mathsf{void}} \newcommand{\arrayTyp}[2]{{#1}[{#2}]} -\newcommand{\tupleTyp}[2]{\mathit{tuple}<{#1},\ldots,{#2}>} -\newcommand{\tupleTyps}[1]{\mathit{tuple}<{#1}>} +\newcommand{\tupleTyp}[2]{\mathsf{tuple}\langle{#1},\ldots,{#2}\rangle} +\newcommand{\tupleTyps}[1]{\mathsf{tuple}\langle{#1}\rangle} \newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} \newcommand{\listTyps}[1]{\tupleTyps {#1}} -\newcommand{\enumTyp}{\mathit{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} -\newcommand{\enumTypNoTyp}{\mathit{enum} \ {\name}\{\name_1,\ldots,\name_n\}} +\newcommand{\enumTyp}{\mathsf{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} +\newcommand{\enumTypNoTyp}{\mathsf{enum} \ {\name}\{\name_1,\ldots,\name_n\}} \newcommand{\recordTypDef}{\recordTyp 1 n} \newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} \newcommand{\recordTypp}[2]{\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} @@ -352,18 +352,19 @@ %% \newcommand{\structTyp}[2]{\mathit{struct}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} %% \newcommand{\structTypp}[2]{\mathit{struct}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} \newcommand{\newTypeTyp}[2]{{#1}\ {#2}} -\newcommand{\funcTyp}[3]{\mathit{function}\ {#1}<{#2}> ({#3})} +\newcommand{\funcTyp}[3]{\mathsf{function}\ {#1}\langle{#2}\rangle ({#3})} +\newcommand{\simpFuncTyp}[2]{{#1} \rightarrow {#2}} %kind.type param. param. return type. -\newcommand{\funcType}[4]{\mathit{function}\ {#1}<{#2}> ({#3})\rightarrow {#4}} -\newcommand{\constructorTyp}[4]{{#1}\ {#2}\ <{#3}>\ ({#4}, \_)} -\newcommand{\externTyp}[1]{\mathit{extern} \ {#1}} -\newcommand{\spcTyp}[2]{{#1}<{#2}>} -\newcommand{\parserTyp}[2]{\mathit{parser}<{#1}>({#2})} -\newcommand{\controlTyp}[2]{\mathit{control}<{#1}>({#2})} -\newcommand{\packageTyp}[3]{\mathit{package}<{#1}>({#2},{#3})} -\newcommand{\actionTyp}[2]{\mathit{action}(\mathit{data:}{#1},\mathit{control:}{#2})} -\newcommand{\tableTyp}[1]{\mathit{table}\ {#1}} -\newcommand{\typNameTyp}[1]{\mathit{type\_name}\ {#1}} +\newcommand{\funcType}[4]{\mathsf{function}\ {#1}\langle{#2}\rangle ({#3})\rightarrow {#4}} +\newcommand{\constructorTyp}[4]{{#1}\ {#2}\ \langle{#3}\rangle\ ({#4}, \_)} +\newcommand{\externTyp}[1]{\mathsf{extern} \ {#1}} +\newcommand{\spcTyp}[2]{{#1}\langle{#2}\rangle} +\newcommand{\parserTyp}[2]{\mathsf{parser}\langle{#1}\rangle({#2})} +\newcommand{\controlTyp}[2]{\mathsf{control}\langle{#1}\rangle({#2})} +\newcommand{\packageTyp}[3]{\mathsf{package}\langle{#1}\rangle({#2},{#3})} +\newcommand{\actionTyp}[2]{\mathsf{action}(\mathit{data:}{#1},\mathit{control:}{#2})} +\newcommand{\tableTyp}[1]{\mathsf{table}\ {#1}} +\newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} \newcommand{\unitTyp}{()} %directions: diff --git a/lib/checker.ml b/lib/checker.ml index b4fed659e..28c315e7e 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2510,6 +2510,9 @@ and type_expression_member_function_builtin env typ (name: P4String.t) : Typed.T (* Sections 6.6, 8.14 *) (* look at spec. *) +(* In cases where the field is being looked up and it is not found (i.e., None) + the builtin helper is called for ease maintanance of the code in case we + need to extend builtin fields. *) and type_expression_member env ctx expr (name: P4String.t) : Prog.Expression.t = let typed_expr = type_expression env ctx expr in let expr_typ = reduce_type env typed_expr.typ in @@ -2525,10 +2528,6 @@ and type_expression_member env ctx expr (name: P4String.t) : Prog.Expression.t = let open Expression in begin match List.find ~f:matches fs with | Some field -> field.typ - (* TODO: DISCUSSION. THIS WILL ALWAYS FAIL. expr_typ is either - header, header_union or struct. so it will never be array. - while type_expression_member_builtin only returns non-fail - for array. *) | None -> type_expression_member_builtin env ctx (tags expr) expr_typ name end | SpecializedType { base = Extern { name = extern_name }; args } -> @@ -3013,8 +3012,8 @@ and resolve_function_overload env ctx type_name args = *) and type_constructor_invocation env ctx tags decl_name type_args args : Prog.Expression.t list * Typed.Type.t = let open Typed.ConstructorType in - let type_args = List.map ~f:(translate_type_opt env []) type_args in(* determines if type is dontcare.*) - let constructor_type = resolve_constructor_overload env decl_name args in + let type_args = List.map ~f:(translate_type_opt env []) type_args in(* translates types.type to typed.type if it's not dontcare.*) + let constructor_type = resolve_constructor_overload env decl_name args in (* gets the type of the constructor from the env by resolving params *) let t_params = constructor_type.type_params in let w_params = constructor_type.wildcard_params in let params_args = match_params_to_args tags constructor_type.parameters args in From 58f6d6321b794d4e2a99847a6898fed9f7574bf5 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 12 Jul 2022 15:40:25 -0400 Subject: [PATCH 14/30] fixed err --- docs/petr4spec/Petr4-spec.mdk | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index c0a55fee0..0a7b271c3 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -1563,13 +1563,14 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ~ Begin InfRule - \inferrule[\instE:SpecializedType] - { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } - { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typArg_1, \ldots, \typArg_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} + % \inferrule[\instE:SpecializedType] + % { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } + % { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typArg_1, \ldots, \typArg_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} \inferrule[\instE-2] { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} - { \expenv {\instantiation {\typName} {\args}} {\prim \exp} \typ \dir } + %name in the following is typename + { \expenv {\instantiation {\name} {\args}} {\prim \exp} \typ \dir } ~ End InfRule From c7b899c7826191ccd8ac02a7aa7ea415ef842859 Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 13 Jul 2022 10:22:37 -0400 Subject: [PATCH 15/30] dev guide to inf rules --- docs/petr4spec/Petr4-spec.mdk | 325 +++++++++++++++++++++++++++++++--- 1 file changed, 305 insertions(+), 20 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 0a7b271c3..7ea43f131 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -259,17 +259,6 @@ limitations. [INCLUDE="ops.tex"] ~ -~ Bibliography { caption:"00" } -~~Bibitem {#harper-types-PL} -Rober Harper. -Types and Prgarmming Languages. - -~~ -~~Bibitem {#wiki-type-sys} -Type System. - -~~ -~ [TOC] @@ -280,25 +269,40 @@ defines such type system. It is organized as follows: - It first expresses the need to have a formal type system for P4 and familiarizes the reader with the concept of a type system, its role in language design, and how to read -and understand a type system (Section [#sec-note-type-sys]). +and understand a type system (Section [#sec-note]). - It then focuses on the architecture of Petr4 and points out the part that this document focues on (Section [#sec-arch]). - It also describes the structure of Petr4's type system (Section [#sec-petr4-type-sys]) and defines the metavariables used throughout this document (Section [#sec-metavar]). - For those interested, it connects the formalziation in this document to the impelemntation of Petr4 (Section [#sec-conn]). -## Brief Notes on Type System { #sec-note-type-sys } +## Brief Terminology Note { #sec-note } -It is important that the reader understands the reason for having a type system and what its role is. +It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages' terminology used in this document. + +**First, what is a type?** You can simply think of types as a set of language elements that share some features. For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. That is why [@harper-types-PL] states: "The central organizing principle of language desing is the dientitfication of language features with types." -A simple reasoning about programs of a language can be done by a _type system_. +**Second, what is a type system?** A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expression, etc[@wiki-type-sys]. -A type system formally defines many aspects of a programming language. -Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. - -Additionally, it is important for the reader to be able to read and understand inference rules. +Thus, a type system can be used as a simple reasoning tool for programs of a language. +A type system formally defines many aspects of a programming language. +Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. + +**Third, what is surface syntax and intermediate representation (IR)?** +The _surface syntax_ is the syntax used to write the source program by the developer +which eventually will be passed to the compiler. +The compiler does multiple _passes_ between different representations to add or omit +information that it may or may not need. Each of these representations is called an +_intermediate representation_. + +Additionally, it is important for the reader to be able to read and understand typing +rules which in essence are _inference rules_. Thus, we introduce inference rules by +building a toy language gradually +and providing its various typing rules at each step (Section [#sec-guide]). + +## A Developer's Guide to Reading Inference Rules { #sec-guide } A type system is made up of typing _rules_ that each has a specific _judgment form_. A typing rule, in essence, is an _inference rule_. An inference rule contains zero or more _premises_ above the line @@ -313,9 +317,279 @@ $C$ is concluded if premises $A$ and $B$ hold. {C} ~ End InfRule -A rule without the line and premises above it is called an _axiom_ and it states that +A rule without any premises is called an _axiom_ and it states that the conclusion holds uncoditionally. +Consider the simple toy expression language below that only consists of integers. Note +that $i$ is a _metavariable_ that represents any possible integer values. + +~ Begin P4Grammar +i := (any integer) +e := i +~ End P4Grammar + +We can have different typing systems for a language. For example, for the toy language we present two type systems. +The first one has the judgment form $e$ which states that the expression $e$ is well-typed. +For example, the rule $\rn{Integer1}\rE$ states that the expression $i$ is well-typed. Note that it does not +state what its type is. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + {\ \ \ \ } + {i} +~ End InfRule + +We can a more detailed type system for our langauge. +The second type system has the judgment form $e:t$ which states that the expression $e$ +is well-typed and it has the type $t$. Note that $t$ is a metavariable for all possible types of expressions. +The rule $\rn{Integer2}\rE$ states that the +expression $i$ is well-typed and it has the type $\mathsf{int}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {i:\mathsf{int}} +~ End InfRule + +We now extend the toy language by adding variable reference to expression which are +simply strings. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +e := i + | v +~ End P4Grammar + +Now our type systems have to include an environment. +The environment $\Sigma$ is needed to keep track of variables that have been declared and assigned a value/expression. The environment is a mapping of variables to a feature about the variable. This feature can be the type of the variable, the expression it has been assigned, or the value of evaluating the expression it has been assigned. + +Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up.We only focus on expression's typing here. + +The judgment form of our first type systems changes to $\Sigma \vdash e$ which states that under the environment $\Sigma$, the expression $e$ is well-typed. +The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$ the expression $i$ is well-typed. +The typing system is also extended by a rule for variable reference. +The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$ the expression $v$ is +well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its asignee expression. +Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ since $i$ only stands for integers and can only be constructed by integer values. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + { } + {\Sigma \vdash i} + + \inferrule[\rn{Variable1}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v} +~ End InfRule + +The judgment form of our second type system also changes to $\Sigma \vdash e:t$ which states that under the environment $\Sigma$, the expression $e$ has the type $t$. +The rule $\rn{Integer2}\rE$ states that under environment $\Sigma$ the expression $i$ has the type $\mathsf{int}$. +The rule $\rn{Variable2}\rE$ states that under environment $\Sigma$ the expression $v$ has the type $\mathsf{int}$ if it exists in the environment $\Sigma$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v:\mathsf{int}} +~ End InfRule + +Now we add booleans to our language. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b +~ End P4Grammar + +The $\rn{Integer1}\rE$ and $\rn{Variable1}\rE$ rules do not change. +The rule $\rn{Boolean1}\rE$ states that under environment $\Sigma$ the expression $b$ is +well-typed. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + { } + {\Sigma \vdash i} + + \inferrule[\rn{Variable1}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v} + +\inferrule[\rn{Boolean1}\rE] + {\ \ \ \ } + {\Sigma \vdash b} +~ End InfRule + +The $\rn{Integer2}\rE$ stays the same. However, the type of the expression assigned to +a variable now matters. This is stated in the $\rn{Variable2}\rE$. It particularly states that under the environment $\Sigma$, the expression $v$ has the type $t$ if the type of the expression $e$ assigned to the variable $v$ is $t$. Note that in this rule, we can no longer ignore the expression assigned to variable $v$ and returned by looking up the environment since we need to know its type. +The $\rn{Boolean2}\rE$ simply states that under the environment $\Sigma$, the expression $b$ has the type $\mathsf{bool}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e \\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} +~ End InfRule + +Now we extend our language by adding the integer addition operation. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b + | e + e +~ End P4Grammar + +The first type system (that consists of rules $\rn{Integer1}\rE$, $\rn{Variable1}\rE$, and $\rn{Boolean1}\rE$ is no longer sufficient because the addition operator requires both operands not only to be well-typed but also to be an integer. + +The typing rules of the second type system stay the same. +The rule $\rn{Addition2}\rE$ states that under the environment $\Sigma$, the expression +$e_1 + e_2$ has the type $\mathsf{int}$ if both expressions $e_1$ and $e_2$ have the type $\mathsf{int}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} + + \inferrule[\rn{Addition2}\rE] + {\Sigma \vdash e_1:\mathsf{int} \\ + \Sigma \vdash e_2:\mathsf{int} } + {\Sigma \vdash e_1 + e_2 : \mathsf{int}} +~ End InfRule + +We could have restrictions on the types of subexpression. For example, assume we extend +our toy language with equality checking which checks the equality of two subexpressions of the same type. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b + | e + e + | e == e +~ End P4Grammar + +The $\rn{Equality2}\rE$ rule states that under the environment $\Sigma$, the expression +$e_1 == e_2$ has the $\mathsf{bool}$ type if expressions $e_1$ and $e_2$ both have the same type. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} + + \inferrule[\rn{Addition2}\rE] + {\Sigma \vdash e_1:\mathsf{int} \\ + \Sigma \vdash e_2:\mathsf{int} } + {\Sigma \vdash e_1 + e_2 : \mathsf{int}} + + \inferrule[\rn{Equality2}\rE] + {\Sigma \vdash e_1:t_1 \\ + \Sigma \vdash e_2:t_2 \\ + t_1 = t_2} + {\Sigma \vdash e_1 == e_2 : \mathsf{bool}} +~ End InfRule + +An inference rule is not only used for specifying types of programs. In fact, inference +rules are used to write translation of programs from one representation to another, +program syntesis, type inference, program semantics, etc. +For example, the rules below rewrite expressions in our toy language (which uses infix ordering of operators) to one that uses prefix ordering of operators +and they have the judgment form $\Sigma \vdash e \rightarrow \prim e$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to expression $\prim e$ written in the prefix ordering. + +The rules $\rn{Integer3}\rE$, $\rn{Variable3}\rE$, and $\rn{Boolean3}\rE$ are rather simple. For example, the $\rn{Integer3}\rE$ rule states that under the environment $\Sigma$, the expression $i$ translates to $i$. +The rules $\rn{Addition3}\rE$ and $\rn{Equality3}\rE$ recursively translate their subexpressions and reorder their operator. +For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ translates to the expression $+ \ \prim {e_1} \ \prim {e_2}$ where expressions $\prim {e_1}$ and $\prim {e_2}$ are the translation of expressions $e_1$ and $e_2$, respectively. + +~ Begin InfRule + \inferrule[\rn{Integer3}\rE] + { } + {\Sigma \vdash i \rightarrow i} + + \inferrule[\rn{Variable3}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v \rightarrow v} + + \inferrule[\rn{Boolean3}\rE] + { } + {\Sigma \vdash b \rightarrow b} + + \inferrule[\rn{Addition3}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1} \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}} + {\Sigma \vdash e_1 + e_2 \rightarrow \ + \ \prim {e_1} \ \prim {e_2}} + + \inferrule[\rn{Equality3}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}\\ + \Sigma \vdash e_2 \rightarrow \prim {e_2} } + {\Sigma \vdash e_1 == e_2 \rightarrow \ == \prim {e_1} \ \prim {e_2}} +~ End InfRule + +An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewritting rules shown above and they have the judgment form +$\Sigma \vdash e \rightarrow \prim e, t$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to the expression $\prim e$ written in the prefix ordering and has the type $t$. +As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Sigma$, the expression $v$ translates to itself and has the type $t$ if the variable $v$ exists in environment $\Sigma$ and expression $e$ is assigned to it which has the type $t$. + +~ Begin InfRule + \inferrule[\rn{Integer4}\rE] + { } + {\Sigma \vdash i \rightarrow i, \mathsf{int}} + + \inferrule[\rn{Variable4}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e \rightarrow \_, t} + {\Sigma \vdash v \rightarrow v, t} + + \inferrule[\rn{Boolean4}\rE] + { } + {\Sigma \vdash b \rightarrow b, \mathsf{bool}} + + \inferrule[\rn{Addition4}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}, \mathsf{int} \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}, \mathsf{int} } + {\Sigma \vdash e_1 + e_2 \rightarrow + \ \prim {e_1} \ \prim {e_2}, \mathsf{int}} + + \inferrule[\rn{Equality4}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}, t_1 \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}, t_2 \\ + t_1 = t_2} + {\Sigma \vdash e_1 == e_2 \rightarrow \ == \ \prim {e_1} \ \prim {e_2}, \mathsf{bool}} +~ End InfRule + ## Architecture { #sec-arch } Figure [#fig-arch] depicts part of Petr4's architecture that contains the type system. @@ -1869,5 +2143,16 @@ check parameter shadowing takes two lists of paramets and checks if there is any ~ End InfRule +~ Bibliography { caption:"00" } +~~Bibitem {#harper-types-PL} +Rober Harper. +Types and Prgarmming Languages. + +~~ +~~Bibitem {#wiki-type-sys} +Type System. + +~~ +~ From 8c520ddf2d105ce46329512761cb7aa09b1e3ce3 Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 13 Jul 2022 13:19:59 -0400 Subject: [PATCH 16/30] add commas where missing --- docs/petr4spec/Petr4-spec.mdk | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 7ea43f131..fb7db56e1 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -367,9 +367,9 @@ The environment $\Sigma$ is needed to keep track of variables that have been dec Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up.We only focus on expression's typing here. The judgment form of our first type systems changes to $\Sigma \vdash e$ which states that under the environment $\Sigma$, the expression $e$ is well-typed. -The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$ the expression $i$ is well-typed. +The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$, the expression $i$ is well-typed. The typing system is also extended by a rule for variable reference. -The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$ the expression $v$ is +The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$, the expression $v$ is well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its asignee expression. Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ since $i$ only stands for integers and can only be constructed by integer values. @@ -384,8 +384,8 @@ Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ sin ~ End InfRule The judgment form of our second type system also changes to $\Sigma \vdash e:t$ which states that under the environment $\Sigma$, the expression $e$ has the type $t$. -The rule $\rn{Integer2}\rE$ states that under environment $\Sigma$ the expression $i$ has the type $\mathsf{int}$. -The rule $\rn{Variable2}\rE$ states that under environment $\Sigma$ the expression $v$ has the type $\mathsf{int}$ if it exists in the environment $\Sigma$. +The rule $\rn{Integer2}\rE$ states that under environment $\Sigma$, the expression $i$ has the type $\mathsf{int}$. +The rule $\rn{Variable2}\rE$ states that under environment $\Sigma$, the expression $v$ has the type $\mathsf{int}$ if it exists in the environment $\Sigma$. ~ Begin InfRule \inferrule[\rn{Integer2}\rE] @@ -409,7 +409,7 @@ e := i ~ End P4Grammar The $\rn{Integer1}\rE$ and $\rn{Variable1}\rE$ rules do not change. -The rule $\rn{Boolean1}\rE$ states that under environment $\Sigma$ the expression $b$ is +The rule $\rn{Boolean1}\rE$ states that under environment $\Sigma$, the expression $b$ is well-typed. ~ Begin InfRule @@ -761,7 +761,7 @@ Petr4 doesn't check the length of a fixed-length integer, either signed or unsig ### Array Type { #sec-array-t } An array type has a specific type and size. -The rule $\arrayT$ states that under environment $\env$ an array is well-formed if its +The rule $\arrayT$ states that under environment $\env$, an array is well-formed if its type is well-formed and it follows the nesting rules of P4. - $\isValidNestedTyp {\typ_1} {\typ_2}$ outer inner checks whether a nested type is taking valid types as its outer ($\typ_1$) and outer ($\typ_2$) types based on [P4's description of type nesting rules][sec7-2-7]. @@ -969,7 +969,7 @@ This seems way too simple and loose.``` ### Function Type { #sec-func-t } -A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$ extended with function's type parameters. +A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$, extended with function's type parameters. ~ Begin InfRule @@ -1167,7 +1167,7 @@ contains no type synonym (_TypeName_ in Petr4) constructors that are used to giv ## List Constructor Rule { #sec-list-e } $\list {\exp_1, \ldots, \exp_n}$ constructs a list of expressions. -The rule $\listE$ states that under environment $\env$ and context $\ctxt$ +The rule $\listE$ states that under environment $\env$ and context $\ctxt$, the list $\list {\exp_1, \ldots, \exp_n}$ translates to $\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}$ in the IR and has the tuple type ${\listTyp {\typ_1} {\typ_n}}$ with direction $\less$ if each of its expressions $\exp_i \in \exps$ translate to $\prim {\exp_i}$ with type $\typ_i$ and direction $\dir_i$ under the same enviroment and context. @@ -1247,7 +1247,7 @@ The rule $\binaryOpsE$ uses two auxiliary judgments: translates the operands from the surface syntax to the IR and when applicable, it allows the operands of a binary operation to be casted to another type. It has the judgment form $\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ -which statees that under environment $\env$ and context $\ctxt$ +which statees that under environment $\env$ and context $\ctxt$, the expression $\exp$ written in the surface syntax has two operands $\exp_1$ and $\exp_2$ in the IR with types and directions $\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have @@ -1433,7 +1433,7 @@ translated type of casting type $\typ$ (that is, $\prim \typ$) is valid. of types. The [casting auxiliary judgment][#sec-cast-helper] defines rules for implicitly and/or explicitly casting one type to another. Sepcifically, the judgment -$\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$ +$\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$, the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only done implicitly or explicitly, respectively. From a20facd489c954ffc2de26d8b44cce7336a8dc61 Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 13 Jul 2022 14:34:38 -0400 Subject: [PATCH 17/30] add commas where missing --- docs/petr4spec/Petr4-spec.mdk | 1265 +++++++++++++++++---------------- 1 file changed, 636 insertions(+), 629 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index fb7db56e1..df48bb352 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -264,6 +264,8 @@ limitations. # Overview { #sec-overview } +```**TODO**: rewrite after finishing doc.``` + This document recognizes the need for having a formal type system for Petr4 and defines such type system. It is organized as follows: @@ -274,799 +276,484 @@ and understand a type system (Section [#sec-note]). - It also describes the structure of Petr4's type system (Section [#sec-petr4-type-sys]) and defines the metavariables used throughout this document (Section [#sec-metavar]). - For those interested, it connects the formalziation in this document to the impelemntation of Petr4 (Section [#sec-conn]). -## Brief Terminology Note { #sec-note } -It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages' terminology used in this document. +## Architecture { #sec-arch } -**First, what is a type?** -You can simply think of types as a set of language elements that share some features. -For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. -Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. -That is why [@harper-types-PL] states: "The central organizing principle of language desing is the dientitfication of language features with types." +Figure [#fig-arch] depicts part of Petr4's architecture that contains the type system. +After lexing and parsing a P4 program we get a program in our surface syntax. This +program is then passed through the _elaborator_ where type variables are introduced +instead of underscore and new type variable names are generated for variables with the +same name but in different scopes. This document does not discuss the innerworkings of +`elaborate`. Then, the program is passed through the type system (encoded in `checker`). +This document discusses the innerworking of the type system extensively. Finally, the +program is evaluated. -**Second, what is a type system?** -A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expression, etc[@wiki-type-sys]. -Thus, a type system can be used as a simple reasoning tool for programs of a language. -A type system formally defines many aspects of a programming language. -Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. +~ Figure { #fig-arch; caption: "Part of Petr4's achitecture." } +![arch] +~ +[arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } -**Third, what is surface syntax and intermediate representation (IR)?** -The _surface syntax_ is the syntax used to write the source program by the developer -which eventually will be passed to the compiler. -The compiler does multiple _passes_ between different representations to add or omit -information that it may or may not need. Each of these representations is called an -_intermediate representation_. -Additionally, it is important for the reader to be able to read and understand typing -rules which in essence are _inference rules_. Thus, we introduce inference rules by -building a toy language gradually -and providing its various typing rules at each step (Section [#sec-guide]). +## Petr4's Type System { #sec-petr4-type-sys } -## A Developer's Guide to Reading Inference Rules { #sec-guide } -A type system is made up of typing _rules_ that each has a specific _judgment form_. -A typing rule, in essence, is an _inference rule_. -An inference rule contains zero or more _premises_ above the line -and one _conclusion_ below the line -with the name of the rule on top or next to the line. -For example, the rule $\ruleName$ below reads as -$C$ is concluded if premises $A$ and $B$ hold. +A P4 program is mainly a list of declarations and a declaration could be declaring a +parser or control plane, instantiating an object, calling a (extern) function or method, +and defining a type or an object. Each declaration may contain multiple statements and +expressions within it. + Thus, Petr4's type system contains multiple typing judgments for +four main categories: +[types][#sec-types-typing], +[expressions][#sec-exp-typing], +[statements][#sec-stmt-typing], +and [declarations][#sec-decl-typing]. -~ Begin InfRule - \inferrule[\ruleName] - {A \\ B} - {C} -~ End InfRule +Each typing judgment may use auxiliary judgment and helper functions. The auxiliary +judgments are included in this document while the helper functions are just explained +in plain English. -A rule without any premises is called an _axiom_ and it states that -the conclusion holds uncoditionally. +Conventionally, in this document we accompany rule names with four possible suffixes: -Consider the simple toy expression language below that only consists of integers. Note -that $i$ is a _metavariable_ that represents any possible integer values. +- $\ruleNameT$ indicates that the rule is describing a rule for a type +- $\ruleNameE$ and $\ruleNameAE$ indicate that the rules are for an expression and an auxiliary judgment for an expression +- $\ruleNameS$ indicates that the rule is describing a rule for a statement +- $\ruleNameD$ indicates that the rule is describing a rule for a declaration -~ Begin P4Grammar -i := (any integer) -e := i -~ End P4Grammar +The type system conducts three tasks simultaneously: -We can have different typing systems for a language. For example, for the toy language we present two type systems. -The first one has the judgment form $e$ which states that the expression $e$ is well-typed. -For example, the rule $\rn{Integer1}\rE$ states that the expression $i$ is well-typed. Note that it does not -state what its type is. +1. It type checks P4 programs. +2. It conducts type inference. +3. It does a pass from the surface syntax to the first IR. -~ Begin InfRule - \inferrule[\rn{Integer1}\rE] - {\ \ \ \ } - {i} -~ End InfRule +```**TODO** maybe have more explanation on IR.``` -We can a more detailed type system for our langauge. -The second type system has the judgment form $e:t$ which states that the expression $e$ -is well-typed and it has the type $t$. Note that $t$ is a metavariable for all possible types of expressions. -The rule $\rn{Integer2}\rE$ states that the -expression $i$ is well-typed and it has the type $\mathsf{int}$. -~ Begin InfRule - \inferrule[\rn{Integer2}\rE] - { } - {i:\mathsf{int}} -~ End InfRule +### Metavariables { #sec-metavar } -We now extend the toy language by adding variable reference to expression which are -simply strings. +Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. -~ Begin P4Grammar -i := (any integer) -v := (any string) -e := i - | v -~ End P4Grammar +- $\overline x$ denotes a list of $x$. +- For simplicity, we omit mapping a function/judgment on a list of elements. Instead, we just apply the function/judgment to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. +- An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgements. +- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. -Now our type systems have to include an environment. -The environment $\Sigma$ is needed to keep track of variables that have been declared and assigned a value/expression. The environment is a mapping of variables to a feature about the variable. This feature can be the type of the variable, the expression it has been assigned, or the value of evaluating the expression it has been assigned. +The following describes the metavariables used in this document: -Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up.We only focus on expression's typing here. +~ Center +| **metavariable** | **type represented** | +|:----------------:|:------------------| +| $\bool$ | booleans | +| $\str$ | strings | +| $\int$ | arbitrary length integer | +| $\width$ | width of a data structure | +| $\size$ | size of a data structure | +| $\bitWidth \bit \width$ | fixed length integer | +| $\intWidth \int \width$ | signed integer | +| $\name$ | strings represing any kinds of names | +| $\typ$ | types | +| $\dir$ | directions | +| $\typVar$ | type variables | +| $\field$ | field names | +| $\env$ | environments | +| $\emp$ | empty list of elements | +~ -The judgment form of our first type systems changes to $\Sigma \vdash e$ which states that under the environment $\Sigma$, the expression $e$ is well-typed. -The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$, the expression $i$ is well-typed. -The typing system is also extended by a rule for variable reference. -The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$, the expression $v$ is -well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its asignee expression. -Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ since $i$ only stands for integers and can only be constructed by integer values. +## Connecting To The Implementation { #sec-conn } -~ Begin InfRule - \inferrule[\rn{Integer1}\rE] - { } - {\Sigma \vdash i} +The following locates each data type in the implementation +(): - \inferrule[\rn{Variable1}\rE] - {\Sigma(v)=\_} - {\Sigma \vdash v} -~ End InfRule +- The surface AST is _types.program_ +- The type of programs of the surface syntax is _types.type.t_ +- The first IR is _prog.program_ +- The type of the first IR is _prog.type.t_ +- The type system is implemented in _checker.ml_ file. -The judgment form of our second type system also changes to $\Sigma \vdash e:t$ which states that under the environment $\Sigma$, the expression $e$ has the type $t$. -The rule $\rn{Integer2}\rE$ states that under environment $\Sigma$, the expression $i$ has the type $\mathsf{int}$. -The rule $\rn{Variable2}\rE$ states that under environment $\Sigma$, the expression $v$ has the type $\mathsf{int}$ if it exists in the environment $\Sigma$. +For simplicity, we have removed the information that is needed to report when an error +happens. Such information is passed around in the surface syntax as a field (called +`tags`) of record for all data types. -~ Begin InfRule - \inferrule[\rn{Integer2}\rE] - { } - {\Sigma \vdash i:\mathsf{int}} +# Type Related Judgments { #sec-types-typing } - \inferrule[\rn{Variable2}\rE] - {\Sigma(v)=\_} - {\Sigma \vdash v:\mathsf{int}} -~ End InfRule +Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. +Additionally, it is sometimes required to check two types for equality. Petr4's type equality considers alpha equivalent[^alpha-equiv-wiki] types equal. -Now we add booleans to our language. +[^alpha-equiv-wiki]: <> -~ Begin P4Grammar -i := (any integer) -v := (any string) -b := (any boolean) -e := i - | v - | b -~ End P4Grammar -The $\rn{Integer1}\rE$ and $\rn{Variable1}\rE$ rules do not change. -The rule $\rn{Boolean1}\rE$ states that under environment $\Sigma$, the expression $b$ is -well-typed. +## Type Well-Formed Judgment { #sec-type-well-formed } -~ Begin InfRule - \inferrule[\rn{Integer1}\rE] - { } - {\Sigma \vdash i} +This judgment checks if a type is well-formed. Note that this judgment is defined over the types defined in the IR and not the surface syntax. +It has the form $\typWellFormed \typ$ which states that the type $\typ$ +is well-formed under the environment $\env$, that is, the type is syntactically correct. - \inferrule[\rn{Variable1}\rE] - {\Sigma(v)=\_} - {\Sigma \vdash v} +All typing rules first saturate all types, +that is, it eliminates all type references in type +$\typ$ and replaces them with the type they refer to. Thus, the result of saturation +contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. Then it checks the well-formedness of the saturated type. +For breviety, we don't include the saturation in rules. -\inferrule[\rn{Boolean1}\rE] - {\ \ \ \ } - {\Sigma \vdash b} -~ End InfRule +### Base Types { #sec-base-t } -The $\rn{Integer2}\rE$ stays the same. However, the type of the expression assigned to -a variable now matters. This is stated in the $\rn{Variable2}\rE$. It particularly states that under the environment $\Sigma$, the expression $v$ has the type $t$ if the type of the expression $e$ assigned to the variable $v$ is $t$. Note that in this rule, we can no longer ignore the expression assigned to variable $v$ and returned by looking up the environment since we need to know its type. -The $\rn{Boolean2}\rE$ simply states that under the environment $\Sigma$, the expression $b$ has the type $\mathsf{bool}$. +The following base types are well-formed unconditionally since there is not any room for an error while constructing a value of these types. For example, the $\boolTyp$ only has two constructors $\mathit{true}$ and $\mathit{false}$ which do not take any arguement so there is no room to construct a value incorrectly. ~ Begin InfRule - \inferrule[\rn{Integer2}\rE] + + \inferrule[\boolT] { } - {\Sigma \vdash i:\mathsf{int}} + { \typWellFormed \boolTyp } - \inferrule[\rn{Variable2}\rE] - {\Sigma(v)=e \\ - \Sigma \vdash e:t} - {\Sigma \vdash v:t} + \inferrule[\stringT] + { } + { \typWellFormed \stringTyp } - \inferrule[\rn{Boolean2}\rE] + \inferrule[\intT] { } - {\Sigma \vdash b:\mathsf{bool}} -~ End InfRule + { \typWellFormed \integerTyp } -Now we extend our language by adding the integer addition operation. + \inferrule[\varbitT] + { } + { \typWellFormed {\varBitTyp \width} } -~ Begin P4Grammar -i := (any integer) -v := (any string) -b := (any boolean) -e := i - | v - | b - | e + e -~ End P4Grammar + \inferrule[\errT] + { } + { \typWellFormed \errTyp} -The first type system (that consists of rules $\rn{Integer1}\rE$, $\rn{Variable1}\rE$, and $\rn{Boolean1}\rE$ is no longer sufficient because the addition operator requires both operands not only to be well-typed but also to be an integer. + \inferrule[\voidT] + { } + { \typWellFormed \voidTyp} -The typing rules of the second type system stay the same. -The rule $\rn{Addition2}\rE$ states that under the environment $\Sigma$, the expression -$e_1 + e_2$ has the type $\mathsf{int}$ if both expressions $e_1$ and $e_2$ have the type $\mathsf{int}$. + \inferrule[\matchKindT] + { } + { \typWellFormed \matchKindTyp} + +~ End InfRule + +``**DISCUSSION** +Petr4 doesn't check the length of a fixed-length integer, either signed or unsigned. However, P4 spec specifies that for signed integers the length must be more than 1 and for unsigned integers the length must be equal or more than zero.`` ~ Begin InfRule - \inferrule[\rn{Integer2}\rE] - { } - {\Sigma \vdash i:\mathsf{int}} - \inferrule[\rn{Variable2}\rE] - {\Sigma(v)=e\\ - \Sigma \vdash e:t} - {\Sigma \vdash v:t} + \inferrule[\intWidthT] + % { 1 < \width} % p4 spec has this + { } + { \typWellFormed {\intWidthTyp \width} } - \inferrule[\rn{Boolean2}\rE] + \inferrule[\bitWidthT] + % { 0 \leq \width} % p4 spec has this { } - {\Sigma \vdash b:\mathsf{bool}} + { \typWellFormed {\bitWidthTyp \width} } - \inferrule[\rn{Addition2}\rE] - {\Sigma \vdash e_1:\mathsf{int} \\ - \Sigma \vdash e_2:\mathsf{int} } - {\Sigma \vdash e_1 + e_2 : \mathsf{int}} ~ End InfRule -We could have restrictions on the types of subexpression. For example, assume we extend -our toy language with equality checking which checks the equality of two subexpressions of the same type. +### Array Type { #sec-array-t } -~ Begin P4Grammar -i := (any integer) -v := (any string) -b := (any boolean) -e := i - | v - | b - | e + e - | e == e -~ End P4Grammar +An array type has a specific type and size. +The rule $\arrayT$ states that under environment $\env$, an array is well-formed if its +type is well-formed and it follows the nesting rules of P4. -The $\rn{Equality2}\rE$ rule states that under the environment $\Sigma$, the expression -$e_1 == e_2$ has the $\mathsf{bool}$ type if expressions $e_1$ and $e_2$ both have the same type. +- $\isValidNestedTyp {\typ_1} {\typ_2}$ outer inner checks whether a nested type is taking valid types as its outer ($\typ_1$) and outer ($\typ_2$) types based on [P4's description of type nesting rules][sec7-2-7]. + +[sec7-2-7]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-type-nesting ~ Begin InfRule - \inferrule[\rn{Integer2}\rE] - { } - {\Sigma \vdash i:\mathsf{int}} - \inferrule[\rn{Variable2}\rE] - {\Sigma(v)=e\\ - \Sigma \vdash e:t} - {\Sigma \vdash v:t} + \inferrule[\arrayT] + { \typWellFormed \typ \\ + \isValidNestedTyp {\arrayTyp \typ \size} {\typ}} + { \typWellFormed {\arrayTyp \typ \size} } - \inferrule[\rn{Boolean2}\rE] - { } - {\Sigma \vdash b:\mathsf{bool}} +~ End InfRule - \inferrule[\rn{Addition2}\rE] - {\Sigma \vdash e_1:\mathsf{int} \\ - \Sigma \vdash e_2:\mathsf{int} } - {\Sigma \vdash e_1 + e_2 : \mathsf{int}} +### Tuple Type { #sec-tuple-t } + +Each element of a tuple can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under +environment $\env$ a tuple type is well-formed if all its types are well-formed and it +follows the nesting typing rules of P4. + +~ Begin InfRule + + \inferrule[\tupleT] + { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + 1 \leq i \leq n. \isValidNestedTyp {\tupleTyp {\typ_1} {\typ_n}} {\typ_i}} + { \typWellFormed {\tupleTyp {\typ_1} {\typ_n}} } + + % \inferrule[List] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp {\listTyp {\typ_1} {\typ_n}} {\typ_i}} + % { \typWellFormed {\listTyp {\typ_1} {\typ_n}} } - \inferrule[\rn{Equality2}\rE] - {\Sigma \vdash e_1:t_1 \\ - \Sigma \vdash e_2:t_2 \\ - t_1 = t_2} - {\Sigma \vdash e_1 == e_2 : \mathsf{bool}} ~ End InfRule -An inference rule is not only used for specifying types of programs. In fact, inference -rules are used to write translation of programs from one representation to another, -program syntesis, type inference, program semantics, etc. -For example, the rules below rewrite expressions in our toy language (which uses infix ordering of operators) to one that uses prefix ordering of operators -and they have the judgment form $\Sigma \vdash e \rightarrow \prim e$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to expression $\prim e$ written in the prefix ordering. +### Set Type { #sec-set-t } -The rules $\rn{Integer3}\rE$, $\rn{Variable3}\rE$, and $\rn{Boolean3}\rE$ are rather simple. For example, the $\rn{Integer3}\rE$ rule states that under the environment $\Sigma$, the expression $i$ translates to $i$. -The rules $\rn{Addition3}\rE$ and $\rn{Equality3}\rE$ recursively translate their subexpressions and reorder their operator. -For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ translates to the expression $+ \ \prim {e_1} \ \prim {e_2}$ where expressions $\prim {e_1}$ and $\prim {e_2}$ are the translation of expressions $e_1$ and $e_2$, respectively. +In P4, unlike tuples, elements of a set must all have the same type and the set type is well-formed if the type of its elements is well-formed, which is stated by the $\setT$ rule. ~ Begin InfRule - \inferrule[\rn{Integer3}\rE] - { } - {\Sigma \vdash i \rightarrow i} - \inferrule[\rn{Variable3}\rE] - {\Sigma(v)=\_} - {\Sigma \vdash v \rightarrow v} + \inferrule[\setT] + { \typWellFormed \typ } + { \typWellFormed {\setTyp \typ} } - \inferrule[\rn{Boolean3}\rE] +~ End InfRule + +### Enumeration Type { #sec-enum-t } + +An enumeration type contains a number of constants of string type and its declaration introduces a new identifier in the current naming scope. It could also have an underlying representation which states what is the type of its constants. +The rules below state that an enum type is well-formed if the underlying representation is well-formed, if it has one. + + +``**DISCREPENCY**`` +Petr4 doesn't allow for an enum to have default values for constants, however, P4 spec does. Here's an [example][enum-ex]. + +[enum-ex]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-enum-types + + +~ Begin InfRule + + \inferrule[\enumOneT] { } - {\Sigma \vdash b \rightarrow b} + { \typWellFormed \enumTypNoTyp } - \inferrule[\rn{Addition3}\rE] - {\Sigma \vdash e_1 \rightarrow \prim {e_1} \\ - \Sigma \vdash e_2 \rightarrow \prim {e_2}} - {\Sigma \vdash e_1 + e_2 \rightarrow \ + \ \prim {e_1} \ \prim {e_2}} + \inferrule[\enumTwoT] + { \typWellFormed \typ } + { \typWellFormed \enumTyp } - \inferrule[\rn{Equality3}\rE] - {\Sigma \vdash e_1 \rightarrow \prim {e_1}\\ - \Sigma \vdash e_2 \rightarrow \prim {e_2} } - {\Sigma \vdash e_1 == e_2 \rightarrow \ == \prim {e_1} \ \prim {e_2}} ~ End InfRule -An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewritting rules shown above and they have the judgment form -$\Sigma \vdash e \rightarrow \prim e, t$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to the expression $\prim e$ written in the prefix ordering and has the type $t$. -As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Sigma$, the expression $v$ translates to itself and has the type $t$ if the variable $v$ exists in environment $\Sigma$ and expression $e$ is assigned to it which has the type $t$. +### Record Type { #sec-record-t } + +A record has zero or more fields, which each field has a name and a type. +The rule $\recordT$ states that a record type is well-formed if all its fields have well-formed types, all fields have types that can be nested in a record, and fields have distinct names. + +Note that headers, header unions, and struct also have a record type. ~ Begin InfRule - \inferrule[\rn{Integer4}\rE] - { } - {\Sigma \vdash i \rightarrow i, \mathsf{int}} + \inferrule[\recordT] + { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + 1 \leq i \leq n. \isValidNestedTyp \recordTypDef {\typ_i} \\ + 1 \leq i < j \leq n. \field_i \neq \field_j} + { \typWellFormed \recordTypDef } - \inferrule[\rn{Variable4}\rE] - {\Sigma(v)=e\\ - \Sigma \vdash e \rightarrow \_, t} - {\Sigma \vdash v \rightarrow v, t} + % \inferrule[HeaderUnion] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \headerUnionTyp {\typ_i} \\ + % % \noDup {\field_1, \ldots, \field_n}\\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \headerUnionTyp } - \inferrule[\rn{Boolean4}\rE] - { } - {\Sigma \vdash b \rightarrow b, \mathsf{bool}} + % \inferrule[Struct] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \structTypDef {\typ_i} \\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \structTypDef } - \inferrule[\rn{Addition4}\rE] - {\Sigma \vdash e_1 \rightarrow \prim {e_1}, \mathsf{int} \\ - \Sigma \vdash e_2 \rightarrow \prim {e_2}, \mathsf{int} } - {\Sigma \vdash e_1 + e_2 \rightarrow + \ \prim {e_1} \ \prim {e_2}, \mathsf{int}} + % \inferrule[Header] + % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \headerTypDef {\typ_i} \\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + % { \typWellFormed \headerTypDef } - \inferrule[\rn{Equality4}\rE] - {\Sigma \vdash e_1 \rightarrow \prim {e_1}, t_1 \\ - \Sigma \vdash e_2 \rightarrow \prim {e_2}, t_2 \\ - t_1 = t_2} - {\Sigma \vdash e_1 == e_2 \rightarrow \ == \ \prim {e_1} \ \prim {e_2}, \mathsf{bool}} ~ End InfRule -## Architecture { #sec-arch } +### New Type Type { #sec-newtype-t } -Figure [#fig-arch] depicts part of Petr4's architecture that contains the type system. -After lexing and parsing a P4 program we get a program in our surface syntax. This -program is then passed through the _elaborator_ where type variables are introduced -instead of underscore and new type variable names are generated for variables with the -same name but in different scopes. This document does not discuss the innerworkings of -`elaborate`. Then, the program is passed through the type system (encoded in `checker`). -This document discusses the innerworking of the type system extensively. Finally, the -program is evaluated. +New type assings a name to a type. So the $\newTypeT$ checks if the assignee type $\typ$ is well-formed. -~ Figure { #fig-arch; caption: "Part of Petr4's achitecture." } -![arch] -~ -[arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } +~ Begin InfRule + \inferrule[\newTypeT] + { \typWellFormed \typ } + { \typWellFormed {\newTypeTyp \typ \name} } -## Petr4's Type System { #sec-petr4-type-sys } +~ End InfRule -A P4 program is mainly a list of declarations and a declaration could be declaring a -parser or control plane, instantiating an object, calling a (extern) function or method, -and defining a type or an object. Each declaration may contain multiple statements and -expressions within it. - Thus, Petr4's type system contains multiple typing judgments for -four main categories: -[types][#sec-types-typing], -[expressions][#sec-exp-typing], -[statements][#sec-stmt-typing], -and [declarations][#sec-decl-typing]. +### Specialized Type { #sec-specialized-t } -Each typing judgment may use auxiliary judgment and helper functions. The auxiliary -judgments are included in this document while the helper functions are just explained -in plain English. +An specialized type specifies the types of parameters in a generic type, the underlying generic type in an specialized type is called the base type. An specialized type is necessary when the compiler cannot infer type arguments. -Conventionally, in this document we accompany rule names with four possible suffixes: +The rule $\specializedExternT$ states that the specialization of an extern type is well-formed if the extern $\name$ exists in the environment $\env$ and the specialization specifies the type of all its type parameters. Similarly, the rule $\specializedRestT$ states that the specialization of a package/control/parser/function is well-formed if it specifies the type of all its type parameters. -- $\ruleNameT$ indicates that the rule is describing a rule for a type -- $\ruleNameE$ and $\ruleNameAE$ indicate that the rules are for an expression and an auxiliary judgment for an expression -- $\ruleNameS$ indicates that the rule is describing a rule for a statement -- $\ruleNameD$ indicates that the rule is describing a rule for a declaration +- Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. -The type system conducts three tasks simultaneously: -1. It type checks P4 programs. -2. It conducts type inference. -3. It does a pass from the surface syntax to the first IR. +- $\lookupEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. +- $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. -```**TODO** maybe have more explanation on IR.``` +~ Begin InfRule + \inferrule[\specializedExternT] + { \lookupEnv \name = ([\param_1, \ldots, \param_m], \_ ) \\ + 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + n = m} + { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } -### Metavariables { #sec-metavar } -Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. + \inferrule[\specializedRestT] + { \{\param_1, \ldots, \param_m \} = \getTypeParams \typ \\ + 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + n = m} + { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } -- $\overline x$ denotes a list of $x$. -- For simplicity, we omit mapping a function/judgment on a list of elements. Instead, we just apply the function/judgment to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. -- An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgements. -- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. +~ End InfRule -The following describes the metavariables used in this document: +### Package Type { #sec-package-t } -~ Center -| **metavariable** | **type represented** | -|:----------------:|:------------------| -| $\bool$ | booleans | -| $\str$ | strings | -| $\int$ | arbitrary length integer | -| $\width$ | width of a data structure | -| $\size$ | size of a data structure | -| $\bitWidth \bit \width$ | fixed length integer | -| $\intWidth \int \width$ | signed integer | -| $\name$ | strings represing any kinds of names | -| $\typ$ | types | -| $\dir$ | directions | -| $\typVar$ | type variables | -| $\field$ | field names | -| $\env$ | environments | -| $\emp$ | empty list of elements | -~ - -## Connecting To The Implementation { #sec-conn } - -The following locates each data type in the implementation -(): - -- The surface AST is _types.program_ -- The type of programs of the surface syntax is _types.type.t_ -- The first IR is _prog.program_ -- The type of the first IR is _prog.type.t_ -- The type system is implemented in _checker.ml_ file. - -For simplicity, we have removed the information that is needed to report when an error -happens. Such information is passed around in the surface syntax as a field (called -`tags`) of record for all data types. +A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. ```TODO: question for Ryan, what's the purpose of them?``` +The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are directionless and their types are well-formed. -# Type Related Judgments { #sec-types-typing } +- A parameter $\prm \ $ has direction $\dir$, type $\typ$, and name $\name$. +- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. -Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. -Additionally, it is sometimes required to check two types for equality. Petr4's type equality considers alpha equivalent[^alpha-equiv-wiki] types equal. +~ Begin InfRule -[^alpha-equiv-wiki]: <> + \inferrule[\packageT] + { 1 \leq i \leq n. \dir_i = \less \\ + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} + { \typWellFormed {\packageTyp {\typParams} {\prm 1, \ldots, \prm n} {\wildcardParams}} } +~ End InfRule -## Type Well-Formed Judgment { #sec-type-well-formed } +### Control Type { #sec-control-t } -This judgment checks if a type is well-formed. Note that this judgment is defined over the types defined in the IR and not the surface syntax. -It has the form $\typWellFormed \typ$ which states that the type $\typ$ -is well-formed under the environment $\env$, that is, the type is syntactically correct. +A control type is similar to a type signature of a function in that it defines the type parameters used in the control and its parameters, however, it does not have a return type. The rule $\controlT$ states that the control type is well-formed under the environment $\env$ extended with type variables $\typParams$ if all the types of its parameters are well-formed. -All typing rules first saturate all types, -that is, it eliminates all type references in type -$\typ$ and replaces them with the type they refer to. Thus, the result of saturation -contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. Then it checks the well-formedness of the saturated type. -For breviety, we don't include the saturation in rules. +Parsers also have a control type. -### Base Types { #sec-base-t } +``**DISCREPENCY** +P4 spec states that "The types parser, control, and package cannot be used as types of arguments for methods, parsers, controls, tables, actions. They can be used as types for the arguments passed to constructors." We could check this in the well-formedness of types or even when we're declaring a method, parser, control, table, or action, instead of when we're defining their type (make sure we're not checking it then).`` ([p4 spec ref][parser-type]) -The following base types are well-formed unconditionally since there is not any room for an error while constructing a value of these types. For example, the $\boolTyp$ only has two constructors $\mathit{true}$ and $\mathit{false}$ which do not take any arguement so there is no room to construct a value incorrectly. +[parser-type]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-parser-control-types ~ Begin InfRule - \inferrule[\boolT] - { } - { \typWellFormed \boolTyp } - - \inferrule[\stringT] - { } - { \typWellFormed \stringTyp } - - \inferrule[\intT] - { } - { \typWellFormed \integerTyp } - - \inferrule[\varbitT] - { } - { \typWellFormed {\varBitTyp \width} } + \inferrule[\controlT] + { 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} + { \typWellFormed {\controlTyp {\typParams} {\prm 1, \ldots, \prm n} } } - \inferrule[\errT] - { } - { \typWellFormed \errTyp} + % \inferrule[Parser] + % { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ + % 1 \leq i \leq n. \typWellFormedWithEnv {\prim \env} {\typ_i}} + % { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } - \inferrule[\voidT] - { } - { \typWellFormed \voidTyp} +~ End InfRule - \inferrule[\matchKindT] - { } - { \typWellFormed \matchKindTyp} +### Extern Type { #sec-extern-t } -~ End InfRule +The rule $\externT$ states that an extern type is well-formed if it has no type parameter in the environment. +lookup extern in env returns an externMethods type which includes a list of strings as +type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. -``**DISCUSSION** -Petr4 doesn't check the length of a fixed-length integer, either signed or unsigned. However, P4 spec specifies that for signed integers the length must be more than 1 and for unsigned integers the length must be equal or more than zero.`` +```**DISCUSSION** +This seems way too simple and loose.``` ~ Begin InfRule - \inferrule[\intWidthT] - % { 1 < \width} % p4 spec has this - { } - { \typWellFormed {\intWidthTyp \width} } - - \inferrule[\bitWidthT] - % { 0 \leq \width} % p4 spec has this - { } - { \typWellFormed {\bitWidthTyp \width} } + \inferrule[\externT] + { \lookupEnv \name = (\emp, \_ )} + { \typWellFormed {\externTyp \name} } ~ End InfRule -### Array Type { #sec-array-t } - -An array type has a specific type and size. -The rule $\arrayT$ states that under environment $\env$, an array is well-formed if its -type is well-formed and it follows the nesting rules of P4. - -- $\isValidNestedTyp {\typ_1} {\typ_2}$ outer inner checks whether a nested type is taking valid types as its outer ($\typ_1$) and outer ($\typ_2$) types based on [P4's description of type nesting rules][sec7-2-7]. +### Function Type { #sec-func-t } -[sec7-2-7]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-type-nesting +A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$, extended with function's type parameters. ~ Begin InfRule - \inferrule[\arrayT] + \inferrule[\functionT] { \typWellFormed \typ \\ - \isValidNestedTyp {\arrayTyp \typ \size} {\typ}} - { \typWellFormed {\arrayTyp \typ \size} } + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } + % (x1,...,xn) {...} + { \typWellFormed {\funcTyp \typ {\typParams} {\prm 1, \ldots, \prm n}} } ~ End InfRule -### Tuple Type { #sec-tuple-t } +### Action Type { #sec-action-t } -Each element of a tuple can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under -environment $\env$ a tuple type is well-formed if all its types are well-formed and it -follows the nesting typing rules of P4. +An action type defines data and control parameters and it is well-formed if the types of all parameters are well-formed and the control parameters are directionless. ~ Begin InfRule - \inferrule[\tupleT] - { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - 1 \leq i \leq n. \isValidNestedTyp {\tupleTyp {\typ_1} {\typ_n}} {\typ_i}} - { \typWellFormed {\tupleTyp {\typ_1} {\typ_n}} } - - % \inferrule[List] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp {\listTyp {\typ_1} {\typ_n}} {\typ_i}} - % { \typWellFormed {\listTyp {\typ_1} {\typ_n}} } + \inferrule[\actionT] + { 1 \leq k \leq n. \typWellFormed {\typ_k} \\ + i < k \leq n. \dir_k = \less } + { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm {i+1}, \ldots, \prm n}} } ~ End InfRule -### Set Type { #sec-set-t } +### Constructor Type { #sec-constructor-t } -In P4, unlike tuples, elements of a set must all have the same type and the set type is well-formed if the type of its elements is well-formed, which is stated by the $\setT$ rule. +The rule $\constructorT$ states that a constructor type is well-formed if its return type $\typ$ is well formed and the types of its parameters are well-formed under the environment $\env$ extended with the constructor's type parameters. Note that \_ indicates the wildcard parameters. ~ Begin InfRule - \inferrule[\setT] - { \typWellFormed \typ } - { \typWellFormed {\setTyp \typ} } + \inferrule[\constructorT] + { \typWellFormed \typ \\ + % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ + 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_n} } + { \typWellFormed {\constructorTyp \typ \name \typParams {\prm 1, \ldots, \prm n}} } ~ End InfRule -### Enumeration Type { #sec-enum-t } - -An enumeration type contains a number of constants of string type and its declaration introduces a new identifier in the current naming scope. It could also have an underlying representation which states what is the type of its constants. -The rules below state that an enum type is well-formed if the underlying representation is well-formed, if it has one. - - -``**DISCREPENCY**`` -Petr4 doesn't allow for an enum to have default values for constants, however, P4 spec does. Here's an [example][enum-ex]. +### Table Type { #sec-table-t } -[enum-ex]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-enum-types +A table type is well-formed under an environment if it exists in the environment. +- Looking up type variables returns the type assigned to it. ~ Begin InfRule - \inferrule[\enumOneT] - { } - { \typWellFormed \enumTypNoTyp } - - \inferrule[\enumTwoT] - { \typWellFormed \typ } - { \typWellFormed \enumTyp } + \inferrule[\tableT] + { \lookupEnv \name = \typ} + { \typWellFormed {\tableTyp \name} } ~ End InfRule -### Record Type { #sec-record-t } - -A record has zero or more fields, which each field has a name and a type. -The rule $\recordT$ states that a record type is well-formed if all its fields have well-formed types, all fields have types that can be nested in a record, and fields have distinct names. +### Typename Type { #sec-typename-t } -Note that headers, header unions, and struct also have a record type. +The rule $\typeNameT$ states that the type name $\name$ is well-formed under the environment $\env$ if it exists in the environment. ~ Begin InfRule - \inferrule[\recordT] - { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - 1 \leq i \leq n. \isValidNestedTyp \recordTypDef {\typ_i} \\ - 1 \leq i < j \leq n. \field_i \neq \field_j} - { \typWellFormed \recordTypDef } - - % \inferrule[HeaderUnion] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \headerUnionTyp {\typ_i} \\ - % % \noDup {\field_1, \ldots, \field_n}\\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \headerUnionTyp } - - % \inferrule[Struct] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \structTypDef {\typ_i} \\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \structTypDef } - % \inferrule[Header] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \headerTypDef {\typ_i} \\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \headerTypDef } + \inferrule[\typeNameT] + { \lookupEnv \name = \typ} + { \typWellFormed {\typNameTyp \name} } ~ End InfRule -### New Type Type { #sec-newtype-t } +## Type Equality Judgment { #sec-type-eq } +```**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. ``` -New type assings a name to a type. So the $\newTypeT$ checks if the assignee type $\typ$ is well-formed. +- The [type equality judgment][#sec-type-eq] checks the equality of two types. It has +the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. -~ Begin InfRule - \inferrule[\newTypeT] - { \typWellFormed \typ } - { \typWellFormed {\newTypeTyp \typ \name} } +# Expression's Typing Rules { #sec-exp-typing } -~ End InfRule +The judgment form +$\expenv {\exp} {\prim \exp} \typ \dir $ states that expression $\exp$ +written in surface syntax translates to expression $\prim \exp$ in the IR syntax with +the type $\typ$ and direction $\dir$ under environment $\env$. For now, we do not +present the syntax of the surface syntax and IR. Note that there is not much difference +between the two. -### Specialized Type { #sec-specialized-t } +```**TODO** We plan to add the abstract syntax of them in appendix later.``` -An specialized type specifies the types of parameters in a generic type, the underlying generic type in an specialized type is called the base type. An specialized type is necessary when the compiler cannot infer type arguments. +``**Restriction**`` +Petr4 doesn't have the product operation where multiple sets can be combined using +cartesian product and the type of a product of sets is a set of tuples. (refer to +section 8.12.5. of P4 spec (**DISCUSS**)) -The rule $\specializedExternT$ states that the specialization of an extern type is well-formed if the extern $\name$ exists in the environment $\env$ and the specialization specifies the type of all its type parameters. Similarly, the rule $\specializedRestT$ states that the specialization of a package/control/parser/function is well-formed if it specifies the type of all its type parameters. +``**NOTE**`` +I couldn't find the followings in section 8 of p4 spec: +array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). -- Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. +## Boolean, String, and Integer Constructor Rules { #sec-base-const-e } -- $\lookupEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. -- $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. - -~ Begin InfRule - - \inferrule[\specializedExternT] - { \lookupEnv \name = ([\param_1, \ldots, \param_m], \_ ) \\ - 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - n = m} - { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } - - - \inferrule[\specializedRestT] - { \{\param_1, \ldots, \param_m \} = \getTypeParams \typ \\ - 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - n = m} - { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } - -~ End InfRule - -### Package Type { #sec-package-t } - -A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. ```TODO: question for Ryan, what's the purpose of them?``` -The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are directionless and their types are well-formed. - -- A parameter $\prm \ $ has direction $\dir$, type $\typ$, and name $\name$. -- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. - -~ Begin InfRule - - \inferrule[\packageT] - { 1 \leq i \leq n. \dir_i = \less \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} - { \typWellFormed {\packageTyp {\typParams} {\prm 1, \ldots, \prm n} {\wildcardParams}} } - -~ End InfRule - -### Control Type { #sec-control-t } - -A control type is similar to a type signature of a function in that it defines the type parameters used in the control and its parameters, however, it does not have a return type. The rule $\controlT$ states that the control type is well-formed under the environment $\env$ extended with type variables $\typParams$ if all the types of its parameters are well-formed. - -Parsers also have a control type. - -``**DISCREPENCY** -P4 spec states that "The types parser, control, and package cannot be used as types of arguments for methods, parsers, controls, tables, actions. They can be used as types for the arguments passed to constructors." We could check this in the well-formedness of types or even when we're declaring a method, parser, control, table, or action, instead of when we're defining their type (make sure we're not checking it then).`` ([p4 spec ref][parser-type]) - -[parser-type]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-parser-control-types - -~ Begin InfRule - - \inferrule[\controlT] - { 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} - { \typWellFormed {\controlTyp {\typParams} {\prm 1, \ldots, \prm n} } } - - % \inferrule[Parser] - % { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - % 1 \leq i \leq n. \typWellFormedWithEnv {\prim \env} {\typ_i}} - % { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } - -~ End InfRule - -### Extern Type { #sec-extern-t } - -The rule $\externT$ states that an extern type is well-formed if it has no type parameter in the environment. -lookup extern in env returns an externMethods type which includes a list of strings as -type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. - -```**DISCUSSION** -This seems way too simple and loose.``` - -~ Begin InfRule - - \inferrule[\externT] - { \lookupEnv \name = (\emp, \_ )} - { \typWellFormed {\externTyp \name} } - -~ End InfRule - -### Function Type { #sec-func-t } - -A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$, extended with function's type parameters. - -~ Begin InfRule - - \inferrule[\functionT] - { \typWellFormed \typ \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } - % (x1,...,xn) {...} - { \typWellFormed {\funcTyp \typ {\typParams} {\prm 1, \ldots, \prm n}} } - -~ End InfRule - -### Action Type { #sec-action-t } - -An action type defines data and control parameters and it is well-formed if the types of all parameters are well-formed and the control parameters are directionless. - -~ Begin InfRule - - \inferrule[\actionT] - { 1 \leq k \leq n. \typWellFormed {\typ_k} \\ - i < k \leq n. \dir_k = \less } - { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm {i+1}, \ldots, \prm n}} } - -~ End InfRule - -### Constructor Type { #sec-constructor-t } - -The rule $\constructorT$ states that a constructor type is well-formed if its return type $\typ$ is well formed and the types of its parameters are well-formed under the environment $\env$ extended with the constructor's type parameters. Note that \_ indicates the wildcard parameters. - -~ Begin InfRule - - \inferrule[\constructorT] - { \typWellFormed \typ \\ - % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_n} } - { \typWellFormed {\constructorTyp \typ \name \typParams {\prm 1, \ldots, \prm n}} } - -~ End InfRule - -### Table Type { #sec-table-t } - -A table type is well-formed under an environment if it exists in the environment. - -- Looking up type variables returns the type assigned to it. - -~ Begin InfRule - - \inferrule[\tableT] - { \lookupEnv \name = \typ} - { \typWellFormed {\tableTyp \name} } - -~ End InfRule - -### Typename Type { #sec-typename-t } - -The rule $\typeNameT$ states that the type name $\name$ is well-formed under the environment $\env$ if it exists in the environment. - -~ Begin InfRule - - \inferrule[\typeNameT] - { \lookupEnv \name = \typ} - { \typWellFormed {\typNameTyp \name} } - -~ End InfRule - -## Type Equality Judgment { #sec-type-eq } -```**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. ``` - -- The [type equality judgment][#sec-type-eq] checks the equality of two types. It has -the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. - - -# Expression's Typing Rules { #sec-exp-typing } - -The judgment form -$\expenv {\exp} {\prim \exp} \typ \dir $ states that expression $\exp$ -written in surface syntax translates to expression $\prim \exp$ in the IR syntax with -the type $\typ$ and direction $\dir$ under environment $\env$. For now, we do not -present the syntax of the surface syntax and IR. Note that there is not much difference -between the two. - -```**TODO** We plan to add the abstract syntax of them in appendix later.``` - -``**Restriction**`` -Petr4 doesn't have the product operation where multiple sets can be combined using -cartesian product and the type of a product of sets is a set of tuples. (refer to -section 8.12.5. of P4 spec (**DISCUSS**)) - -``**NOTE**`` -I couldn't find the followings in section 8 of p4 spec: -array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). - - -## Boolean, String, and Integer Constructor Rules { #sec-base-const-e } - -Base constructors such as boolean, string, and all integer constructors simply construct values of their type. -The rule $\boolE$ states that a boolean expression in surface syntax has the type $\boolTyp$, it translates to the same boolean expression in the IR syntax, and has the $\less$ direction. -The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar to $\boolE$. +Base constructors such as boolean, string, and all integer constructors simply construct values of their type. +The rule $\boolE$ states that a boolean expression in surface syntax has the type $\boolTyp$, it translates to the same boolean expression in the IR syntax, and has the $\less$ direction. +The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar to $\boolE$. ~ Begin InfRule @@ -2143,6 +1830,8 @@ check parameter shadowing takes two lists of paramets and checks if there is any ~ End InfRule +# References { #sec-references } + ~ Bibliography { caption:"00" } ~~Bibitem {#harper-types-PL} Rober Harper. @@ -2155,4 +1844,322 @@ Type System. ~~ ~ +# Appendix: Notation and Terminology { #sec-notation } + +## Brief Terminology Note { #sec-note } + +It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages' terminology used in this document. + +**First, what is a type?** +You can simply think of types as a set of language elements that share some features. +For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. +Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. +That is why [@harper-types-PL] states: "The central organizing principle of language desing is the dientitfication of language features with types." + +**Second, what is a type system?** +A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expression, etc[@wiki-type-sys]. +Thus, a type system can be used as a simple reasoning tool for programs of a language. +A type system formally defines many aspects of a programming language. +Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. + +**Third, what is surface syntax and intermediate representation (IR)?** +The _surface syntax_ is the syntax used to write the source program by the developer +which eventually will be passed to the compiler. +The compiler does multiple _passes_ between different representations to add or omit +information that it may or may not need. Each of these representations is called an +_intermediate representation_. + +Additionally, it is important for the reader to be able to read and understand typing +rules which in essence are _inference rules_. Thus, we introduce inference rules by +building a toy language gradually +and providing its various typing rules at each step (Section [#sec-guide]). + +## A Developer's Guide to Reading Inference Rules { #sec-guide } +A type system is made up of typing _rules_ that each has a specific _judgment form_. +A typing rule, in essence, is an _inference rule_. +An inference rule contains zero or more _premises_ above the line +and one _conclusion_ below the line +with the name of the rule on top or next to the line. +For example, the rule $\ruleName$ below reads as +$C$ is concluded if premises $A$ and $B$ hold. + +~ Begin InfRule + \inferrule[\ruleName] + {A \\ B} + {C} +~ End InfRule + +A rule without any premises is called an _axiom_ and it states that +the conclusion holds uncoditionally. + +Consider the simple toy expression language below that only consists of integers. Note +that $i$ is a _metavariable_ that represents any possible integer values. + +~ Begin P4Grammar +i := (any integer) +e := i +~ End P4Grammar + +We can have different typing systems for a language. For example, for the toy language we present two type systems. +The first one has the judgment form $e$ which states that the expression $e$ is well-typed. +For example, the rule $\rn{Integer1}\rE$ states that the expression $i$ is well-typed. Note that it does not +state what its type is. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + {\ \ \ \ } + {i} +~ End InfRule + +We can a more detailed type system for our langauge. +The second type system has the judgment form $e:t$ which states that the expression $e$ +is well-typed and it has the type $t$. Note that $t$ is a metavariable for all possible types of expressions. +The rule $\rn{Integer2}\rE$ states that the +expression $i$ is well-typed and it has the type $\mathsf{int}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {i:\mathsf{int}} +~ End InfRule + +We now extend the toy language by adding variable reference to expression which are +simply strings. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +e := i + | v +~ End P4Grammar + +Now our type systems have to include an environment. +The environment $\Sigma$ is needed to keep track of variables that have been declared and assigned a value/expression. The environment is a mapping of variables to a feature about the variable. This feature can be the type of the variable, the expression it has been assigned, or the value of evaluating the expression it has been assigned. + +Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up.We only focus on expression's typing here. + +The judgment form of our first type systems changes to $\Sigma \vdash e$ which states that under the environment $\Sigma$, the expression $e$ is well-typed. +The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$, the expression $i$ is well-typed. +The typing system is also extended by a rule for variable reference. +The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$, the expression $v$ is +well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its asignee expression. +Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ since $i$ only stands for integers and can only be constructed by integer values. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + { } + {\Sigma \vdash i} + + \inferrule[\rn{Variable1}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v} +~ End InfRule + +The judgment form of our second type system also changes to $\Sigma \vdash e:t$ which states that under the environment $\Sigma$, the expression $e$ has the type $t$. +The rule $\rn{Integer2}\rE$ states that under environment $\Sigma$, the expression $i$ has the type $\mathsf{int}$. +The rule $\rn{Variable2}\rE$ states that under environment $\Sigma$, the expression $v$ has the type $\mathsf{int}$ if it exists in the environment $\Sigma$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v:\mathsf{int}} +~ End InfRule + +Now we add booleans to our language. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b +~ End P4Grammar + +The $\rn{Integer1}\rE$ and $\rn{Variable1}\rE$ rules do not change. +The rule $\rn{Boolean1}\rE$ states that under environment $\Sigma$, the expression $b$ is +well-typed. + +~ Begin InfRule + \inferrule[\rn{Integer1}\rE] + { } + {\Sigma \vdash i} + + \inferrule[\rn{Variable1}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v} + +\inferrule[\rn{Boolean1}\rE] + {\ \ \ \ } + {\Sigma \vdash b} +~ End InfRule + +The $\rn{Integer2}\rE$ stays the same. However, the type of the expression assigned to +a variable now matters. This is stated in the $\rn{Variable2}\rE$. It particularly states that under the environment $\Sigma$, the expression $v$ has the type $t$ if the type of the expression $e$ assigned to the variable $v$ is $t$. Note that in this rule, we can no longer ignore the expression assigned to variable $v$ and returned by looking up the environment since we need to know its type. +The $\rn{Boolean2}\rE$ simply states that under the environment $\Sigma$, the expression $b$ has the type $\mathsf{bool}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e \\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} +~ End InfRule + +Now we extend our language by adding the integer addition operation. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b + | e + e +~ End P4Grammar + +The first type system (that consists of rules $\rn{Integer1}\rE$, $\rn{Variable1}\rE$, and $\rn{Boolean1}\rE$ is no longer sufficient because the addition operator requires both operands not only to be well-typed but also to be an integer. + +The typing rules of the second type system stay the same. +The rule $\rn{Addition2}\rE$ states that under the environment $\Sigma$, the expression +$e_1 + e_2$ has the type $\mathsf{int}$ if both expressions $e_1$ and $e_2$ have the type $\mathsf{int}$. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} + + \inferrule[\rn{Addition2}\rE] + {\Sigma \vdash e_1:\mathsf{int} \\ + \Sigma \vdash e_2:\mathsf{int} } + {\Sigma \vdash e_1 + e_2 : \mathsf{int}} +~ End InfRule + +We could have restrictions on the types of subexpression. For example, assume we extend +our toy language with equality checking which checks the equality of two subexpressions of the same type. + +~ Begin P4Grammar +i := (any integer) +v := (any string) +b := (any boolean) +e := i + | v + | b + | e + e + | e == e +~ End P4Grammar + +The $\rn{Equality2}\rE$ rule states that under the environment $\Sigma$, the expression +$e_1 == e_2$ has the $\mathsf{bool}$ type if expressions $e_1$ and $e_2$ both have the same type. + +~ Begin InfRule + \inferrule[\rn{Integer2}\rE] + { } + {\Sigma \vdash i:\mathsf{int}} + + \inferrule[\rn{Variable2}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e:t} + {\Sigma \vdash v:t} + + \inferrule[\rn{Boolean2}\rE] + { } + {\Sigma \vdash b:\mathsf{bool}} + + \inferrule[\rn{Addition2}\rE] + {\Sigma \vdash e_1:\mathsf{int} \\ + \Sigma \vdash e_2:\mathsf{int} } + {\Sigma \vdash e_1 + e_2 : \mathsf{int}} + + \inferrule[\rn{Equality2}\rE] + {\Sigma \vdash e_1:t_1 \\ + \Sigma \vdash e_2:t_2 \\ + t_1 = t_2} + {\Sigma \vdash e_1 == e_2 : \mathsf{bool}} +~ End InfRule + +An inference rule is not only used for specifying types of programs. In fact, inference +rules are used to write translation of programs from one representation to another, +program syntesis, type inference, program semantics, etc. +For example, the rules below rewrite expressions in our toy language (which uses infix ordering of operators) to one that uses prefix ordering of operators +and they have the judgment form $\Sigma \vdash e \rightarrow \prim e$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to expression $\prim e$ written in the prefix ordering. + +The rules $\rn{Integer3}\rE$, $\rn{Variable3}\rE$, and $\rn{Boolean3}\rE$ are rather simple. For example, the $\rn{Integer3}\rE$ rule states that under the environment $\Sigma$, the expression $i$ translates to $i$. +The rules $\rn{Addition3}\rE$ and $\rn{Equality3}\rE$ recursively translate their subexpressions and reorder their operator. +For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ translates to the expression $+ \ \prim {e_1} \ \prim {e_2}$ where expressions $\prim {e_1}$ and $\prim {e_2}$ are the translation of expressions $e_1$ and $e_2$, respectively. + +~ Begin InfRule + \inferrule[\rn{Integer3}\rE] + { } + {\Sigma \vdash i \rightarrow i} + + \inferrule[\rn{Variable3}\rE] + {\Sigma(v)=\_} + {\Sigma \vdash v \rightarrow v} + + \inferrule[\rn{Boolean3}\rE] + { } + {\Sigma \vdash b \rightarrow b} + + \inferrule[\rn{Addition3}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1} \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}} + {\Sigma \vdash e_1 + e_2 \rightarrow \ + \ \prim {e_1} \ \prim {e_2}} + + \inferrule[\rn{Equality3}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}\\ + \Sigma \vdash e_2 \rightarrow \prim {e_2} } + {\Sigma \vdash e_1 == e_2 \rightarrow \ == \prim {e_1} \ \prim {e_2}} +~ End InfRule + +An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewritting rules shown above and they have the judgment form +$\Sigma \vdash e \rightarrow \prim e, t$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to the expression $\prim e$ written in the prefix ordering and has the type $t$. +As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Sigma$, the expression $v$ translates to itself and has the type $t$ if the variable $v$ exists in environment $\Sigma$ and expression $e$ is assigned to it which has the type $t$. + +~ Begin InfRule + \inferrule[\rn{Integer4}\rE] + { } + {\Sigma \vdash i \rightarrow i, \mathsf{int}} + + \inferrule[\rn{Variable4}\rE] + {\Sigma(v)=e\\ + \Sigma \vdash e \rightarrow \_, t} + {\Sigma \vdash v \rightarrow v, t} + + \inferrule[\rn{Boolean4}\rE] + { } + {\Sigma \vdash b \rightarrow b, \mathsf{bool}} + + \inferrule[\rn{Addition4}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}, \mathsf{int} \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}, \mathsf{int} } + {\Sigma \vdash e_1 + e_2 \rightarrow + \ \prim {e_1} \ \prim {e_2}, \mathsf{int}} + + \inferrule[\rn{Equality4}\rE] + {\Sigma \vdash e_1 \rightarrow \prim {e_1}, t_1 \\ + \Sigma \vdash e_2 \rightarrow \prim {e_2}, t_2 \\ + t_1 = t_2} + {\Sigma \vdash e_1 == e_2 \rightarrow \ == \ \prim {e_1} \ \prim {e_2}, \mathsf{bool}} +~ End InfRule + From ea8042b44a460acda01dbbacdeb2c850fd9fe142 Mon Sep 17 00:00:00 2001 From: pataei Date: Mon, 18 Jul 2022 15:56:27 -0400 Subject: [PATCH 18/30] bunch of formatting and refactoring of rules --- docs/petr4spec/Petr4-spec.mdk | 1171 ++++++++++++++++++++------------- docs/petr4spec/ops.tex | 154 +++-- 2 files changed, 820 insertions(+), 505 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index df48bb352..8714b8392 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -5,6 +5,7 @@ Affiliation : Cornell University Heading depth : 5 Cite Style : numeric BibTex : False +Bib : reference Math Mode : static Pdf Latex : xelatex @@ -372,6 +373,11 @@ For simplicity, we have removed the information that is needed to report when an happens. Such information is passed around in the surface syntax as a field (called `tags`) of record for all data types. +### Judgment signatures +``TODO`` + +### contexts and environments + # Type Related Judgments { #sec-types-typing } Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. @@ -398,33 +404,40 @@ The following base types are well-formed unconditionally since there is not any ~ Begin InfRule - \inferrule[\boolT] + \inferrule { } { \typWellFormed \boolTyp } + \quad (\boolT) - \inferrule[\stringT] + \inferrule { } { \typWellFormed \stringTyp } + \quad (\stringT) - \inferrule[\intT] + \inferrule { } { \typWellFormed \integerTyp } + \quad (\intT) - \inferrule[\varbitT] + \inferrule { } { \typWellFormed {\varBitTyp \width} } + \quad (\varbitT) - \inferrule[\errT] + \inferrule { } { \typWellFormed \errTyp} + \quad (\errT) - \inferrule[\voidT] + \inferrule { } { \typWellFormed \voidTyp} + \quad (\voidT) - \inferrule[\matchKindT] + \inferrule { } { \typWellFormed \matchKindTyp} + \quad (\matchKindT) ~ End InfRule @@ -433,15 +446,17 @@ Petr4 doesn't check the length of a fixed-length integer, either signed or unsig ~ Begin InfRule - \inferrule[\intWidthT] + \inferrule % { 1 < \width} % p4 spec has this { } { \typWellFormed {\intWidthTyp \width} } + \quad (\intWidthT) - \inferrule[\bitWidthT] + \inferrule % { 0 \leq \width} % p4 spec has this { } { \typWellFormed {\bitWidthTyp \width} } + \quad (\bitWidthT) ~ End InfRule @@ -451,31 +466,35 @@ An array type has a specific type and size. The rule $\arrayT$ states that under environment $\env$, an array is well-formed if its type is well-formed and it follows the nesting rules of P4. -- $\isValidNestedTyp {\typ_1} {\typ_2}$ outer inner checks whether a nested type is taking valid types as its outer ($\typ_1$) and outer ($\typ_2$) types based on [P4's description of type nesting rules][sec7-2-7]. +- $\isValidNestedTyp \typ$ checks whether the nested type $\typ$ is valid, that is, +it checks if all the subtypes in the type $\typ$ can actually be inner types of $\typ$ based on [P4's description of type nesting rules][sec7-2-7]. [sec7-2-7]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-type-nesting ~ Begin InfRule - \inferrule[\arrayT] + \inferrule { \typWellFormed \typ \\ - \isValidNestedTyp {\arrayTyp \typ \size} {\typ}} + \isValidNestedTyp {\arrayTyp \typ \size}} { \typWellFormed {\arrayTyp \typ \size} } + \quad (\arrayT) ~ End InfRule ### Tuple Type { #sec-tuple-t } Each element of a tuple can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under -environment $\env$ a tuple type is well-formed if all its types are well-formed and it +environment $\env$, a tuple type is well-formed if all its types are well-formed and it follows the nesting typing rules of P4. ~ Begin InfRule - \inferrule[\tupleT] - { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - 1 \leq i \leq n. \isValidNestedTyp {\tupleTyp {\typ_1} {\typ_n}} {\typ_i}} - { \typWellFormed {\tupleTyp {\typ_1} {\typ_n}} } + \inferrule + { \typWellFormed \typs \\ + % \forallcond \typ \typs + \isValidNestedTyp {\tupleTyps \typs}} + { \typWellFormed {\tupleTyps \typs} } + \quad (\tupleT) % \inferrule[List] % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ @@ -490,9 +509,10 @@ In P4, unlike tuples, elements of a set must all have the same type and the set ~ Begin InfRule - \inferrule[\setT] + \inferrule { \typWellFormed \typ } { \typWellFormed {\setTyp \typ} } + \quad (\setT) ~ End InfRule @@ -510,13 +530,15 @@ Petr4 doesn't allow for an enum to have default values for constants, however, P ~ Begin InfRule - \inferrule[\enumOneT] + \inferrule { } - { \typWellFormed \enumTypNoTyp } + { \typWellFormed \enumTypNoTypDef } + \quad (\enumOneT) - \inferrule[\enumTwoT] + \inferrule { \typWellFormed \typ } - { \typWellFormed \enumTyp } + { \typWellFormed \enumTypDef } + \quad (\enumTwoT) ~ End InfRule @@ -527,12 +549,18 @@ The rule $\recordT$ states that a record type is well-formed if all its fields h Note that headers, header unions, and struct also have a record type. +- $\noDup \names$ checks that there is no duplicate name in $\names$. + ~ Begin InfRule - \inferrule[\recordT] - { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - 1 \leq i \leq n. \isValidNestedTyp \recordTypDef {\typ_i} \\ - 1 \leq i < j \leq n. \field_i \neq \field_j} - { \typWellFormed \recordTypDef } + \inferrule + { \typWellFormed \typs \\ + \isValidNestedTyp \recordTyps \\ + \noDup \fields} + % 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + % 1 \leq i \leq n. \isValidNestedTyp \recordTypDef \\ + % 1 \leq i < j \leq n. \field_i \neq \field_j} + { \typWellFormed \recordTyps } + \quad (\recordT) % \inferrule[HeaderUnion] % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ @@ -561,9 +589,10 @@ New type assings a name to a type. So the $\newTypeT$ checks if the assignee typ ~ Begin InfRule - \inferrule[\newTypeT] + \inferrule { \typWellFormed \typ } { \typWellFormed {\newTypeTyp \typ \name} } + \quad (\newTypeT) ~ End InfRule @@ -581,18 +610,21 @@ The rule $\specializedExternT$ states that the specialization of an extern type ~ Begin InfRule - \inferrule[\specializedExternT] - { \lookupEnv \name = ([\param_1, \ldots, \param_m], \_ ) \\ - 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - n = m} - { \typWellFormed {\spcTyp {\externTyp \name} {\typ_1, \ldots, \typ_n}} } + \inferrule + { \lookupEnv \name = ([\params], \_ ) \\ + % 1 \leq i \leq n. \typWellFormed {\typ_i} \\ + \typWellFormed \typs\\ + |\typs| = |\params|} + { \typWellFormed {\spcTyp {\externTyp \name} \typs} } + \quad (\specializedExternT) - \inferrule[\specializedRestT] - { \{\param_1, \ldots, \param_m \} = \getTypeParams \typ \\ - 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - n = m} - { \typWellFormed {\spcTyp \typ {\typ_1, \ldots, \typ_n}} } + \inferrule + { \getTypeParams \typ = \{\params\}\\ + \typWellFormed {\typs} \\ + |\params| = |\typs|} + { \typWellFormed {\spcTyp \typ {\typs}} } + \quad (\specializedRestT) ~ End InfRule @@ -601,15 +633,18 @@ The rule $\specializedExternT$ states that the specialization of an extern type A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. ```TODO: question for Ryan, what's the purpose of them?``` The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are directionless and their types are well-formed. -- A parameter $\prm \ $ has direction $\dir$, type $\typ$, and name $\name$. -- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. +- A parameter $\singleprm$ has direction $\dir$, type $\typ$, and name $\name$. +- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. +- $\isDirectionless \dir$ checks that the direction $\dir$ is $\less$, that is, $\dir = \less$. ~ Begin InfRule - \inferrule[\packageT] - { 1 \leq i \leq n. \dir_i = \less \\ + \inferrule + { \isDirectionless \dirs \\ + % 1 \leq i \leq n. \dir_i = \less \\ 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} - { \typWellFormed {\packageTyp {\typParams} {\prm 1, \ldots, \prm n} {\wildcardParams}} } + { \typWellFormed {\packageTyp {\typParams} {\prms} {\wildcardParams}} } + \quad (\packageT) ~ End InfRule @@ -626,9 +661,10 @@ P4 spec states that "The types parser, control, and package cannot be used as ty ~ Begin InfRule - \inferrule[\controlT] - { 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} - { \typWellFormed {\controlTyp {\typParams} {\prm 1, \ldots, \prm n} } } + \inferrule + {\typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs}} + { \typWellFormed {\controlTyp {\typParams} {\prms} } } + \quad (\controlT) % \inferrule[Parser] % { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ @@ -648,9 +684,10 @@ This seems way too simple and loose.``` ~ Begin InfRule - \inferrule[\externT] + \inferrule { \lookupEnv \name = (\emp, \_ )} { \typWellFormed {\externTyp \name} } + \quad (\externT) ~ End InfRule @@ -660,11 +697,13 @@ A function type describes the return type of the function, its type parameters, ~ Begin InfRule - \inferrule[\functionT] + \inferrule { \typWellFormed \typ \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } + \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} \typs} + % 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } % (x1,...,xn) {...} - { \typWellFormed {\funcTyp \typ {\typParams} {\prm 1, \ldots, \prm n}} } + { \typWellFormed {\funcTyp \typ {\typParams} {\prms}} } + \quad (\functionT) ~ End InfRule @@ -674,10 +713,13 @@ An action type defines data and control parameters and it is well-formed if the ~ Begin InfRule - \inferrule[\actionT] - { 1 \leq k \leq n. \typWellFormed {\typ_k} \\ - i < k \leq n. \dir_k = \less } - { \typWellFormed {\actionTyp {\prm 1, \ldots, \prm i} {\prm {i+1}, \ldots, \prm n}} } + \inferrule + { \typWellFormed {\typs} \\ + \typWellFormed {\overline {\prim \typ}} \\ + \isDirectionless \dirs \\ + \isDirectionless {\overline {\prim \dir}}} + { \typWellFormed {\actionTyp {\prms} {\prmss}} } + \quad (\actionT) ~ End InfRule @@ -687,11 +729,12 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re ~ Begin InfRule - \inferrule[\constructorT] + \inferrule { \typWellFormed \typ \\ % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_n} } - { \typWellFormed {\constructorTyp \typ \name \typParams {\prm 1, \ldots, \prm n}} } + \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs} } + { \typWellFormed {\constructorTyp \typ \name \typParams {\prms}} } + \quad (\constructorT) ~ End InfRule @@ -703,9 +746,10 @@ A table type is well-formed under an environment if it exists in the environment ~ Begin InfRule - \inferrule[\tableT] + \inferrule { \lookupEnv \name = \typ} { \typWellFormed {\tableTyp \name} } + \quad (\tableT) ~ End InfRule @@ -715,9 +759,10 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the ~ Begin InfRule - \inferrule[\typeNameT] + \inferrule { \lookupEnv \name = \typ} { \typWellFormed {\typNameTyp \name} } + \quad (\typeNameT) ~ End InfRule @@ -757,25 +802,30 @@ The rules $\stringE$, $\integerE$, $\bitStringE$, and $\signedIntE$ are similar ~ Begin InfRule - \inferrule[\boolE] + \inferrule { } {\expenv \bool \bool \boolTyp \less} + \quad (\boolE) - \inferrule[\stringE] + \inferrule { } {\expenv \str \str \stringTyp \less} + \quad (\stringE) - \inferrule[\integerE] + \inferrule { } {\expenv \int \int \integerTyp \less} + \quad (\integerE) - \inferrule[\bitStringE] + \inferrule { } {\expenv {\bitWidth \bit \width} {\bitWidth \bit \width} {\bitWidthTyp \width} \less} + \quad (\bitStringE) - \inferrule[\signedIntE] + \inferrule { } {\expenv {\intWidth \int \width} {\intWidth \int \width} {\intWidthTyp \width} {\less}} + \quad (\signedIntE) ~ End InfRule @@ -792,9 +842,10 @@ $\name$ in the environment $\env$ and it has the type $\typ$ and direction $\dir ~ Begin InfRule - \inferrule[\nameE] + \inferrule {\lookupEnv \name = (\typ, \dir)} {\expenv \name \name \typ \dir} + \quad (\nameE) ~ End InfRule @@ -812,12 +863,13 @@ unsigned integer or arbitrary precision integer. ~ Begin InfRule - \inferrule[\arrayAccessE] - {\expenv {\exp_1} {\prim {\exp_1}} {\arrayTyp \typ \size} \dir \\ - \expenv {\exp_2} {\prim {\exp_2}} {\prim \typ} {\prim \dir} \\ + \inferrule + {\expenv {\exp_1} {\prim {\exp_1}} {\arrayTyp \typ \size} \dir \\\\ + \expenv {\exp_2} {\prim {\exp_2}} {\prim \typ} {\prim \dir} \\\\ % \isArray {\arrayTyp \typ \size} \\ \isNumeric {\prim \typ}} {\expenv {\arrayAccess {\exp_1} {\exp_2}} {\arrayAccess {\prim {\exp_1}} {\prim {\exp_2}}} \typ \dir } + \quad (\arrayAccessE) ~ End InfRule @@ -826,6 +878,8 @@ unsigned integer or arbitrary precision integer. $\bitStringAccess {\exp_1} {\exp_2} {\exp_3}$ denotes slicing a the bitstring $\exp_1$ from bit $\exp_2$ to $\exp_3$. The rule $\bitStringAccessE$ states that accessing $\exp_2$ to $\exp_1$ from the bit string $\exp_1$ translates to accessing $\int_1$ to $\int_2$ from the bit string $\prim {\exp_1}$ which has the type bit string of length $\int_2 - \int_1$ if $\exp_1$ either has the type $\bitWidthTyp \width$ or $\intWidthTyp \width$ and both expressions $\exp_2$ and $\exp_3$ are of numeric types under the $\cte$ context and their values can be known at the compile time and the values respectively are $\int_1$ and $\int_2$. It only makes sense that when slicing (accessing) a bit string, the start $\int_1$ must be smaller than or equal to the end of access $\int_2$ and both must be smaller than the length of the bit string $\width$. +- $\widthInt \typ$ checks if the type $\typ$ is a fixed-length integer, that is, +if it is either $\bitWidthTyp \width$ or $\intWidthTyp \width$ and returns its width. - $\sat \typ$ satuarates a type. Remember that saturating a type eliminates all type references in type $\typ$ and replaces them with the type they refer to. Thus, the result of saturation @@ -835,47 +889,51 @@ contains no type synonym (_TypeName_ in Petr4) constructors that are used to giv ~ Begin InfRule - \inferrule[\bitStringAccessE] - {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \reduce {\typ_1} = \intWidthTyp \width \textOr \bitWidthTyp \width\\ - \expenvWithCtxt \cte {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ + \inferrule + {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\\\ + \expenvWithCtxt \cte {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\\\ + \expenvWithCtxt \cte {\exp_3} {\prim {\exp_3}} {\typ_3} {\dir_3} \\\\ + \widthInt {\reduce {\typ_1}} = \width \\\\ + % = \intWidthTyp \width \textOr \bitWidthTyp \width\\ \isNumeric {\sat {\typ_2}} \\ - \int_1 = \compileTimeEval {\prim {\exp_2}} \\ - \expenvWithCtxt \cte {\exp_3} {\prim {\exp_3}} {\typ_3} {\dir_3} \\ - \isNumeric {\sat {\typ_3}} \\ - \int_2 = \compileTimeEval {\prim {\exp_3}} \\ + \isNumeric {\sat {\typ_3}} \\\\ + \compileTimeEval {\prim {\exp_2}} = \int_1 \\ + \compileTimeEval {\prim {\exp_3}} = \int_2 \\\\ 0 \leq \int_1 < \width \\ \int_1 \leq \int_2 < \width } {\expenv {\bitStringAccess {\exp_1} {\exp_2} {\exp_3}} {\bitStringAccess {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\bitStringTyp {\int_2 - \int_1}} {\dir_1} } + \quad (\bitStringAccessE) ~ End InfRule ## List Constructor Rule { #sec-list-e } -$\list {\exp_1, \ldots, \exp_n}$ constructs a list of expressions. +$\list {\exps}$ constructs a list of expressions. The rule $\listE$ states that under environment $\env$ and context $\ctxt$, -the list $\list {\exp_1, \ldots, \exp_n}$ translates to -$\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}$ in the IR and has the tuple type -${\listTyp {\typ_1} {\typ_n}}$ with direction $\less$ if each of its expressions $\exp_i \in \exps$ translate to $\prim {\exp_i}$ with type $\typ_i$ and direction $\dir_i$ under the same enviroment and context. - -The rule $\listAltE$ uses the notation of $\overline \exp$ instead of expanding the list. +the list $\list {\exps}$ translates to +$\list {\overline {\prim \exp}}$ in the IR and has the tuple type +$\listTyps \typ$ with direction $\less$ if its expressions translate to +$\overline {\prim \exp}$ with types $\typs$ and directions $\dirs$ under the +same enviroment and context. ~ Begin InfRule - \inferrule[\listE] - {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} - {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}} {\listTyp {\typ_1} {\typ_n}} \less } + % \inferrule + % {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i}} + % {\expenv {\list {\exp_1, \ldots, \exp_n}} {\list {\prim {\exp_1}, \ldots, \prim {\exp_n}}} {\listTyp {\typ_1} {\typ_n}} \less } + % \quad (\listE) - \inferrule[\listAltE] + \inferrule {\expenv {\exps} {\overline {\prim \exp}} {\typs} {\dirs}} {\expenv {\list \exps} {\list {\overline {\prim \exp} }} {\listTyps \typ} \less } + \quad (\listE) ~ End InfRule ## Record Constructor Rule { #sec-record-e } -${\record 1 n}$ denotes a record where $\exp_i$ is assigned to $\field_i$ for $1 \leq i \leq n$. +$\records \exp$ denotes a record where an expression is assigned to each field of the record. The rule $\recordE$ is similar to $\listE$ rule. ~ Begin InfRule @@ -884,9 +942,10 @@ The rule $\recordE$ is similar to $\listE$ rule. % {1 \leq i \leq n. \expenv {\exp_i} {\prim {\exp_i}} {\typ_i} {\dir_i} } % {\expenv {\record 1 n} {\recordd 1 n {\prim \exp}} {\recordTypDef} \less } - \inferrule[\recordE] + \inferrule {\expenv {\exps} {\overline {\prim \exp}} {\typs} {\dirs}} {\expenv {\records \exp} {\records {\prim \exp}} {\recordTyps} \less } + \quad (\recordE) ~ End InfRule @@ -898,25 +957,32 @@ the expression $!\exp$ translates to the expression $!\prim\exp$ with the type $ Rules $\bitwiseComplementE$ and $\unaryMinusE$ are similar to the rule $\logicalNegE$. Additionally, they restrict the type of the $\exp$. +- $\isInt \typ$ checks if the type $\typ$ is either $\bitWidthTyp \width$, $\intWidthTyp \width$, or $\integerTyp$. + ``**Discrepency**`` P4 spec states that all expressions of type int MUST be compile-time known values but Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) ~ Begin InfRule - \inferrule[\logicalNegE] + \inferrule { \expenv \exp {\prim \exp} \boolTyp \dir } { \expenv {!\exp} {!\prim \exp} \boolTyp \dir } + \quad (\logicalNegE) - \inferrule[\bitwiseComplementE] + \inferrule { \expenv \exp {\prim \exp} \typ \dir \\ - \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} + \widthInt \typ = \_} + % \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\typ} \dir } + \quad (\bitwiseComplementE) - \inferrule[\unaryMinusE] + \inferrule { \expenv \exp {\prim \exp} \typ \dir \\ - \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp} - { \expenv {-\exp} {-\prim \exp} {\intWidthTyp \width} \dir } + \isInt \typ} + % \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp} + { \expenv {-\exp} {-\prim \exp} {\typ} \dir } + \quad (\unaryMinusE) ~ End InfRule @@ -924,56 +990,21 @@ Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or bin - P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) -## Binary Operations Rules { #sec-bin-ops-e } - -- The operation $\oplus$ stands for all possible binary operations. +## Binary Operation Rules { #sec-bin-ops-e } -The rule $\binaryOpsE$ uses two auxiliary judgments: +A binary operation is applied to two operands and it is written as $\exp_1 \restOps \exp_2$ where $\restOps$ indicates one or more operators. The binary operation rules are organized line-by-line for readability: -- The [coerce binary operation's arguments auxiliary judgment][#sec-coerce-bin-args] -translates the operands from the surface syntax to the IR and when applicable, it allows the operands of a binary operation to be casted to another type. -It has the judgment form -$\coerceBinArgsEnv {\exp} {\exp_1, \typ_1, \dir_1} {\exp_2, \typ_2, \dir_2}$ -which statees that under environment $\env$ and context $\ctxt$, -the expression $\exp$ written in the surface syntax has -two operands $\exp_1$ and $\exp_2$ in the IR with types and directions -$\typ_1$, $\typ_2$, $\dir_1$, $\dir_2$ where the types and expressions might have -resulted from casting. -- The [binary operation judgment][#sec-bin-op] confirms that an expression using a -binary operation follows the constraints of that binary operation. For example, if -an expression is checking the equality of two subexpression it checks that both -subexpression are of a type that equality is meaningful for it. It has the judgment -form $\binOpEnv \exp \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}$ which states that the expression $\exp$ (that is written in the IR and has a binary operation applied to two operands with types $(\typ_1, \typ_2)$ and directions $(\dir_1,\dir_2)$) is well-typed (that is, it follows all the restrictions applied to the -binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. +- The name of each rule is located on top of the rule and it contains the operators +that it covers. For example, the rule +$\rn{LogicalOps}\rAE(\ops=\&\&,\vert\vert)$ +applies to both **logical and** and **logical or**, that is, while reading the rule, +one can substitute $\ops$ for either $\&\&$ or $\vert\vert$. +- In all the binary operation rules, the first line states that the expression typing judgment is applied recursively to the operands. +- Then if applicable in second line, the rule checks whether the type of one of the operands can be implicitly casted to the other one. If so, it casts the said operand. This is done for all binary operation rules **except** for $\rn{BitstringConcatenation}\rE$ and $\rn{ShiftOps}\rE(\ops=\shiftL,\shiftR)$. +- Then, the type of the operands are reduced to remove all enums recursively and any condition that must hold for the operator(s) of the rule is checked. +- Finally, the direction of the expression is determined. -Having introduced the auxiliary judgments briefly, the rule $\binaryOpsE$ states that -under the environment $\env$ and context $\ctxt$, -the expression $\exp_1 \oplus \exp_2$ in surface syntax translates to the expression -$\prim {\exp_1} \oplus \prim {\exp_2}$ with type $\typ$ and direction $\dir$ if - -1. its operands $\exp_1$ and $\exp_2$ translate to $\prim {\exp_1}$ and $\prim {\exp_2}$, respectively, with corresponding types $\typ_1$, $\typ_2$ and directions $\dir_1$ and $\dir_2$ with potential casting when applicable -2. and the translated expressions $\prim {\exp_1}$ and $\prim {\exp_2}$ comply with the operation's restrictions. - -``**Discrepency**`` -P4 spec states that all expressions of type int MUST be compile-time known values but -Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) - -~ Begin InfRule - - \inferrule[\binaryOpsE] - {\coerceBinArgsEnv {\exp_1 \oplus \exp_2} {\prim {\exp_1}, \typ_1, \dir_1} {\prim {\exp_2}, \typ_2, \dir_2} \\ - \binOpEnv {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - { \expenv {\exp_1 \oplus \exp_2} {\prim {\exp_1} \oplus \prim {\exp_2}} \typ \dir } - -~ End InfRule - -### Coerce Binary Operation Arguments Auxiliary Judgment { #sec-coerce-bin-args } - -The rules $\shiftRAE$, $\shiftLAE$, and $\bitConcatAE$ are rather straight forward. -They only check if each operands can be translated to an expression in the IR. -The rule $\restAE$, which stands for all other binary operations. Additionally, -this rule checks if the type of one of the operands can implicitly be casted to the -other one and if so, it wraps the said operand in a cast constructor. +The following helpers are used in the binary operation rules: - $\implicitCast {\typ_1} {\typ_2}$ denotes possible implicit casts between different kinds of integers and returns the type that the other type can be casted to. It is described below (Note that it follows P4's implicit casting behavior and it is defined in more details in [cast auxiliary judgment][#sec-cast-helper].): @@ -981,127 +1012,161 @@ casting behavior and it is defined in more details in [cast auxiliary judgment][ * $\implicitCast \integerTyp {\bitWidthTyp \width} = \bitWidthTyp \width$ * $\implicitCast {\intWidthTyp \width} \integerTyp = \intWidthTyp \width$ * $\implicitCast \integerTyp {\intWidthTyp \width} = \intWidthTyp \width$ -- $\cast \typ \exp$ generates a cast expression if the type of the expression $\exp$ is different from the type $\typ$. - -~ Begin InfRuleHelper - - \inferrule[\shiftRAE] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \shiftR \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[\shiftLAE] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \shiftL \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[\bitConcatAE] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}} - { \coerceBinArgsEnv {\exp_1 \concat \exp_2} {\prim {\exp_1}, {\typ_1}, {\dir_1}} {\prim {\exp_2}, {\typ_2}, {\dir_2}} } - - \inferrule[\restAE] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - \typ = \implicitCast {\typ_1} {\typ_2} \\ - \pprim {\exp_1} = \cast \typ {\prim {\exp_1}} \\ - \pprim {\exp_2} = \cast \typ {\prim {\exp_2}}} - { \coerceBinArgsEnv {\exp_1 \restOps \exp_2} {\pprim {\exp_1}, {\typ_1}, {\dir_1}} {\pprim {\exp_2}, {\typ_2}, {\dir_2}} } - -~ End InfRuleHelper - -### Binary Operation Auxiliary Judgment { #sec-bin-op } - -This judgment checks the restriction of each binary operation. -It has the judgment -form $\binOpEnv \exp \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} $ which states that the expression $\exp$ (that is written in the IR and has a binary operation applied to two operands with types $(\typ_1, \typ_2)$ and directions $(\dir_1,\dir_2)$) is well-typed (that is, it follows all the restrictions applied to the -binary operation $\exp$ is using) and it has the type $\typ$ and direction $\dir$. - +- $\cast \typ \exp$ synthesizes a cast expression if the type of the expression $\exp$ is different from the type $\typ$. - $\reduceEnums \typ$ removes all the enums recursively from a type after reducing it. -- $\in_or_dirless {\dir_1} {\dir_2}$ retunrs the $\in$ direction if both directions $\dir_1$ and $\dir_2$ are $\in$, otherwise, it returns the $\less$ direction. -- $\typHasEq \typ$ checks if equality of two expressions from the type $\typ$ has been defined. Note that it first reduces the type $\typ$. +- $\inOrLess {\dir_1} {\dir_2}$ retunrs the $\inDir$ direction if both directions $\dir_1$ and $\dir_2$ are $\inDir$, otherwise, it returns the $\less$ direction. +- $\typHasEq \typ$ checks if equality of two expressions from the type $\typ$ has been defined. Note that it first reduces the type $\typ$. +- $\concatCond {\typ_1} {\typ_2}$ is a helper function that determines the type of a concatenation expression based on the types of its two operands: + + if $\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2}$, then + $\concatCond {\typ_1} {\typ_2} = \bitWidthTyp {\width_1 + \width_2}$ + + if $\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \intWidthTyp {\width_2}$, then + $\concatCond {\typ_1} {\typ_2} = \bitWidthTyp {\width_1 + \width_2}$ + + if $\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2}$, then + $\concatCond {\typ_1} {\typ_2} = \intWidthTyp {\width_1 + \width_2}$ + + if $\typ_1 = \intWidthTyp {\width_1}, \typ_2 = \intWidthTyp {\width_2}$, then + $\concatCond {\typ_1} {\typ_2} = \intWidthTyp {\width_1 + \width_2}$ +- $\bothInt {\typ_1} {\typ_2}$ is a helper function that checks if both types are a fixed-length or arbitrary precision integer type. That is, it checks the conditions below and returns $\tr$ if one of them holds: + + $\typ_1 = \typ_2 = \integerTyp$ + + $\typ_1 = \typ_2 = \bitWidthTyp \width$ + + $\typ_1 = \typ_2 = \intWidthTyp \width$ - $\nonNeg \exp$ and $\pos \exp$ evaluate an expression at compile time and check if it is a non-negative or positive number, respectively. +- $\divCond {\typ_1} {\typ_2}$ is a helper function that checks the following conditions for a division/modulo expression and returns $\tr$ if one of them holds: + + if $\typ_1 = \typ_2 = \integerTyp$, then + $\divCond {\typ_1} {\typ_2} = \integerTyp$ + + if $\typ_1 = \typ_2 = \bitWidthTyp \width$, then + $\divCond {\typ_1} {\typ_2} = \bitWidthTyp \width$ +- $\shiftCond {\typ} {\exp}$ is a helper function that checks the following conditions of the first expression and it returns $\tr$ if one of them holds: + + $\typ = \bitWidthTyp \width$ + + $\typ = \intWidthTyp \width$ + + $\typ = \integerTyp$ and $\compTimeKnown \exp$ - $\compTimeKnown \exp$ checks if the value of expression $\exp$ is known during the compilation. It does so by evaluating the expression $\exp$ at compile time, if that is possible then we know the value at compile time. Otherwise, if the expression $\exp$ is a specialized type, extern, package, control, or parser but we cannot evaluate it at compile time we still consider it known at compile time. -~ Begin InfRuleHelper +~ Begin InfRule - \inferrule[LogicalOps\rAE($\ops=\&\&,\vert\vert$)] - { \reduceEnums {\typ_1} = \boolTyp \\ - \reduceEnums {\typ_2} = \boolTyp \\ - \dir = \inOrLess {\dir_1} {\dir_2} } - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } - - \inferrule[NumericOps\rAE($\ops=+, -, *$)] - { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ - \typ = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ - % \reduceEnums {\typ_2} = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width \\ - \dir = \inOrLess {\dir_1} {\dir_2} - % \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \integerTyp \textOr \intWidthTyp \width + \inferrule[\rn{LogicalOps}\rAE($\ops=\&\&,\vert\vert$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = + \reduceEnums {\typ_2} = \boolTyp \\\\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \restOps \exp_2} {\pprim {\exp_1} \restOps \pprim {\exp_2}} \boolTyp \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } + + \inferrule[\rn{NumericOps}\rE($\ops=+, -, *$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\\\ + \isInt \typ\\\\ + \inOrLess {\dir_1} {\dir_2} = \dir } - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + {\expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \typ \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[EqualityChecks\rAE($\ops=\ ==, !=$)] - { \typEqEnv {\emp} {\reduceEnums {\typ_1}} {\reduceEnums {\typ_2}} \\ + \inferrule[\rn{EqualityChecks}\rE($\ops=\ ==, !=$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \typEqEnv {\emp} {\reduceEnums {\typ_1}} {\reduceEnums {\typ_2}} \\\\ % \typEq {\emp} {\typ_1} {\typ_2} \\ - \typHasEq {\typ_1} } - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } - - \inferrule[OpSat\rAE($\ops = \plusSat,\subSat$)] - { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\ - \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ - \dir = \inOrLess {\dir_1} {\dir_2}} - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - - \inferrule[BitwiseOps\rAE($\ops=\bitAnd, \bitOr, \bitXor, \bitComplement$)] - { \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ\\ - \typ = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ - \dir = \inOrLess {\dir_1} {\dir_2}} - { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - - \inferrule[BitstringConcatenation\rAE] - { \reduceEnums {\typ_1} = \prim {\typ_1} \\ - \reduceEnums {\typ_2} = \prim {\typ_2} \\ - \left( \so {\prim {\typ_1} = \bitWidthTyp {\width_1}, \prim {\typ_2} = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \bitWidthTyp {\width_1 + \width_2}} \right) \\ - \textOr \left( \so {\prim {\typ_1} = \intWidthTyp {\width_1}, \prim {\typ_2} = \bitWidthTyp {\width_2} \textOr \intWidthTyp {\width_2}} {\typ = \intWidthTyp {\width_1 + \width_2}} \right)\\ - \dir = \inOrLess {\dir_1} {\dir_2}} - { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - - \inferrule[ComparisonOps\rAE($\ops= <, \leq, >, \geq$)] - { \reduceEnums {\typ_1} = \prim {\typ_1} \\ - \reduceEnums {\typ_2} = \prim {\typ_2} \\ - \dir = \inOrLess {\dir_1} {\dir_2}\\ - \left( \typ_1 = \typ_2 = \integerTyp \right) \\ - \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \bitWidthTyp \width \right) \\ - \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \intWidthTyp \width \right) -} - { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + \typHasEq {\typ_1} \\\\ + \inOrLess {\dir_1} {\dir_2} = \dir} + { \expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \boolTyp \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2} } - \inferrule[DivOps\rAE($\ops=\div, \mod$)] - { \reduceEnums {\typ_1} = \prim {\typ_1}\\ - \reduceEnums {\typ_2} = \prim {\typ_2}\\ - \left( \so {\prim {\typ_1} = \prim {\typ_2} = \integerTyp, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \integerTyp} \right) \textOr \\ - \left( \so {\prim {\typ_1} = \prim {\typ_2} = \bitWidthTyp \width, \nonNeg {\exp_1}, \pos {\exp_2}} {\typ = \bitWidthTyp \width} \right) \\ - \dir = \inOrLess {\dir_1} {\dir_2}} - { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + \inferrule[\rn{OpSat}\rE($\ops = \plusSat,\subSat$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ \\\\ + \widthInt {\typ} = \_ \\\\ + % \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \typ \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[\rn{BitwiseOps}\rE($\ops=\bitAnd, \bitOr, \bitXor, \bitComplement$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = \reduceEnums {\typ_2} = \typ\\\\ + \widthInt {\typ} = \_ \\\\ + % \typ = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \typ \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[\rn{BitstringConcatenation}\rE] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\\\ + \reduceEnums {\typ_1} = \prim {\typ_1} \\ + \reduceEnums {\typ_2} = \prim {\typ_2} \\\\ + \concatCond {\prim {\typ_1}} {\prim {\typ_2}} = \typ\\\\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \concat \exp_2} {\pprim {\exp_1} \concat \pprim {\exp_2}} \typ \dir } + % { \binOpEnv {\exp_1 \concat \exp_2} {\typ} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[\rn{ComparisonOps}\rE($\ops= <, \leq, >, \geq$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = \prim {\typ_1} \\ + \reduceEnums {\typ_2} = \prim {\typ_2} \\\\ + \bothInt {\prim {\typ_1}} {\prim {\typ_2}}\\\\ + \inOrLess {\dir_1} {\dir_2} = \dir + } + { \expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \boolTyp \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} \boolTyp \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} - \inferrule[ShiftOps\rAE($\ops=\shiftL,\shiftR$)] - { - % \typ_1 = \reduceEnums {\typ_1} \\ + \inferrule[\rn{DivOps\rE}($\ops=\div, \mod$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2}\\\\ + \implicitCast {\typ_1} {\typ_2} = \typ \\ + \cast \typ {\prim {\exp_1}} = \pprim {\exp_1}\\ + \cast \typ {\prim {\exp_2}} = \pprim {\exp_2}\\\\ + \reduceEnums {\typ_1} = \prim {\typ_1}\\ + \reduceEnums {\typ_2} = \prim {\typ_2}\\\\ + \divCond {\prim {\typ_1}} {\prim {\typ_2}} = \typ \\ + \nonNeg {\exp_1} \\ + \pos {\exp_2}\\\\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} \typ \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} \typ \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + + \inferrule[\rn{ShiftOps}\rE($\ops=\shiftL,\shiftR$)] + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\\\ + \reduceEnums {\typ_1} = \prim {\typ_1}\\\\ % \typ_2 = \reduceEnums {\typ_2} \\ \nonNeg {\exp_2} \\ - \left( \reduceEnums {\typ_1} = \bitWidthTyp \width \textOr \intWidthTyp \width \right) \\ - \textOr \left( \reduceEnums {\typ_1} = \integerTyp, \compTimeKnown {\exp_2} \right)\\ - \dir = \inOrLess {\dir_1} {\dir_2}} - { \binOpEnv {\exp_1 \restOps \exp_2} {\reduceEnums {\typ_1}} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} + \shiftCond {\prim {\typ_1}} {\exp_2}\\\\ + \inOrLess {\dir_1} {\dir_2} = \dir} + {\expenv {\exp_1 \ops \exp_2} {\pprim {\exp_1} \ops \pprim {\exp_2}} {\prim {\typ_1}} \dir } + % { \binOpEnv {\exp_1 \restOps \exp_2} {\prim {\typ_1}} \dir {\typ_1} {\typ_2} {\dir_1} {\dir_2}} -~ End InfRuleHelper +~ End InfRule ``**DISCREPENCY**`` +- P4 spec states that all expressions of type int MUST be compile-time known values but +Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) - P4 spec defines bitwise operations and concatenation for bit but Petr4 also allows them for int. (ref: bitwiseops and bitstringconcatenation rules. section 8.5. check_binary_op impl. ) - P4 spec defines division and modulo only for arbitrary-precision integers but petr4 allows them for bit too. (ref: divops rule. section 8.7. check_binary_op impl.) @@ -1131,7 +1196,7 @@ in the helper judgment. Fix this later. ~ Begin InfRule - \inferrule[\castE] + \inferrule { \expenv \exp {\exp_1} {\typ_1} \dir \\ % \typ_2 = \sat {\typ_1} \\ \prim \typ = \trans {\typ} {\emp} \\ @@ -1140,6 +1205,7 @@ in the helper judgment. Fix this later. \explicitCastOK {\typ_1} {\prim \typ}} % \explicitCastOK {\typ_2} {\pprim \typ}} { \expenv {\cast \typ \exp} {\cast {\prim \typ} {\exp_1}} {\prim \typ} \less } + \quad (\castE) ~ End InfRule @@ -1159,153 +1225,240 @@ P4 spec states during the cast between int and bit or int the compiler wou ~ Begin InfRuleHelper - \inferrule[Bit<1>ToBool\rAE] + \inferrule { } { \explCast {\bitWidthTyp 1} \boolTyp } + \quad (\rn{BitToBool}\rAE) - \inferrule[BoolToBit<1>\rAE] + \inferrule { } { \explCast \boolTyp {\bitWidthTyp 1} } + \quad (\rn{BoolToBit}\rAE) - \inferrule[UnsignedIntToSigned\rAE] - { \width_1 = \width_2 } - { \explCast {\bitWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + \inferrule + { \width = \prim \width } + { \explCast {\bitWidthTyp {\width}} {\intWidthTyp {\prim \width}}} + \quad (\rn{UnsignedIntToSigned}\rAE) - \inferrule[SignedIntToUnsigned\rAE] - { \width_1 = \width_2 } - { \explCast {\intWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + \inferrule + { \width = \prim \width } + { \explCast {\intWidthTyp {\width}} {\bitWidthTyp {\prim \width}}} + \quad (\rn{SignedIntToUnsigned}\rAE) - \inferrule[UnsignedIntToUnsignedInt-Explicit\rAE] + \inferrule { } - { \explCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + { \explCast {\bitWidthTyp {\width}} {\bitWidthTyp {\prim \width}}} + \quad (\rn{UnsignedIntToUnsignedInt}\rSep\rn{Explicit}\rAE) - \inferrule[UnsignedIntToUnsignedInt-Implicit\rAE] - { \width_1 = \width_2} - { \implCast {\bitWidthTyp {\width_1}} {\bitWidthTyp {\width_2}}} + \inferrule + { \width = \prim \width} + { \implCast {\bitWidthTyp {\width}} {\bitWidthTyp {\prim \width}}} + \quad (\rn{UnsignedIntToUnsignedInt}\rSep\rn{Implicit}\rAE) - \inferrule[SignedIntToSignedInt-Explicit\rAE] + \inferrule { } - { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + { \explCast {\intWidthTyp {\width}} {\intWidthTyp {\prim \width}}} + \quad (\rn{SignedIntToSignedInt}\rSep\rn{Explicit}\rAE) - \inferrule[SignedIntToSignedInt-Implicit\rAE] - { \width_1 = \width_2} - { \explCast {\intWidthTyp {\width_1}} {\intWidthTyp {\width_2}}} + \inferrule + { \width = \prim \width} + { \explCast {\intWidthTyp {\width}} {\intWidthTyp {\prim \width}}} + \quad (\rn{SignedIntToSignedInt}\rSep\rn{Implicit}\rAE) - \inferrule[ArbitraryPrecisionIntToUnsignedInt\rAE] + \inferrule { } { \castenv \ \integerTyp {\bitWidthTyp \width}} + \quad (\rn{ArbitraryPrecisionIntToUnsignedInt}\rAE) - \inferrule[ArbitraryPrecisionIntToSignedInt\rAE] + \inferrule { } { \castenv \ \integerTyp {\intWidthTyp \width}} - - \inferrule[TypeDefs\rAE] - { (\typEqEnv \emp {\typ_1} {\newTypeTyp \name {\typ_2}}) \textOr (\typEqEnv \emp {\typ_2} {\newTypeTyp \name {\typ_1}})} - { \castenv \ {\newTypeTyp \name {\typ_1}} {\newTypeTyp \name {\typ_2}}} - - \inferrule[TypeDefToType-Explicit\rAE] - { \explCast {\typ_1} {\typ_2}} - { \explCast {\newTypeTyp \name {\typ_1}} {\typ_2}} - - \inferrule[TypeDefToType-Implicit\rAE] - { \implCast {\typ_1} {\typ_2}} - { \implCast {\newTypeTyp \name {\typ_1}} {\typ_2}} - - \inferrule[TypeToTypeDef-Explicit\rAE] - { \explCast {\typ_1} {\typ_2}} - { \explCast {\typ_1} {\newTypeTyp \name {\typ_2}}} - - \inferrule[TypeToTypeDef-Implicit\rAE] - { \implCast {\typ_1} {\typ_2}} - { \implCast {\typ_1} {\newTypeTyp \name {\typ_2}}} - - \inferrule[Enums\rAE] - { \typEqEnv \emp {\typ_1} {\typ_2}} - { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\enumTyp {\typ_2} {\name_2} {\names_2}}} - - \inferrule[EnumToUnderlyingType\rAE] - { \typEqEnv \emp {\typ_1} {\typ_2}} - { \castenv \ {\enumTyp {\typ_1} {\name_1} {\names_1}} {\typ_2}} - - \inferrule[TypeToEnumWithUndrlyingType\rAE] - { \typEqEnv \emp {\typ_1} {\typ_2}} - { \castenv \ {\typ_1} {\enumTyp {\typ_2} {\name_2} {\names_2}}} - - \inferrule[Sets\rAE] - { \typEqEnv \emp {\typ_1} {\typ_2}} - { \castenv \ {\setTyp {\typ_1}} {\setTyp {\typ_2}} } - - \inferrule[TypeToSet\rAE] - { \typEqEnv \emp {\typ_1} {\typ_2}} - { \implCast {\typ_1} {\setTyp {\typ_2}}} - - \inferrule[ListToTuple\rAE] - { \typEqEnv \emp {\tupleTyps {\typs_1}} {\tupleTyps {\typs_2}}} - { \castenv \ {\listTyps {\typs_1} } {\tupleTyps {\typs_2}}} - - \inferrule[ListToHeader-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} - {\explCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} - - \inferrule[ListToHeader-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} - {\implCast {\listTyp {\typ_1} {\typ_n}} {\headerTypp 1 n }} - - \inferrule[ListToStruct-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} - {\explCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} - - \inferrule[ListToStruct-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\tupleTyp {\typ_1} {\typ_n}} {\tupleTyp {\prim {\typ_1}} {\prim {\typ_n}}})} - {\implCast {\listTyp {\typ_1} {\typ_n}} {\structTypp 1 n }} - - \inferrule[RecordToHeader-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} - {\explCast {\recordTyp 1 n } {\headerTypp 1 n}} - - \inferrule[RecordToHeader-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} - {\implCast {\recordTyp 1 n } {\headerTypp 1 n}} - - \inferrule[RecordToStruct-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} - {\explCast {\recordTyp 1 n } {\structTypp 1 n}} - - \inferrule[RecordToStruct-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\recordTyp 1 n} {\recordTypp 1 n})} - {\implCast {\recordTyp 1 n } {\structTypp 1 n}} - - \inferrule[HeaderToHeader-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} - {\explCast {\headerTyp 1 n } {\headerTypp 1 n}} - - \inferrule[HeaderToHeader-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\headerTyp 1 n} {\headerTypp 1 n})} - {\implCast {\headerTyp 1 n } {\headerTypp 1 n}} - - \inferrule[StructToStruct-Explicit\rAE] - {(1 \leq i \leq n. \explCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} - {\explCast {\structTyp 1 n } {\structTypp 1 n}} - - \inferrule[StructToStruct-Implicit\rAE] - {(1 \leq i \leq n. \implCast {\typ_i} {\prim {\typ_i}}) \textOr - (\typEqEnv \emp {\structTyp 1 n} {\structTypp 1 n})} - {\implCast {\structTyp 1 n } {\structTypp 1 n}} - - \inferrule[ID\rAE] - { \typ_1 = \typ_2} - {\implCast {\typ_1} {\typ_2}} + \quad (\rn{ArbitraryPrecisionIntToSignedInt}\rAE) + + \inferrule + { (\typEqEnv \emp {\prim \typ} {\newTypeTyp \name { \typ}})} + { \castenv \ {\newTypeTyp \name {\typ}} {\newTypeTyp \name {\prim \typ}}} + \quad (\rn{TypeDefs}\rAE\rSep\rn{1}) + + \inferrule + { (\typEqEnv \emp {\typ} {\newTypeTyp \name {\prim \typ}})} + { \castenv \ {\newTypeTyp \name {\typ}} {\newTypeTyp \name {\prim \typ}}} + \quad (\rn{TypeDefs}\rAE\rSep\rn{2}) + + \inferrule + { \explCast {\typ} {\prim \typ}} + { \explCast {\newTypeTyp \name {\typ}} {\prim \typ}} + \quad (\rn{TypeDefToType}\rSep\rn{Explicit}\rAE) + + \inferrule + { \implCast {\typ} {\prim \typ}} + { \implCast {\newTypeTyp \name {\typ}} {\prim \typ}} + \quad (\rn{TypeDefToType}\rSep\rn{Implicit}\rAE) + + \inferrule + { \explCast {\typ} {\prim \typ}} + { \explCast {\typ} {\newTypeTyp \name {\prim \typ}}} + \quad (\rn{TypeToTypeDef}\rSep\rn{Explicit}\rAE) + + \inferrule + { \implCast {\typ} {\prim \typ}} + { \implCast {\typ} {\newTypeTyp \name {\prim \typ}}} + \quad (\rn{TypeToTypeDef}\rSep\rn{Implicit}\rAE) + + \inferrule + { \typEqEnv \emp {\typ} {\prim \typ}} + { \castenv \ {\enumTypDef} {\enumTyp {\prim \typ} {\prim \name} {\overline {\prim \name}}}} + \quad (\rn{Enums}\rAE) + + \inferrule + { \typEqEnv \emp {\typ} {\prim \typ}} + { \castenv \ {\enumTypDef} {\prim \typ}} + \quad (\rn{EnumToUnderlyingType}\rAE) + + \inferrule + { \typEqEnv \emp {\typ} {\prim \typ}} + { \castenv \ {\typ} {\enumTyp {\prim \typ} {\name} {\names}}} + \quad (\rn{TypeToEnumWithUndrlyingType}\rAE) + + \inferrule + { \typEqEnv \emp {\typ} {\prim \typ}} + { \castenv \ {\setTyp {\typ}} {\setTyp {\prim \typ}} } + \quad (\rn{Sets}\rAE) + + \inferrule + { \typEqEnv \emp {\typ} {\prim \typ}} + { \implCast {\typ} {\setTyp {\prim \typ}}} + \quad (\rn{TypeToSet}\rSep\rn{Implicit}\rAE) + + \inferrule + { \typEqEnv \emp {\tupleTyps {\typs}} {\tupleTyps {\overline {\prim \typ}}}} + { \castenv \ {\listTyps {\typs} } {\tupleTyps {\overline {\prim \typ}}}} + \quad (\rn{ListToTuple}\rAE) + + \inferrule + {\explCast {\typs} {\overline {\prim \typ}} } + {\explCast {\listTyps {\typs}} {\headerTyps \field {\prim \typ}}} + \quad (\rn{ListToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\tupleTyps \typs} {\tupleTyps {\overline {\prim \typ}}}} + {\explCast {\listTyps \typs} {\headerTyps \field {\prim \typ}}} + \quad (\rn{ListToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast {\typs} {\overline {\prim \typ}}} + {\implCast {\listTyps \typs} {\headerTyps \field {\prim \typ} }} + \quad (\rn{ListToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\tupleTyps {\typs}} {\tupleTyps {\overline {\prim \typ}}}} + {\implCast {\listTyps \typs} {\headerTyps \field {\prim \typ} }} + \quad (\rn{ListToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + {\explCast {\typs} {\overline {\prim \typ}}} + {\explCast {\listTyps \typs} {\structTyps \field {\prim \typ}}} + \quad (\rn{ListToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\tupleTyps \typs} {\tupleTyps {\overline {\prim \typ}}}} + {\explCast {\listTyps \typs} {\structTyps \field {\prim \typ}}} + \quad (\rn{ListToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast {\typs} {\overline {\prim \typ}}} + {\implCast {\listTyps \typs} {\structTyps \field {\prim \typ}}} + \quad (\rn{ListToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\tupleTyps \typs} {\tupleTyps {\overline {\prim \typ}}}} + {\implCast {\listTyps \typs} {\structTyps \field {\prim \typ}}} + \quad (\rn{ListToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + {\explCast {\typs} {\overline {\prim \typ}}} + {\explCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + \quad (\rn{RecordToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} + {\explCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + \quad (\rn{RecordToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast {\typs} {\overline {\prim \typ}}} + {\implCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + \quad (\rn{RecordToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} + {\implCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + \quad (\rn{RecordToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + {\explCast {\typs} {\overline {\prim \typ}}} + {\explCast {\recordTyps } {\structTyps \field {\prim \typ}}} + \quad (\rn{RecordToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} + {\explCast {\recordTyps } {\structTyps \field {\prim \typ}}} + \quad (\rn{RecordToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast {\typs} {\overline {\prim \typ}}} + {\implCast {\recordTyps } {\structTyps \field {\prim \typ}}} + \quad (\rn{RecordToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} + {\implCast {\recordTyps } {\structTyps \field {\prim \typ}}} + \quad (\rn{RecordToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + {\explCast {\typs} {\overline {\prim \typ}}} + {\explCast {\headerTyps \field \typ } {\headerTyps \field {\prim \typ}}} + \quad (\rn{HeaderToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\headerTyps \field \typ} {\headerTyps \field {\prim \typ}}} + {\explCast {\headerTyps \field \typ } {\headerTyps \field {\prim \typ}}} + \quad (\rn{HeaderToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast \typs {\overline {\prim \typ}}} + {\implCast {\headerTyps \field \typ} {\headerTyps \field {\prim \typ}}} + \quad (\rn{HeaderToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\headerTyps \field \typ} {\headerTyps \field {\prim \typ}}} + {\implCast {\headerTyps \field \typ} {\headerTyps \field {\prim \typ}}} + \quad (\rn{HeaderToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + {\explCast {\typs} {\overline {\prim {\typ}}}} + {\explCast {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + \quad (\rn{StructToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + {\explCast {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + \quad (\rn{StructToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{2}) + + \inferrule + {\implCast {\typs} {\overline {\prim \typ}}} + {\implCast {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + \quad (\rn{StructToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{1}) + + \inferrule + {\typEqEnv \emp {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + {\implCast {\structTyps \field \typ} {\structTyps \field {\prim \typ}}} + \quad (\rn{StructToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{2}) + + \inferrule + { \typ = \prim \typ} + {\implCast {\typ} {\prim \typ}} + \quad (\rn{ID}\rSep\rn{Implicit}\rAE) ~ End InfRuleHelper @@ -1333,21 +1486,24 @@ Note that the expression has to be of a one of the types: record, extern, specil ~ Begin InfRule - \inferrule[\typeMemE] + \inferrule {\lookupEnv {\typMem \typ \name} = (\typ, \dir) } {\expenv {\typMem \typ \name} {\typMem \typ \name} \typ \less } + \quad (\typeMemE) - \inferrule[\errMemE] + \inferrule {\lookupEnv {\errMem \name} = (\errTyp, \dir) } {\expenv {\errMem \name} {\errMem \name} \errTyp \less } + \quad (\errMemE) - \inferrule[\expMemE] + \inferrule { \expenv \exp {\prim \exp} {\typ} \dir \\ - \prim \typ = \reduce \typ \\ + \reduce \typ = \prim \typ \\ % \structTypDef = \prim \typ\\ \fieldAccessEnv \ctxt \name {\prim \typ} {\pprim \typ} } { \expenv {\expMem \exp \name} {\expMem {\prim \exp} \name} {\pprim \typ} {\less} } + \quad (\expMemE) ~ End InfRule @@ -1358,36 +1514,63 @@ a record type, a specialized type, an extern type, or an array. Then, it looks u ~ Begin InfRuleHelper - \inferrule[\rn{Type:StructOrHeaderOrHeaderUnion}\rAE] + \inferrule { % \expenv \exp {\prim \exp} {\typ} \dir \\ % \structTypDef = \reduce \typ \\ % \structTypDef = \prim \typ\\ - (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ - \exists 1 \leq i \leq n+1. \field_i = \field + % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ + (\field, \typ) \in \overline {\field, \typ} + % \exists 1 \leq i \leq n+1. \field_i = \field } - { \fieldAccessEnv \ctxt \field \structTypDef {\typ_i} } + { \fieldAccessEnv \ctxt \field {\structTyps \field \typ} {\typ} } + \quad (\rn{Type:Struct}\rAE) - \inferrule[\rn{Type:Specialized}\rAE] + \inferrule + { + % \expenv \exp {\prim \exp} {\typ} \dir \\ + % \structTypDef = \reduce \typ \\ + % \structTypDef = \prim \typ\\ + % (\field_{n+1},\typ_{n+1}) = (\isValid, \funcTyp \builtin \ \ \boolTyp )\\ + % \exists 1 \leq i \leq n+1. \field_i = \field + } + { \fieldAccessEnv \ctxt \field {\structTyps \field \typ} {\funcTyp \builtin \ \ \boolTyp} } + \quad (\rn{Type:Struct}\rSep\rn{Mem:isValid}\rAE) + + \inferrule { % names in the following are actually methods. have to see what they contain. \lookupEnv {\prim \name} = (\typParams,\overline {\name:\simpFuncTyp {\typ_{\mathit{in}}} {\typ_{\mathit{out}}}}) \\ % \prim \env = \insertToEnv \typParams \typs \\ - \exists \name_i: \prim {\typ_i} \in \overline {\name:\simpFuncTyp {\typ_{\mathit{in}}} {\typ_{\mathit{out}}}}. \name_i = \name \\ - \pprim {\typ_i} = \reduceWithEnv {\insertToEnv \typParams \typs} {\prim {\typ_i}}} + \suchThat {\exists \name_i: \prim {\typ_i} \in \overline {\name:\simpFuncTyp {\typ_{\mathit{in}}} {\typ_{\mathit{out}}}}} {\name_i = \name} \\ + \reduceWithEnv {\insertToEnvv {\overline {\typParam : \typ}}} {\prim {\typ_i}} = \pprim {\typ_i}} { \fieldAccessEnv \ctxt \name {\spcTyp {\externTyp {\prim \name}} {\typs}} {\pprim {\typ_i}}} + \quad (\rn{Type:Specialized}\rAE) - \inferrule[\rn{Type:Extern}\rAE] + \inferrule { \fieldAccessEnv \ctxt \name {\spcTyp {\externTyp {\prim \name}} \ } {\pprim \typ} } { \fieldAccessEnv \ctxt \name {\externTyp {\prim \name}} {\pprim \typ}} + \quad (\rn{Type:Extern}\rAE) + + \inferrule + { } + { \fieldAccessEnv \ctxt \sizeMem {\arrayTyp \typ \size} {\bitWidthTyp {32}}} + \quad (\rn{Type:Array}\rSep\rn{Mem:Size}\rAE) + + \inferrule + { } + { \fieldAccessEnv \ctxt \lastIndex {\arrayTyp \typ \size} {\bitWidthTyp {32}}} + \quad (\rn{Type:Array}\rSep\rn{Mem:LastIndex}\rAE) - \inferrule[\rn{Type:Array}\rSep\rn{Member:SizeOrLastIndex}\rAE] - { \name = \sizeFlag \textOr \lastIndex} - { \fieldAccessEnv \ctxt \name {\arrayTyp \typ \size} {\bitWidthTyp {32}}} + \inferrule + { } + { \fieldAccessEnv \parserCtxt \next {\arrayTyp \typ \size} {\typ}} + \quad (\rn{Type:Array}\rSep\rn{Mem:Next}\rAE) - \inferrule[\rn{Type:Array}\rSep\rn{Member:}\rn{Field:NextOrLast}\rAE] - { \name = \sizeFlag \textOr \lastIndex} - { \fieldAccessEnv \parserCtxt \name {\arrayTyp \typ \size} {\typ}} + \inferrule + { } + { \fieldAccessEnv \parserCtxt \last {\arrayTyp \typ \size} {\typ}} + \quad (\rn{Type:Array}\rSep\rn{Mem:Last}\rAE) ~ End InfRuleHelper @@ -1400,13 +1583,14 @@ that case it translates the conditional expression by translating all its subexp ~ Begin InfRule - \inferrule[\ternaryE] - {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ - \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\ - \expenv {\exp_3} {\prim {\exp_3}} {\typ_2} {\dir_3}\\ + \inferrule + {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\\\ + \expenv {\exp_2} {\prim {\exp_2}} {\typ_1} {\dir_2} \\\\ + \expenv {\exp_3} {\prim {\exp_3}} {\typ_2} {\dir_3}\\\\ \typ_1 = \typ_2 \\ \typ_1 \neq \integerTyp} {\expenv {\ternary {\exp_1} {\exp_2} {\exp_3}} {\ternary {\prim {\exp_1}} {\prim {\exp_2}} {\prim {\exp_3}}} {\typ_1} \less } + \quad (\ternaryE) % \inferrule[ Ternary(AllowedInP4ButNotePetr4)] % {\expenv {\exp_1} {\prim {\exp_1}} \boolTyp {\dir_1} \\ @@ -1429,7 +1613,7 @@ condition can be evaluated at compilation time. However, this is allowed by P4 s ~ Begin InfRule - \inferrule[\funcCallE] + \inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret} \\ % \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}}\\ @@ -1445,6 +1629,7 @@ condition can be evaluated at compilation time. However, this is allowed by P4 s \callOK \ctxt \kind } { \expenv {\funcCall \exp \typs \args} {\funcCall {\prim \exp} {\overline {\pprim \typ}} {\overline{\maybe {(\ppprim \exp, \ppprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + \quad (\funcCallE) ~ End InfRule @@ -1467,23 +1652,32 @@ if the expression $\exp$ called from the function call is a ...; and 3) it resolves function overload. It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function call with arguments $\args$ under environment $\env$ and context $\ctxt$ translates to expressio $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\params$, kind $\kind$, and the return type $\typ_\ret$. +- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\validatePars \params \env \kind$ validates parameters $\params$ under the environment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). +- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). + + ~ Begin InfRuleHelper - \inferrule[\nameFuncNameE] + \inferrule { \lookupEnv \name = (\overline {\typ, \dir})\\ \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } { \resolveFuncOver \name {\argkvss 1 n} \typParams {\pars 1 n} \kind {\typ_\ret} \dir } + \quad (\nameFuncNameE) - \inferrule[\nameFuncCountE] + \inferrule { \lookupEnv \name = (\overline {\typ, \dir})\\ \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ |\removeOptionalPars \params| = n} - { \resolveFuncOver \name {\argexpss 1 n} \typParams \params \kind {\typ_\ret} \dir} + { \resolveFuncOver \name {\argexpss 1 n} \typParams \params \kind {\typ_\ret} \dir} + \quad (\nameFuncCountE) - \inferrule[\nameActionE] + \inferrule { \expenv \name \exp {\actionTyp {\params_1} {\params_2}} \dir \\ \params = \params_1 \concatList \params_2} {\resolveFuncOver \name {\argkvss 1 n} \emp {\pars 1 n} \actionKind \voidTyp \dir} + \quad (\nameActionE) % { (\overline {\typ, \dir}) = \lookupEnv \name \\ % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \actionTyp {\pars 1 k} {\pars {k+1} n} } % { \resolveFuncOver \name {\argkvss 1 n} \emp \params \actionKind \voidTyp \dir } @@ -1495,23 +1689,27 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par % |\removeOptionalPars \params| = n} % { \resolveFuncOver \name {\argexpss 1 n} \emp \params \actionKind \voidTyp \dir} - \inferrule[\expMemFuncNameE] + \inferrule { \expenv {\expMem \name \exp} {\prim \exp} {\typ} \dir\\ \prim \typ = \reduce \typ \\ } - {blah} + {blah} + \quad (\expMemFuncNameE) - \inferrule[\expMemFuncCountE] - {} - {blah} + \inferrule + {} + {blah} + \quad (\expMemFuncCountE) - \inferrule[\expMemActionNameE] - {} - {blah} + \inferrule + {} + {blah} + \quad (\expMemActionNameE) - \inferrule[\expMemActionCountE] - {} - {blah} + \inferrule + {} + {blah} + \quad (\expMemActionCountE) ~ End InfRuleHelper @@ -1524,14 +1722,16 @@ It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \par ~ Begin InfRule - % \inferrule[\instE:SpecializedType] + % \inferrule % { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } % { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typArg_1, \ldots, \typArg_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} + % \quad (\instE:\rn{SpecializedType}) - \inferrule[\instE-2] + \inferrule { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} %name in the following is typename { \expenv {\instantiation {\name} {\args}} {\prim \exp} \typ \dir } + \quad (\instE\rSep\rn{2}) ~ End InfRule @@ -1541,23 +1741,26 @@ The expression $\mask {\exp_1} {\exp_2}$ denotes a masking expression where ever $\mask {\exp_1} {\exp_2} = \{\exp_3 | \exp_1\ \&\ \exp_2 = \exp_3\ \&\ \exp_2 \}$. Thus, as stated by the rule $\maskE$ both expressions $\exp_1$ and $\exp_2$ must have the same type of $\bitWidthTyp \width$, $\intWidthTyp \width$, or $\integerTyp$. +- $\maskTypeIs {\typ_1} {\typ_2}$ is a helper function that determines the type of a +mask expression based on the type of its two operands and it is defined for the following cases: + + if $\typ_1 = \typ_2 = \bitWidthTyp \width$, + then $\maskTypeIs {\typ_1} {\typ_2} = \bitWidthTyp \width$ + + if $\typ_1 = \bitWidthTyp \width, \typ_2 = \integerTyp$, + then $\maskTypeIs {\typ_1} {\typ_2} = \integerTyp$ + + if $\typ_1 = \integerTyp, \typ_2 = \bitWidthTyp \width$, + then $\maskTypeIs {\typ_1} {\typ_2} = \bitWidthTyp \width$ + ``**ENSURE**`` It might seem that petr4 allows mask operation to also operate on arbitrary precision integers while P4 spec doesn't. However, note that int can be implicitly casted to bit. So the mask operation can also operate on int or combination of int and bit. Similarly this applies to the range operation. ~ Begin InfRule - \inferrule[\maskE] - {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \inferrule + {\expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\\\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - \left( \so {\typ_1 = \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) \\ - \textOr - \left( \so {\typ_1 = \typ_2 = \integerTyp} {\typ = \integerTyp}\right) \\ - \textOr - \left( \so {\typ_1 = \bitWidthTyp \width, \typ_2 = \integerTyp} {\typ = \bitWidthTyp \width}\right) \\ - \textOr - \left( \so {\typ_1 = \integerTyp, \typ_2 = \bitWidthTyp \width} {\typ = \bitWidthTyp \width}\right) - } + \maskTypeIs {\typ_1} {\typ_2} = \typ} {\expenv {\mask {\exp_1} {\exp_2}} {\mask {\prim \exp_1} {\prim \exp_2}} {\setTyp \typ} \less } + \quad (\maskE) ~ End InfRule @@ -1565,28 +1768,25 @@ It might seem that petr4 allows mask operation to also operate on arbitrary prec The expression $\range {\exp_1} {\exp_2}$ is a range expression and it returns the values between $\exp_1$ and $\exp_2$, inclusively. The rule $\rangeE$ states that the type of expression $\exp_1$ and $\exp_2$ must be the same and it must either be $\bitWidthTyp \width$ or $\intWidthTyp \width$ (and by extension of implicit cast of types it can also be $\integerTyp$). +- As a reminder, the $\bothInt {\typ_1} {\typ_2}$ function checks the conditions + $\typ_1 = \typ_2 = \bitWidthTyp \width$ or $\typ_1 = \typ_2 = \intWidthTyp \width$ or + $\typ_1 = \typ_2 = \integerTyp$ and if one of them holds it returns $\tr$. + ``**ENSURE**`` p4 spec only states that the type can be bit or int but petr4 also allows integer. It's because of implicit cast, right? ~ Begin InfRule - \inferrule[\rangeE] - { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ + \inferrule + { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\\\ \expenv {\exp_2} {\prim {\exp_2}} {\typ_2} {\dir_2} \\ - \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} + \bothInt {\typ_1} {\typ_2}} + % \typ_1 = \typ_2 = \bitWidthTyp \width \textOr \intWidthTyp \width \textOr \integerTyp} { \expenv {\range {\exp_1} {\exp_2}} {\range {\prim {\exp_1}} {\prim {\exp_2}}} {\setTyp {\typ_1}} \dir } + \quad (\rangeE) ~ End InfRule - -There are multiple helper functions used in judgements that are explained below: - -- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. -- $\validatePars \params \env \kind$ validates parameters $\params$ under the environment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). -- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. -- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). -- Did I miss anything else? - # Statement's Typing Rules { #sec-stmt-typing } this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. @@ -1596,7 +1796,7 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums ~ Begin InfRule - \inferrule[Assignment] + \inferrule { \expenv {\exp_1} {\prim {\exp_1}} {\typ_1} {\dir_1} \\ \isLval {{\prim {\exp_1}}, {\typ_1}, {\dir_1}} \\ ({\prim {\exp_2}}, {\typ_2}, {\dir_2}) = \castExpression {\typ_1} {\exp_2}\\ @@ -1604,60 +1804,69 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums % \typ_1 = \typ_2 \\ } { \stmtenv {\assign {\exp_1} {\exp_2}} {\assign {\prim {\exp_1}} {\prim {\exp_2}}} {\unitTyp} } + \quad (\assignmentS) - \inferrule[Empty] + \inferrule { } { \stmtenv {\noop} {\noop} {\unitTyp}} + \quad (\emptyS) - \inferrule[Block] + \inferrule { \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 \\ \prim \typ = \ifVoidTyp {\typ_1} \\ \stmtenvv 2 {\stmts} {\prim \stmts} {\prim \typ} 3 } { \stmtenvv 1 {\block {\stmt_1; \stmts} } {\block {\prim {\stmt_1}; {\prim \stmts}} } {\prim \typ} 3 } + \quad (\blockS) - \inferrule[Return(inApplyBlockOrAction)] + \inferrule { % \expenv \exp {\prim \exp} \typ \dir \\ \ctxt = \applyBlockCtxt \textOr \actionCtxt \\ ({\prim {\exp}}, {\typ}, {\dir}) = \castExpression {\voidTyp} {\exp}\\ } { \stmtenv {\return \exp} {\return {({\prim {\exp}}, {\typ}, {\dir})}} \voidTyp } + \quad (\returnS) - \inferrule[ReturnEmpty] + \inferrule { % \expenv \exp {\prim \exp} \typ \dir \\ \ctxt = \applyBlockCtxt \textOr \actionCtxt \textOr \funcCtxt \typ \\ } { \stmtenv {\return {}} {\return {}} \voidTyp } + \quad (\returnEmpS) - \inferrule[Return(inFunction)] + \inferrule { % \expenv \exp {\prim \exp} \typ \dir \\ \ctxt = \funcCtxt \typ \\ ({\prim {\exp}}, {\prim \typ}, {\dir}) = \castExpression {\typ} {\exp}\\ } { \stmtenv {\return \exp} {\return {({\prim {\exp}}, {\prim \typ}, {\dir})}} \voidTyp } + \quad (\returnFuncS) - \inferrule[Exit] + \inferrule { \ctxt \neq \parserCtxt } { \stmtenv \exit \exit \voidTyp} + \quad (\exitS) - \inferrule[IfThen] + \inferrule { \ctxt \neq \parserCtxt \\ (\prim \exp, \boolTyp, \dir) = \castExpression \boolTyp \exp \\ \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 } { \stmtenvv 1 {\ifthen \exp {\stmt}} {\ifthen {\prim \exp} {\prim \stmt} } {\unitTyp} 1 } + \quad (\ifthenS) - \inferrule[IfThenElse] + \inferrule { \ctxt \neq \parserCtxt \\ (\prim \exp, \boolTyp, \dir) = \castExpression \boolTyp \exp \\ \stmtenvv 1 {\stmt_1} {\prim {\stmt_1}} {\typ_1} 2 \\ \stmtenvv 1 {\stmt_2} {\prim {\stmt_2}} {\typ_2} 3 \\ \prim \typ = \ifVoidTyp {\typ_1, \typ_2}} { \stmtenvv 1 {\ifthenelse \exp {\stmt_1} {\stmt_2}} {\ifthenelse {\prim \exp} {\prim {\stmt_1}} {\prim {\stmt_2}} } {\prim \typ} 1 } + \quad (\ifthenelseS) - \inferrule[Switch] + \inferrule { \ctxt_0 = \applyBlockCtxt \\ \expenvv \exp {\prim \exp} \typ \dir 0 \\ \prim \typ = \reduce \typ \\ @@ -1668,11 +1877,13 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums \stmtenvv 1 {\switch \exp {\overline {\actionCase \stmt}}} {\switch {\prim \exp} {\overline {\actionCase {\pprim \stmt} }}} \unitTyp 2 } { \stmtenvv 0 {\switch \exp {\actionCase \stmts, \overline {\actionCase \stmt}} } {\switch {\prim \exp} {\actionCase {\prim \stmts}, {\overline {\actionCase {\pprim \stmt} }} } } \unitTyp 2 } + \quad (\switchS) - \inferrule[Declaration] + \inferrule { \isConstant \dcl \textOr \isInstantiation \dcl \textOr \isVariable \dcl \\ \dclenvv 0 \dcl {\prim \dcl} 1} { \stmtenvv 0 \dcl {\prim \dcl} \unitTyp 1 } + \quad (\declS) ~ End InfRule @@ -1683,122 +1894,146 @@ check parameter shadowing takes two lists of paramets and checks if there is any ~ Begin InfRule - \inferrule[Constant] + \inferrule { \prim \typ = \trans \typ \emp \\ (\prim \exp, \pprim \typ, \dir) = \castExpression \exp {\prim \typ}\\ \val = \compileTimeEval {\prim \exp} } { \dclenvvv {\const \typ \var \exp} {\const {\prim \typ} \var \val} {\addConstEnv \var \val} {\addTypeEnv \var {(\prim \typ, \less)}}} + \quad (\constantD) - \inferrule[Instantiation] + \inferrule { \expenv {\instantiation {\var} \args} {\instantiation {\var} {\prim \args}} {\prim \typ} \dir \\ \ctxt \neq \toplevel \textOr \ctxt = \toplevel, ({\prim \typ} \neq \controlTyp {\_} {\_} \textOr \parserTyp {\_} {\_} )} { \dclenvvv {\inst \typVar \args \var {\ } } {\inst \typVar \args \var {\ }} \constEnv {\addTypeEnv \var {(\prim \typ, \less)}} } + \quad (\instantD) - \inferrule[Parser] + \inferrule {} {blah} + \quad (\parserD) % { \checkParamShadow param constructorparam \\ % } % { \dclenvvv {} {} {} {} } - \inferrule[Control] + \inferrule { blah } { blah } + \quad (\controlD) - \inferrule[Function] + \inferrule { blah } { blah } + \quad (\funcD) - \inferrule[Action] + \inferrule { blah } { blah } + \quad (\actionD) - \inferrule[ExternFunction] + \inferrule { blah } { blah } + \quad (\externFuncD) - \inferrule[Variable] + \inferrule { \ctxt \neq \toplevel \\ \prim \typ = \trans \typ \emp \\ \allowedTypeForVar {\prim \typ} \\ \typWellFormed {\prim \typ}} { \dclenvvv {\varDecl \typ \var } {\varDecl {\prim \typ} \var} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + \quad (\varD) - \inferrule[VariableInit] + \inferrule { \ctxt \neq \toplevel \\ \prim \typ = \trans \typ \emp \\ \allowedTypeForVar {\prim \typ} \\ \typWellFormed {\prim \typ} \\ (\prim \exp, \prim \typ, \dir) = \castExpression {\prim \typ} \exp} { \dclenvvv {\varInit \typ \var \exp} {\varInit {\prim \typ} \var {(\prim \exp, \prim \typ, \dir)}} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + \quad (\varInitD) - \inferrule[ValueSet] + \inferrule { blah } { blah } + \quad (\valueSetD) - \inferrule[Table] + \inferrule { blah } { blah } + \quad (\tableD) ~ End InfRule ~ Begin InfRule - \inferrule[Header] + \inferrule { blah } { blah } + \quad (\headerD) - \inferrule[HeaderUnion] + \inferrule { blah } { blah } + \quad (\headerUnionD) - \inferrule[Struct] + \inferrule { blah } { blah } + \quad (\structD) - \inferrule[Error] + \inferrule { blah } { blah } + \quad (\errD) - \inferrule[MatchKind] + \inferrule { blah } { blah } + \quad (\matchkindD) - \inferrule[Enum] + \inferrule { blah } { blah } + \quad (\enumD) - \inferrule[SerializableEnum] + \inferrule { blah } { blah } + \quad (\serEnumD) - \inferrule[ExternObject] + \inferrule { blah } { blah } + \quad (\externObjD) - \inferrule[TypeDef] + \inferrule { blah } { blah } + \quad (\typDefD) - \inferrule[NewType] + \inferrule { blah } { blah } + \quad (\newtypeD) ~ End InfRule ~ Begin InfRule - \inferrule[ControlType] + \inferrule { blah } { blah } + \quad (\controlTypD) - \inferrule[ParserType] + \inferrule { blah } { blah } + \quad (\parserTypD) - \inferrule[PackageType] + \inferrule { blah } { blah } + \quad (\packageTypD) % \inferrule[ ] % { } diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 2e71683a9..dcc0cfb77 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -52,7 +52,7 @@ \newcommand*{\arrayAccessE}{\rn{ArrayAccess}\rE} \newcommand*{\bitStringAccessE}{\rn{BitStringAccess}\rE} \newcommand*{\listE}{\rn{List}\rE} -\newcommand*{\listAltE}{\rn{List}\rSep\rn{Alt}\rE} +%% \newcommand*{\listAltE}{\rn{List}\rSep\rn{Alt}\rE} \newcommand*{\recordE}{\rn{Record}\rE} \newcommand*{\logicalNegE}{\rn{LogicalNegation}\rE} \newcommand*{\bitwiseComplementE}{\rn{BitwiseComplement}\rE} @@ -85,7 +85,45 @@ \newcommand*{\expMemActionNameE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByName}\rE} \newcommand*{\expMemActionCountE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByCount}\rE} +\newcommand*{\assignmentS}{\rn{Assignment}\rS} +\newcommand*{\emptyS}{\rn{Empty}\rS} +\newcommand*{\blockS}{\rn{Block}\rS} +\newcommand*{\returnS}{\rn{Return(inApplyBlockOrAction)}\rS} +\newcommand*{\returnEmpS}{\rn{ReturnEmpty}\rS} +\newcommand*{\returnFuncS}{\rn{Return(inFunction)}\rS} +\newcommand*{\exitS}{\rn{Exit}\rS} +\newcommand*{\ifthenS}{\rn{IfThen}\rS} +\newcommand*{\ifthenelseS}{\rn{IfThenElse}\rS} +\newcommand*{\switchS}{\rn{Switch}\rS} +\newcommand*{\declS}{\rn{Declaration}\rS} + +\newcommand*{\constantD}{\rn{Constant}\rD} +\newcommand*{\instantD}{\rn{Instantiation}\rD} +\newcommand*{\parserD}{\rn{Parser}\rD} +\newcommand*{\controlD}{\rn{Control}\rD} +\newcommand*{\funcD}{\rn{Function}\rD} +\newcommand*{\actionD}{\rn{Action}\rD} +\newcommand*{\externFuncD}{\rn{ExternFunction}\rD} +\newcommand*{\varD}{\rn{Variable}\rD} +\newcommand*{\varInitD}{\rn{VariableInit}\rD} +\newcommand*{\valueSetD}{\rn{ValueSet}\rD} +\newcommand*{\tableD}{\rn{Table}\rD} +\newcommand*{\headerD}{\rn{Header}\rD} +\newcommand*{\headerUnionD}{\rn{HeaderUnion}\rD} +\newcommand*{\structD}{\rn{Struct}\rD} +\newcommand*{\errD}{\rn{Error}\rD} +\newcommand*{\matchkindD}{\rn{MatchKind}\rD} +\newcommand*{\enumD}{\rn{Enum}\rD} +\newcommand*{\serEnumD}{\rn{SerializableEnum}\rD} +\newcommand*{\externObjD}{\rn{ExternObject}\rD} +\newcommand*{\typDefD}{\rn{TypeDefinition}\rD} +\newcommand*{\newtypeD}{\rn{NewType}\rD} +\newcommand*{\controlTypD}{\rn{ControlType}\rD} +\newcommand*{\parserTypD}{\rn{ParserType}\rD} +\newcommand*{\packageTypD}{\rn{PackageType}\rD} + %stuff here and there: +%TODO: fix mathit in the followings: \renewcommand{\or}{\ | \ } \newcommand{\whereBulletIs}{,\textit{ where } \bullet \textit{ is }} \newcommand{\whereIs}[1]{,\textit{ where } {#1} \textit{ is }} @@ -102,7 +140,19 @@ \newcommand{\emp}{[\ ]} \newcommand{\insertToEnv}[2]{\env, [{#1} : {#2} ]} \newcommand{\insertToEnvv}[1]{\env, [{#1}]} -\newcommand{\suchThat}[2]{{#1} . \ {#2}} +\newcommand{\suchThat}[2]{{#1}\ . \ {#2}} +\newcommand{\tr}{\mathsf{true}} +\newcommand{\fl}{\mathsf{false}} + +% renew these commands to change the size and indentation of program text +%% \newcommand{\progind}{\parindent} +%% \newcommand{\progfontsize}{\small} +%% \newcommand{\progformat}{} +%% % in-line code +%% \newcommand{\prog}[1]{\textrm{\progfontsize\progformat\texttt{#1}}} +%% \newcommand{\tr}{\prog{true}} +%% \newcommand{\fl}{\prog{false}} + %% \newcommand{\iLeqLeq}[2]{{#1} \leq i \leq {#2}. \ } %TODO: refactor 1 < i < n %% \newcommand{\iLeqL}[2]{{#1} \leq i < {#2}. \ } %% \newcommand{\iEqLeq}[2]{{#1} < i \leq {#2}. \ } @@ -111,6 +161,7 @@ %% \newcommand{\leqL}[3]{{#1} \leq {#2} < {#3}. \ } %% \newcommand{\lLeq}[3]{{#1} < {#2} \leq {#3}. \ } %% \newcommand{\lL}[3]{{#1} < {#2} < {#3}. \ } +%% \newcommand{\forallcond}[3]{\forall {#1} \in {#2}\ . \ {#3}} %typing judgments: \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} @@ -141,18 +192,18 @@ %contexts: -\newcommand{\cte}{\mathit{CONSTANT}} -\newcommand{\applyBlockCtxt}{\mathit{APPLYBLOCK}} -\newcommand{\actionCtxt}{\mathit{ACTION}} -\newcommand{\funcCtxt}[1]{\mathit{FUNCTION}\ {#1}} -\newcommand{\parserCtxt}{\mathit{PARSERSTATE}} -\newcommand{\toplevel}{\mathit{TOPLEVEL}} +\newcommand{\cte}{\mathfrak{constant}} +\newcommand{\applyBlockCtxt}{\mathfrak{applyBlock}} +\newcommand{\actionCtxt}{\mathfrak{action}} +\newcommand{\funcCtxt}[1]{\mathfrak{function}\ {#1}} +\newcommand{\parserCtxt}{\mathfrak{parserState}} +\newcommand{\toplevel}{\mathfrak{topLevel}} %operators: \newcommand{\mask}[2]{{#1}\ \&\&\&\ {#2}} \newcommand{\range}[2]{{#1}..{#2}} -\newcommand{\ternary}[3]{{#1} ? {#2} : {#3}} -\newcommand{\errMem}[1]{\mathit{error}.{#1}} +\newcommand{\ternary}[3]{{#1}\ ?\ {#2}\ : \ {#3}} +\newcommand{\errMem}[1]{\mathsf{error}.{#1}} \newcommand{\typMem}[2]{{#1}.{#2}} \newcommand{\shiftR}{\gg} \newcommand{\shiftL}{\ll} @@ -173,7 +224,7 @@ \newcommand{\instantiation}[2]{{#1}({#2})} \newcommand{\assign}[2]{{#1}={#2}} \newcommand{\noop}{;} -\newcommand{\return}[1]{\mathit{return}\ {#1}} +\newcommand{\return}[1]{\mathsf{return}\ {#1}} \newcommand{\exit}{\mathit{exit}} \newcommand{\switch}[2]{\mathit{switch}\ ({#1}) \{{#2}\}} \newcommand{\lbl}{l} @@ -221,9 +272,13 @@ \renewcommand{\exp}{\mathit{exp}} \newcommand{\exps}{\overline {\exp}} \newcommand{\field}{f} +\newcommand{\fields}{\overline \field} \newcommand{\param}{x} \newcommand{\params}{\overline x} \newcommand{\prm}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} +\newcommand{\singleprm}{\dir \ \typ \ \param} +\newcommand{\prms}{\overline {\singleprm}} +\newcommand{\prmss}{\overline {\prim \dir \ \prim \typ \ \prim \param}} \newcommand{\typParam}{\typVar} \newcommand{\typParams}{\overline \typParam} \newcommand{\pari}[1]{\dir_{#1} \typ_{#1} \typParam_{#1}} @@ -235,8 +290,8 @@ \newcommand{\stmt}{\mathit{stmt}} \newcommand{\stmts}{\overline \stmt} \newcommand{\block}[1]{\{ {#1} \}} -\newcommand{\ifthen}[2]{\mathit{if}\ {#1}\ \mathit{then}\ {#2}} -\newcommand{\ifthenelse}[3]{\mathit{if}\ {#1}\ \mathit{then}\ {#2}\ \mathit{else}\ {#3}} +\newcommand{\ifthen}[2]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}} +\newcommand{\ifthenelse}[3]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}\ \mathsf{else}\ {#3}} \newcommand{\dcl}{\mathit{dcl}} \newcommand{\kind}{k} \newcommand{\ret}{\mathit{return}} @@ -251,6 +306,22 @@ \newcommand{\names}{\overline \name} %function helpers +\newcommand{\maskTypeIs}[2]{\mathit{mask\_type}({#1},{#2})} +% \typ = \intWidthTyp \width \textOr \bitWidthTyp \width +\newcommand{\widthInt}[1]{\mathit{width\_int}({#1})} +%% - $\bothWidthInt {\typ_1} {\typ_2}$ is a helper function that checks if both types are fixed-length signed or unsigned integers. That is, it checks the conditions below and returns $\tr$ if one of them holds: +%% + $\typ_1 = \typ_2 = \bitWidthTyp \width$ +%% + $\typ_1 = \typ_2 = \intWidthTyp \width$ +%% \newcommand{\bothWidthInt}[2]{\mathit{both\_width\_int}({#1},{#2})} +%\typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width \textOr \integerTyp +\newcommand{\isInt}[1]{\mathit{is\_int}({#1})} +% \left( \typ_1 = \typ_2 = \integerTyp \right) \\ +% \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \bitWidthTyp \width \right) \\ +% \textOr \left( \prim {\typ_1} = \prim {\typ_2} = \intWidthTyp \width \right) +\newcommand{\bothInt}[2]{\mathit{both\_int}({#1},{#2})} +\newcommand{\concatCond}[2]{\mathit{concat\_type}({#1},{#2})} +\newcommand{\divCond}[2]{\mathit{div\_type}({#1},{#2})} +\newcommand{\shiftCond}[2]{\mathit{shift\_condition}({#1},{#2})} \newcommand{\addTypeEnv}[2]{\typEnv[{#1}:{#2}]} \newcommand{\addTypEnvv}[1]{\typEnv[{#1}]} \newcommand{\addConstEnv}[2]{\constEnv[{#1}={#2}]} @@ -271,7 +342,7 @@ \newcommand{\compTimeKnown}[1]{\mathit{compile\_time\_known}({#1})_\env} \newcommand{\sat}[1]{\mathit{saturate}({#1})_\env} \newcommand{\trans}[2]{\mathit{translate}({#1})_{\env,{#2}}} -\newcommand{\isValidNestedTyp}[2]{\mathit{is\_valid\_nested\_type}({#1},{#2})_\env} +\newcommand{\isValidNestedTyp}[1]{\mathit{is\_valid\_nested}({#1})_\env} %{#1} is outer, 2 is inner \newcommand{\noDup}[1]{\mathit{no\_duplicate}({#1})} \newcommand{\explicitCastOK}[2]{\explCast {#1} {#2}} @@ -295,25 +366,29 @@ \newcommand{\callOK}[2]{\mathit{call\_ok}({#1},{#2})} \newcommand{\removeOptionalPars}[1]{\mathit{remove\_optional\_parameteres}({#1})} \newcommand{\concatList}{++} +\newcommand{\isDirectionless}[1]{\mathit{is\_directionless}({#1})} %fields -\newcommand{\isValid}{\mathit{isValid}} -\newcommand{\apply}{\mathit{apply}} -\newcommand{\minSizeBits}{\mathit{minSizeInBits}} -\newcommand{\minSizeBytes}{\mathit{minSizeInBytes}} -\newcommand{\setValid}{\mathit{setValid}} -\newcommand{\setInvalid}{\mathit{setInvalid}} -\newcommand{\pushFront}{\mathit{push\_front}} -\newcommand{\popFront}{\mathit{pop\_front}} -\newcommand{\sizeFlag}{\mathit{size}} -\newcommand{\lastIndex}{\mathit{lastIndex}} -\renewcommand{\next}{\mathit{next}} -\newcommand{\last}{\mathit{last}} +\newcommand{\isValid}{\mathsf{isValid}} +\newcommand{\apply}{\mathsf{apply}} +\newcommand{\minSizeBits}{\mathsf{minSizeInBits}} +\newcommand{\minSizeBytes}{\mathsf{minSizeInBytes}} +\newcommand{\setValid}{\mathsf{setValid}} +\newcommand{\setInvalid}{\mathsf{setInvalid}} +\newcommand{\pushFront}{\mathsf{push\_front}} +\newcommand{\popFront}{\mathsf{pop\_front}} +\newcommand{\sizeMem}{\mathsf{size}} +\newcommand{\lastIndex}{\mathsf{lastIndex}} +\renewcommand{\next}{\mathsf{next}} +\newcommand{\last}{\mathsf{last}} %kinds -\newcommand{\builtin}{\mathit{builtin}} -\newcommand{\actionKind}{\mathit{action}} +\newcommand{\builtin}{\mathsf{builtin}} +\newcommand{\actionKind}{\mathsf{action}} + +%keywords +\newcommand{\newtypKey}{\mathsf{newtype}} %types: \newcommand{\bitWidthTyp}[1]{\mathsf{bit}\langle{#1}\rangle} @@ -332,18 +407,23 @@ \newcommand{\tupleTyps}[1]{\mathsf{tuple}\langle{#1}\rangle} \newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} \newcommand{\listTyps}[1]{\tupleTyps {#1}} -\newcommand{\enumTyp}{\mathsf{enum}\ {\typ}\ {\name}\{\name_1,\ldots,\name_n\}} -\newcommand{\enumTypNoTyp}{\mathsf{enum} \ {\name}\{\name_1,\ldots,\name_n\}} +\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\name}\ \{\names\}} +\newcommand{\enumTyp}[3]{\mathsf{enum}\ {#1}\ {#2}\ \{{#3}\}} +\newcommand{\enumTypNoTypDef}{\mathsf{enum} \ {\name}\ \{\names\}} +\newcommand{\enumTypNoTyp}[2]{\mathsf{enum} \ {#1}\ \{{#2}\}} \newcommand{\recordTypDef}{\recordTyp 1 n} \newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} \newcommand{\recordTypp}[2]{\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} \newcommand{\recordTyps}{\{\overline {\field : \typ}\}} +\newcommand{\recordTypss}[2]{\{\overline {{#1} : {#2}}\}} \newcommand{\headerUnionTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\headerTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\structTyp}[2]{\recordTyp {#1} {#2}} +\newcommand{\headerTyps}[2]{\recordTypss {#1} {#2}} \newcommand{\headerTypp}[2]{\recordTypp {#1} {#2}} \newcommand{\structTypp}[2]{\recordTypp {#1} {#2}} \newcommand{\structTypDef}{\recordTypDef} +\newcommand{\structTyps}[2]{\recordTypss {#1} {#2}} %% \newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} %% \newcommand{\headerTypDef}{\headerTyp 1 n} %% \newcommand{\headerTyp}[2]{\mathit{header}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} @@ -351,11 +431,11 @@ %% \newcommand{\structTypDef}{\structTyp 1 n} %% \newcommand{\structTyp}[2]{\mathit{struct}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} %% \newcommand{\structTypp}[2]{\mathit{struct}\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} -\newcommand{\newTypeTyp}[2]{{#1}\ {#2}} -\newcommand{\funcTyp}[3]{\mathsf{function}\ {#1}\langle{#2}\rangle ({#3})} +\newcommand{\newTypeTyp}[2]{\newtypKey \ {#1}\ {#2}} +\newcommand{\funcTyp}[3]{\mathsf{function}\ {#1}\ \langle{#2}\rangle ({#3})} \newcommand{\simpFuncTyp}[2]{{#1} \rightarrow {#2}} %kind.type param. param. return type. -\newcommand{\funcType}[4]{\mathsf{function}\ {#1}\langle{#2}\rangle ({#3})\rightarrow {#4}} +\newcommand{\funcType}[4]{\mathsf{function}\ {#1}\ \langle{#2}\rangle ({#3})\rightarrow {#4}} \newcommand{\constructorTyp}[4]{{#1}\ {#2}\ \langle{#3}\rangle\ ({#4}, \_)} \newcommand{\externTyp}[1]{\mathsf{extern} \ {#1}} \newcommand{\spcTyp}[2]{{#1}\langle{#2}\rangle} @@ -368,9 +448,9 @@ \newcommand{\unitTyp}{()} %directions: -\newcommand{\less}{\mathit{directionless}} +\newcommand{\less}{\mathsf{directionless}} \newcommand{\dir}{d} \newcommand{\dirs}{\overline \dir} -\newcommand{\inDir}{\mathit{in}} -\newcommand{\out}{\mathit{out}} -\newcommand{\inout}{\mathit{in\_out}} +\newcommand{\inDir}{\mathsf{in}} +\newcommand{\out}{\mathsf{out}} +\newcommand{\inout}{\mathsf{in\_out}} From b8f70c64ae25b608e3adf18df0b708f268b082b2 Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 26 Jul 2022 00:06:17 -0400 Subject: [PATCH 19/30] func call only needs a brief intro --- docs/petr4spec/Petr4-spec.mdk | 275 ++++++++++++++++++++++++---------- docs/petr4spec/ops.tex | 53 +++++-- lib/checker.ml | 5 +- 3 files changed, 237 insertions(+), 96 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 8714b8392..e7d6e049d 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -328,14 +328,20 @@ The type system conducts three tasks simultaneously: ```**TODO** maybe have more explanation on IR.``` -### Metavariables { #sec-metavar } +### Notation { #sec-notation } + +``TODO: add followings.`` + +- $\overline {\overline \anyTyp}$ +- $\overline {X:\typ}$ zips $\overline X$ and $\typs$. +- $\concatList a b$ Metavariables are place holders for values of a type. For example, $\bool$ stands for expressions $true$ or $false$. Keep in mind that $true$ and $false$ both are expressions that have the type $\boolTyp$. As another example, in most programming references $foo$, $bar$, and $baz$ are used as metavariables, often for functions. - $\overline x$ denotes a list of $x$. - For simplicity, we omit mapping a function/judgment on a list of elements. Instead, we just apply the function/judgment to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. - An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgements. -- The notation $\maybe x$ denotes an optional type, that is, the type of $x$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $x$ denotes an integer $\maybe x$ could either be an integer number or bottom. +- The notation $\maybe \anyTyp$ denotes an optional type, that is, the type of $\anyTyp$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $\anyTyp$ denotes an integer, $\maybe \anyTyp$ could either be an integer number or bottom. The following describes the metavariables used in this document: @@ -356,6 +362,7 @@ The following describes the metavariables used in this document: | $\field$ | field names | | $\env$ | environments | | $\emp$ | empty list of elements | +| $\anyTyp$ | a value of any type | ~ ## Connecting To The Implementation { #sec-conn } @@ -373,11 +380,14 @@ For simplicity, we have removed the information that is needed to report when an happens. Such information is passed around in the surface syntax as a field (called `tags`) of record for all data types. -### Judgment signatures +### Signatures ``TODO`` +function signature. judgment signature. environment signature. ### contexts and environments +# Syntax + # Type Related Judgments { #sec-types-typing } Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. @@ -773,6 +783,8 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. +## Type Unification { #sec-type-unify } + # Expression's Typing Rules { #sec-exp-typing } The judgment form @@ -782,8 +794,6 @@ the type $\typ$ and direction $\dir$ under environment $\env$. For now, we do no present the syntax of the surface syntax and IR. Note that there is not much difference between the two. -```**TODO** We plan to add the abstract syntax of them in appendix later.``` - ``**Restriction**`` Petr4 doesn't have the product operation where multiple sets can be combined using cartesian product and the type of a product of sets is a set of tuples. (refer to @@ -1611,112 +1621,219 @@ condition can be evaluated at compilation time. However, this is allowed by P4 s ## Function Call Rule +Expressions $\funcCall \exp {\typs} \args$ and +$\funcCallNoTypArgs \exp \args$ both indicate a function call where + +- $\exp$ is either a name or an expression member that is bein called +- $\args$ is the arguments passed to the function and they could be matched with parameters either based on name or position +- $\typs$ is the type arguments passed to the function. + +A function call is well-typed if ``todo`` + +```Check with ryan. when does it ever have partial assignment of type pars?``` + +- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: + 1. it checks if the expression as a function call is acceptable, that is, if it is either a name or expression member + 2. it checks if the type of the expression is either a function, an action, an extern, or a specialized type + 3. it checks if the parameters and arguments match either based on their position or name. + + And has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. +- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\validatePars \singleprm \env \kind$ validates the parameter $\singleprm$ under the environment $\env$ and the function kind $\kind$. That is, it confirms that the parameter is valid if **none** of the following cases hold: + + $(\sat \typ) = \externTyp \whatevs$ and $\dir \neq \less$ + + $\compTimeKnown (\sat \typ)$ and $\dir \neq \less$ + + $\typNotWellFormed (\sat \typ)$ + + And **one** of the following holds: + + $\kind = \parserKind$ and $\sat \typ=\externTyp \whatevs$ + + $\kind = \controlKind$ and $\sat \typ=\externTyp \whatevs$ + + $\kind = \methodKind$ and $\sat \typ=\externTyp \whatevs$ +- The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function call using the +arguments passed to it and to ensure that they all match. +It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \typ}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar : \pprim \typ}}$ which states that under environment $\env$ and context $\ctxt$, the type parameters $\typVars$ have the type $\pprim \typ$ given the assignment of type parameters $\typVars$ to optional types $\overline {\maybe {\prim \typ}}$ and the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$. +- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +- $\callOK \ctxt \kind$ checks if the function kind is valid in a context. The following cases valid: ``TODO: break up ctxt. here ctxt is exprctxt.`` + + $\ctxt = \parserCtxt$ and $\kind = \parserKind$ + + $\ctxt = \applyBlockCtxt$ and $\kind = \controlKind$ + + $\ctxt \neq \funcCtxt \whatevs$ and $\kind = \externKind$ + + $\ctxt = \applyBlockCtxt$ and $\kind = \tableKind$ + + $\ctxt = \applyBlockCtxt$ and $\kind = \actionKind$ + + $\ctxt = \actionCtxt$ and $\kind = \actionKind$ + + $\ctxt = \tableActionCtxt$ and $\kind = \actionKind$ + + $\ctxt = \parserCtxt$ and $\kind = \funcKind$ + + $\ctxt = \applyBlockCtxt$ and $\kind = \funcKind$ + + $\ctxt = \actionCtxt$ and $\kind = \funcKind$ + + $\ctxt = \funcCtxt \whatevs$ and $\kind = \funcKind$ + + $\ctxt = \declLocalCtxt$ and $\kind = \funcKind$ + + $\kind = \builtin$ + + ~ Begin InfRule - \inferrule + \mprset {vskip=0.5ex} + {\inferrule { - \resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret} \\ - % \expenv \exp {\prim \exp} {\funcType \kind \typVars {\prm 1, \ldots, \prm n} {\typ_\ret}}\\ - \overline {\prim \typ} = \trans \typs \emp \\ - % \match \params \args\\ - |\typs| = |\typVars|\\ - \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ - {\prim \typ}_{\ret} = \sat {\typ_\ret} \\ - \overline {\param = \pprim {\maybe \exp}} = \matchParArg \params \args\\ - \inferTypParArg {\typ_\ret} {\overline {\typVar : \prim \typ}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}\\ - \validatePars {\params} {\addTypEnvv {\overline {\typVar : \pprim \typ}} } \kind \\ - \overline {\param = \maybe {(\ppprim \exp, \ppprim \typ, \dir)}} = \castParArg {\overline {\param = \pprim {\maybe \exp}}}\\ - \callOK \ctxt \kind + \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ + \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ + |\overline {\typ_0}| = |\typVars|\\\\ + % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ + \matchParArg \prms \args = \overline {\param = \pprim {\maybe \exp}}\\ + % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ + \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ + \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ + \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + \callOK \ctxt \kind \\ + \sat {\typ_\ret} = {\prim \typ}_{\ret} } - { \expenv {\funcCall \exp \typs \args} {\funcCall {\prim \exp} {\overline {\pprim \typ}} {\overline{\maybe {(\ppprim \exp, \ppprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } - \quad (\funcCallE) + { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + \quad (\funcCallE)} + +\\ + + \mprset {vskip=0.5ex} + {\inferrule + { + \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ + \matchParArg \params \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ + % \inferTypParArg {\typ_\ret} {\overline {\typVar : \bot }} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \bot}} {\overline {\typVar : \prim \typ}}\\\\ + \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}}\\\\ + \validatePars {\params} {\addTypEnvv {\overline {\typVar : \prim \typ}} } \kind \\ + \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \pprim \typ, \dir)}}\\\\ + \callOK \ctxt \kind \\ + \sat {\typ_\ret} = {\prim \typ}_{\ret} + } + { \expenv {\funcCallNoTypArgs \exp \args} {\funcCall {\prim \exp} {\overline {\prim \typ}} {\overline{\maybe {(\ppprim \exp, \pprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + \quad (\funcCallNoTypeArgE)} ~ End InfRule ### Function Call Auxiliary Judgment { #sec-func-call } -This judgment carries out the main details of the $\funcCallE$ rule. +This judgment checks the details of a function call: + +1) it checks if the expression as a function call is acceptable, that is, if it is either a name or expression member +2) it checks if the type of the expression is either a function, an action, an extern, or a specialized type +3) the parameters and arguments either match based on their position or name. -The helpers used are: +It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} $ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. - Remember that parameters could be optional or have some default expression set as their expression. $\removeOptionalPars \params$ removes those parameters. -- $\concatList$ denotes concatenating two lists, in this case two lists of parameters. +- $\concatList {\overline \anyTyp} {\overline {\prim \anyTyp}}$ denotes concatenating two lists. -Concerns/questions: +```Concerns/questions:``` - when does the expression typing returns an expression of type action (the $\nameActionE$ rule may never be trigured)? -- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1) it checks -if the expression $\exp$ called from the function call is a ...; -2) it checks if the expression $\exp$ either has a function type or an action typ, and if so it returns the type parameteres, parameters, kind, and return type; -and 3) it resolves function overload. -It has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \params \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function call with arguments $\args$ under environment $\env$ and context $\ctxt$ translates to expressio $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\params$, kind $\kind$, and the return type $\typ_\ret$. - -- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. -- $\validatePars \params \env \kind$ validates parameters $\params$ under the environment $\env$, context $\ctxt$ and the function kind $\kind$, after saturating their types. For example, it ensures that parameters of type extern are directionless, or parameters that must be compile time known are directionless. It also checks that the parameter type is well-formed and that it is a valid parameter type under a certain context (refer to the function _is\_valid\_param\_type_ to see exactly when a type is valid for a parameter). -- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. -- $\callOK \ctxt \kind$ checks if the function kind is valid in a context (refer to _call\_ok_ function). - ~ Begin InfRuleHelper - \inferrule - { \lookupEnv \name = (\overline {\typ, \dir})\\ - \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } - { \resolveFuncOver \name {\argkvss 1 n} \typParams {\pars 1 n} \kind {\typ_\ret} \dir } + \mprset {vskip=0.5ex} + {\inferrule + % [\nameFuncNameE] + { \lookupEnv {\name_0} = \overline {(\typ, \dir)}\\ + \exists (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2)\in \overline {(\typ, \dir)}} + % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } + { \resolveFuncOver {\name_0} {\overline {\var_1 = \exp}} {\name_0} \typParams {\overline {\prm 1}} \kind {\typ_\ret} } \quad (\nameFuncNameE) - - \inferrule - { \lookupEnv \name = (\overline {\typ, \dir})\\ - \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ - |\removeOptionalPars \params| = n} - { \resolveFuncOver \name {\argexpss 1 n} \typParams \params \kind {\typ_\ret} \dir} + } + +\\ + \mprset {vskip=0.5ex} + {\inferrule + % [\nameFuncCountE] + { \lookupEnv {\name_0} = \overline {(\typ, \dir)}\\ + \exists (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2) \in \overline {(\typ, \dir)}\\ + % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ + |\removeOptionalPars \params| = |\argexps|} + { \resolveFuncOver {\name_0} {\argexps} {\name_0} \typParams {\overline {\prm 1}} \kind {\typ_\ret} } \quad (\nameFuncCountE) - - \inferrule - { \expenv \name \exp {\actionTyp {\params_1} {\params_2}} \dir \\ - \params = \params_1 \concatList \params_2} - {\resolveFuncOver \name {\argkvss 1 n} \emp {\pars 1 n} \actionKind \voidTyp \dir} + } + +\\ + \mprset {vskip=0.5ex} + {\inferrule + { \expenv {\name_0} \exp {\actionTyp {\overline {\prm 1} } {\overline {\prm 2}}} \dir \\ + \overline {\prm 3} = \concatList {\overline {\prm 1}} {\overline {\prm 2}}} + {\resolveFuncOver {\name_0} {\args} {\name_0} \emp {\overline {\prm 3}} \actionKind \voidTyp } \quad (\nameActionE) - % { (\overline {\typ, \dir}) = \lookupEnv \name \\ - % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \actionTyp {\pars 1 k} {\pars {k+1} n} } - % { \resolveFuncOver \name {\argkvss 1 n} \emp \params \actionKind \voidTyp \dir } + } - % \inferrule[\nameActionCountE] - % { (\overline {\typ, \dir}) = \lookupEnv \name \\ - % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \actionTyp {\params_1} {\params_2}\\ - % \params = \params_1 \concatList \params_2 - % |\removeOptionalPars \params| = n} - % { \resolveFuncOver \name {\argexpss 1 n} \emp \params \actionKind \voidTyp \dir} - \inferrule - { \expenv {\expMem \name \exp} {\prim \exp} {\typ} \dir\\ - \prim \typ = \reduce \typ \\ +\\ + \mprset {vskip=0.5ex} + {\inferrule + % [\expMemExternNameE] + { \expenv {\expMem {\name_0} {\exp_0}} {\exp_1} {\typ_1} {\dir_1}\\ + \reduce {\typ_1} = \externTyp {\name_1}\\\\ + \lookupEnv { \name_1} = (\typParams, \methods {\name_2} {\typ_2})\\\\ + \exists (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})} } - {blah} - \quad (\expMemFuncNameE) + {\resolveFuncOver {\expMem {\name_0} {\exp_0}} \argkvs {\exp_1} {\overline {\prim \typParam}} \prms \kind {\typ_\ret}} + \quad (\expMemExternNameE) + } + +\\ + \mprset {vskip=0.5ex} + {\inferrule + % [\expMemExternCountE] + { \expenv {\expMem {\name_0} {\exp_0}} {\exp_1} {\typ_1} {\dir_1}\\ + \reduce {\typ_1} = \externTyp {\name_1}\\\\ + \lookupEnv { \name_1} = (\typParams, \methods {\name_2} {\typ_2})\\\\ + \exists (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})}\\\\ + |\prms| = |\argexps| + } + {\resolveFuncOver {\expMem {\name_0} {\exp_0}} \argexps {\exp_1} {\overline {\prim \typParam}} \prms \kind {\typ_\ret} } + \quad (\expMemExternCountE) + } + +\\ + \mprset {vskip=0.5ex} + {\inferrule + % [\expMemSpcE] + { \expenv {\expMem {\name_0} {\exp_0}} {\exp_1} {\typ_1} {\dir_1}\\ + \reduce {\typ_1} = \spcTyp {\name_1} {\overline {\prim \arg}} \\\\ + \isExtern {\name_1} \\\\ + \resolveFuncOver {\expMem {\name_0} {\name_1}} \args {\overline {\prim \typParam}} \prms \kind {\typ_\ret} {\dir_2} \\\\ + \reduceWithEnv {\addTypEnvv {\overline {\prim \typParam} {\prim \arg}}} {\typ_\ret} = \prim {\typ_\ret} + } + {\resolveFuncOver {\expMem {\name_0} {\exp_0}} \args {\exp_1} {\overline {\prim \typParam}} \prms \kind {\prim {\typ_\ret}} } + \quad (\expMemSpcE) + } - \inferrule - {} - {blah} - \quad (\expMemFuncCountE) +~ End InfRuleHelper - \inferrule - {} - {blah} - \quad (\expMemActionNameE) +### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } - \inferrule - {} - {blah} - \quad (\expMemActionCountE) +This auxiliary judgment is used to infer the type of type parameters of a function call using the +arguments passed to it and to ensure that they all match. +It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \typ}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar : \pprim \typ}}$ which states that under environment $\env$ and context $\ctxt$, the type parameters $\typVars$ have the type $\pprim \typ$ given the assignment of type parameters $\typVars$ to optional types $\overline {\maybe {\prim \typ}}$ and the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$ if +the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any incosistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. -~ End InfRuleHelper -### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } +- $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim \anyTyp}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ and another that only contains the ones that are $\bot$. +- As a reminder $\unify \env {\overline {\typVar_1 = \typVar_2}} {{\typVars}} \typ { {\prim \typ}} { {\overline {\typVar : \maybe {\pprim \typ}}}}$ unifies the types $\typ$ and $\prim \typ$ under environment $\env$, equivalent type variables ${\overline {\typVar_1 = \typVar_2}}$, and type variables $\typVars$ that do not have any type assigned to them yet. If it can unify the two types, it +generates a list assignment of types to type variables ${\overline {\prim \typVar : \maybe {\pprim \typ}}}$. For detailed rules of this judgment refer to Section [#sec-type-unify]. +- $\mergeConst {\overline {\typVar : \bot}} {\overline {\overline {\typVar : \maybe {\typ}}}}$ merges the types assigned to type variables $\typVars$ recursively. It starts from no assignment ${\overline {\typVar : \bot}}$ as the base and recursively folds the merge of assigned types to a type variable from the list of assignments $\overline {\overline {\typVar : \maybe {\typ}}}$. The merging of types, that is, $\mathit{merge}(\typVar_1 : \typ_1, \typVar_1 :\typ_2)$, tries the following and if none of them matches it fails: + + if $\typEqEnv \emp {\typ_1} {\typ_2}$, then $\typ_1$ + + if $\implCast {\typ_1} {\typ_2}$, then $\typ_2$ + + if $\implCast {\typ_2} {\typ_1}$, then $\typ_1$ +- $\toVoid {\overline {\typVar : \maybe \typ}}$ takes a list of type variables with their optional assignments and if the assigment is $\bot$, it assigns the $\voidTyp$ type to the type variable. It leaves the type variables that have type assignments untouched. + +~ Begin InfRuleHelper -- The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function. It has the judgment form $\inferTypParArg {\typ_\ret} {\overline {\typVar : \typ}} {\overline {\param = {\maybe \exp}}} {\overline {\prim \typVar : \prim \typ}} {\overline {\typVar : \pprim \typ}}$ which states that the type parameters $\typVars$ have the type $\pprim \typ$ under environment $\env$ and context $\ctxt$ with the return type of $\typ_\ret$, the assignment of type parameters $\typVars$ to types $\typs$, the assignment of parameters $\params$ to optional expressions $\maybe \exp$, and constraints $fill\ later$. + \mprset {vskip=0.5ex} + {\inferrule + { \breakMaybes {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\typVar_2 : \typ_2}} {\overline {\typVar_3 : \bot}}\\\\ + \expenvvv {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} {\exps} {\overline {\prim \exp, \prim \typ, \prim \dir}} \\\\ + \unify {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} \emp {\overline {\typVar_3}} \typs {\overline {\prim \typ}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} \\\\ + \mergeConst {\overline {\typVar_3 : \bot}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} = {\overline {\typVar_3 : \maybe {\typ_5}}}\\\\ + \concatList {\overline {\typVar_2 : {\typ_2}}} { \toVoid {\overline {\typVar_3 : \maybe {\typ_5}}}} = {\overline {\typVar_1 : {\typ_6}}} } + {\inferTypParArg {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar_1 : {\typ_6}}}} + \quad (\inferTypeArgAE) + } + +~ End InfRuleHelper ## Instantiation Rule { #sec-inst-e } diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index dcc0cfb77..c20ddc7be 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -63,7 +63,8 @@ \newcommand*{\errMemE}{\rn{ErrorMember}\rE} \newcommand*{\expMemE}{\rn{ExpressionMember}\rE} \newcommand*{\ternaryE}{\rn{Ternary}\rE} -\newcommand*{\funcCallE}{\rn{FunctionCall}\rE} +\newcommand*{\funcCallE}{\rn{FunctionCall}\rE\rSep\rn{1}} +\newcommand*{\funcCallNoTypeArgE}{\rn{FunctionCall}\rE\rSep\rn{2}} \newcommand*{\instE}{\rn{Instantiation}\rE} \newcommand*{\maskE}{\rn{Mask}\rE} \newcommand*{\rangeE}{\rn{Range}\rE} @@ -75,15 +76,17 @@ %function call helper -\newcommand*{\nameFuncNameE}{\rn{NameExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByName}\rE} -\newcommand*{\nameFuncCountE}{\rn{NameExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByCount}\rE} -\newcommand*{\nameActionE}{\rn{NameExpression}\rSep\rn{ActionType}\rE} +\newcommand*{\nameFuncNameE}{\rn{Name}\rSep\rn{Func}\rAE\rSep\rn{1}} +\newcommand*{\nameFuncCountE}{\rn{Name}\rSep\rn{Func}\rAE\rSep\rn{2}} +\newcommand*{\nameActionE}{\rn{Name}\rSep\rn{Action}\rAE} %% \newcommand*{\nameActionNameE}{\rn{NameExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByName}\rE} %% \newcommand*{\nameActionCountE}{\rn{NameExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByCount}\rE} -\newcommand*{\expMemFuncNameE}{\rn{ExpMemExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByName}\rE} -\newcommand*{\expMemFuncCountE}{\rn{ExpMemExpression}\rSep\rn{FunctionType}\rSep\rn{ResolveByCount}\rE} -\newcommand*{\expMemActionNameE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByName}\rE} -\newcommand*{\expMemActionCountE}{\rn{ExpMemExpression}\rSep\rn{ActionType}\rSep\rn{ResolveByCount}\rE} +\newcommand*{\expMemExternNameE}{\rn{ExpMem}\rSep\rn{Extern}\rAE\rSep\rn{1}} +\newcommand*{\expMemExternCountE}{\rn{ExpMem}\rSep\rn{Extern}\rAE\rSep\rn{2}} +\newcommand*{\expMemSpcE}{\rn{ExpMem}\rSep\rn{Specialized}\rAE} +%% \newcommand*{\expMemSpcCountE}{\rn{Exp:ExpMem}\rSep\rn{Type:Specialized}\rSep\rn{Resolve:Count}\rE} + +\newcommand*{\inferTypeArgAE}{\rn{InferTypeArg}\rAE} \newcommand*{\assignmentS}{\rn{Assignment}\rS} \newcommand*{\emptyS}{\rn{Empty}\rS} @@ -167,10 +170,12 @@ \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} \newcommand{\expenv}[4]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3}, {#4}} \newcommand{\expenvv}[5]{\env_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} +\newcommand{\expenvvv}[3]{{#1}, \ctxt \vdash {#2} \leadsto {#3}} \newcommand{\expenvWithCtxt}[5]{\env, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} \newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}), ({#3})} \newcommand{\binOpEnv}[7]{\env \vdash {#1}, ({#4}, {#5}), ({#6}, {#7}) : {#2}, {#3}} \newcommand{\typWellFormed}[1]{\env \vdash {#1}} +\newcommand{\typNotWellFormed}[1]{\env \nvdash {#1}} \newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} \newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} %context. type of expression. type of returned name.exp @@ -185,19 +190,22 @@ \newcommand{\implCast}[2]{\castenv {i} {#1} {#2}} %exp, args. exp', type pars, pars, kind, return type. %check if you need the dir to be returned as well. -\newcommand{\resolveFuncOver}[7]{\env, \ctxt \vdash {#1}, {#2} \leadsto {#3}, {#4}, {#5}, {#6}, {#7}} -%return type. typ par : typ arg. par = exp. constraints (init to typ par : typ arg). typ par : typ arg (infered). -\newcommand{\inferTypParArg}[5]{\env, \ctxt \vdash {#1}, {#2}, {#3}, {#4} \mapsto {#5}} - +\newcommand{\resolveFuncOver}[7]{\env, \ctxt \vdash {#1}, {#2} \twoheadrightarrow {#3}, {#4}, {#5}, {#6}, {#7}} +%typ par : typ arg. par = exp. . typ par : typ arg (infered). +% this has an extra input in code (which is constraints (init to typ par : typ arg)) but it's never used so i dropped it. same for return type. +\newcommand{\inferTypParArg}[3]{\env, \ctxt \vdash {#1}, {#2} \mapsto {#3}} +\newcommand{\unify}[6]{{#1}, {#2}, {#3} \vDash {#4} \doteq {#5} \Vdash {#6}} %contexts: \newcommand{\cte}{\mathfrak{constant}} \newcommand{\applyBlockCtxt}{\mathfrak{applyBlock}} \newcommand{\actionCtxt}{\mathfrak{action}} +\newcommand{\tableActionCtxt}{\mathfrak{tableAction}} \newcommand{\funcCtxt}[1]{\mathfrak{function}\ {#1}} \newcommand{\parserCtxt}{\mathfrak{parserState}} \newcommand{\toplevel}{\mathfrak{topLevel}} +\newcommand{\declLocalCtxt}{\mathfrak{declLocal}} %operators: \newcommand{\mask}[2]{{#1}\ \&\&\&\ {#2}} @@ -220,6 +228,7 @@ \renewcommand{\div}{/} \renewcommand{\mod}{\%} \newcommand{\funcCall}[3]{{#1}\langle{#2}\rangle({#3})} +\newcommand{\funcCallNoTypArgs}[2]{{#1}({#2})} \newcommand{\expMem}[2]{{#1}.{#2}} \newcommand{\instantiation}[2]{{#1}({#2})} \newcommand{\assign}[2]{{#1}={#2}} @@ -243,6 +252,7 @@ %metavariables: +\newcommand{\anyTyp}{a} \newcommand{\env}{\Gamma} \newcommand{\typEnv}{\Gamma} \newcommand{\constEnv}{\Sigma} @@ -304,8 +314,14 @@ \newcommand{\argkvs}{\overline \argkv} \newcommand{\argkvss}[2]{\argkvi {#1}, \ldots, \argkvi {#2}} \newcommand{\names}{\overline \name} +\newcommand{\methods}[2]{\overline {{#1}:{#2}}} %function helpers +\newcommand{\mergeConst}[2]{\mathit{merge\_types}({#1},{#2})} +\newcommand{\toVoid}[1]{\mathit{voidify}({#1})} +\newcommand{\breakMaybes}[3]{\mathit{break\_option}({#1})=\left({#2},{#3}\right)} +\newcommand{\isExtern}[1]{\mathit{is\_extern}({#1})} +\newcommand{\nothing}{\bot} \newcommand{\maskTypeIs}[2]{\mathit{mask\_type}({#1},{#2})} % \typ = \intWidthTyp \width \textOr \bitWidthTyp \width \newcommand{\widthInt}[1]{\mathit{width\_int}({#1})} @@ -358,15 +374,16 @@ \newcommand{\allowedTypeForVar}[1]{\mathit{is\_allowed\_type\_for\_variable}({#1})} \newcommand{\checkParamShadow}[2]{\mathit{check\_parameter\_shadowing}({#1}, {#2})} \newcommand{\match}[2]{\mathit{match}({#1},{#2})} -\newcommand{\zip}[2]{\mathit{zip} ({#1},{#2})} +%% \newcommand{\zip}[2]{\mathit{zip} ({#1},{#2})} \newcommand{\matchParArg}[2]{\mathit{macth\_parameter\_argument}({#1},{#2})} \newcommand{\validatePars}[3]{\mathit{validate\_parameter}({#1})_{{#2},{#3}}} \newcommand{\maybe}[1]{{#1}_{\bot}} \newcommand{\castParArg}[1]{\mathit{cast\_parameter\_argument}({#1})} \newcommand{\callOK}[2]{\mathit{call\_ok}({#1},{#2})} \newcommand{\removeOptionalPars}[1]{\mathit{remove\_optional\_parameteres}({#1})} -\newcommand{\concatList}{++} +\newcommand{\concatList}[2]{{#1}\ +\!+\ {#2}} \newcommand{\isDirectionless}[1]{\mathit{is\_directionless}({#1})} +\newcommand{\whatevs}{\_} %fields \newcommand{\isValid}{\mathsf{isValid}} @@ -386,6 +403,12 @@ %kinds \newcommand{\builtin}{\mathsf{builtin}} \newcommand{\actionKind}{\mathsf{action}} +\newcommand{\parserKind}{\mathsf{parser}} +\newcommand{\controlKind}{\mathsf{control}} +\newcommand{\methodKind}{\mathsf{method}} +\newcommand{\externKind}{\mathsf{extern}} +\newcommand{\tableKind}{\mathsf{table}} +\newcommand{\funcKind}{\mathsf{function}} %keywords \newcommand{\newtypKey}{\mathsf{newtype}} @@ -442,7 +465,7 @@ \newcommand{\parserTyp}[2]{\mathsf{parser}\langle{#1}\rangle({#2})} \newcommand{\controlTyp}[2]{\mathsf{control}\langle{#1}\rangle({#2})} \newcommand{\packageTyp}[3]{\mathsf{package}\langle{#1}\rangle({#2},{#3})} -\newcommand{\actionTyp}[2]{\mathsf{action}(\mathit{data:}{#1},\mathit{control:}{#2})} +\newcommand{\actionTyp}[2]{\mathsf{action}(\mathsf{data:}\ {#1},\mathsf{control:}\ {#2})} \newcommand{\tableTyp}[1]{\mathsf{table}\ {#1}} \newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} \newcommand{\unitTyp}{()} diff --git a/lib/checker.ml b/lib/checker.ml index 28c315e7e..d14ef326b 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -520,6 +520,7 @@ and gen_all_constraints (env: CheckerEnv.t) ctx unknowns params_args constraints | [] -> constraints +(* DISCUSS WITH RYAN: constraints doesn't need to be passed here. it's being built and the inputed one is never used. same goes for ret. *) and infer_type_arguments env ctx ret type_params_args params_args constraints = let insert (env, args, unknowns) (type_var, type_arg) = match type_arg with @@ -3012,8 +3013,8 @@ and resolve_function_overload env ctx type_name args = *) and type_constructor_invocation env ctx tags decl_name type_args args : Prog.Expression.t list * Typed.Type.t = let open Typed.ConstructorType in - let type_args = List.map ~f:(translate_type_opt env []) type_args in(* translates types.type to typed.type if it's not dontcare.*) - let constructor_type = resolve_constructor_overload env decl_name args in (* gets the type of the constructor from the env by resolving params *) + let type_args = List.map ~f:(translate_type_opt env []) type_args in(* determines if type is dontcare.*) + let constructor_type = resolve_constructor_overload env decl_name args in let t_params = constructor_type.type_params in let w_params = constructor_type.wildcard_params in let params_args = match_params_to_args tags constructor_type.parameters args in From 5de3e977910be4fe44a9d3c2af82050032e3876c Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 9 Aug 2022 12:41:49 -0400 Subject: [PATCH 20/30] discuss constraints --- docs/petr4spec/Petr4-spec.mdk | 254 ++++++++++++++++++++++------------ docs/petr4spec/ops.tex | 4 +- 2 files changed, 166 insertions(+), 92 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index e7d6e049d..a635330f5 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -243,17 +243,11 @@ infrulehelper { ~ Begin Abstract -P4 is a language for programming the data plane of network -devices. Petr4 provides a clean-slate definitional interpreter -and a core calculus that models a fragment of P4. This document -provides a definition of Petr4's type system that is consistent -with its implementation. The target audience of this document -includes developers and debuggers who work on P4 implementations -such as Petr4 and P4C. In essence, this document may be of -interest to programmers who are interested in understanding -the implementation of Petr4 deeply. Additionally, it points out -the discrepencies of Petr4's type system with P4 spec and Petr4's -limitations. +P4's type system is currently distributed between its language specification and its reference implementation p4c. Unfortunattely, this state of affairs results in ambiguity while reasoning through the behavior of a P4 program, evident from the many issues opened on P4's GitHub repo. +In this document, we provide a formalization of P4's type system to unify the expected behavior of P4 programs. +The target audience of this document includes language designers and compiler experts +that work (or starting to work) on P4 as well as developers and debuggers that work +with P4 and require a deep understanding of it. ~ End Abstract ~ MathDefs @@ -263,51 +257,51 @@ limitations. [TOC] -# Overview { #sec-overview } - -```**TODO**: rewrite after finishing doc.``` +# Introduction { #sec-intro } -This document recognizes the need for having a formal type system for Petr4 and -defines such type system. It is organized as follows: +P4's type system is currently distributed between its [language specification][p4spec] and its [reference implementation][p4cgit](p4c). +P4 spec explains the type of (sub)programs in plain English +while p4c implements a type system for P4. +There are multiple problems with both: -- It first expresses the need to have a formal type system for P4 and familiarizes the -reader with the concept of a type system, its role in language design, and how to read -and understand a type system (Section [#sec-note]). -- It then focuses on the architecture of Petr4 and points out the part that this document focues on (Section [#sec-arch]). -- It also describes the structure of Petr4's type system (Section [#sec-petr4-type-sys]) and defines the metavariables used throughout this document (Section [#sec-metavar]). -- For those interested, it connects the formalziation in this document to the impelemntation of Petr4 (Section [#sec-conn]). +[p4spec]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html +[p4cgit]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html +1. Figuring out how a program behaves and whether it type checks or not is extremely hard. In P4 spec, one has to jump from place to place to find whether each part of the program type checks or not since information regarding type checking a program is staggered all over the place and even worse in some cases it is missing. In p4c, one has to either write a sample program and compile it to see if it type checks or they have to go through all p4c's code to figure out the behavior of their program. For example, ``todo: add github issues. add number of loc of p4c.`` +2. Adding a new feature to P4 requires extending its type system and often times results in revising parts of the current type system as well. Doing so for both P4 spec and p4c is rather burdensome and error-prone due to the distribution of explanation in P4 spec and implementation in p4c. +3. Even more concerning, despite lots of effort by the P4 language committee, there are discrepnecies between P4 spec and p4c's implementation. For example, ``TODO: add github issues`` -## Architecture { #sec-arch } - -Figure [#fig-arch] depicts part of Petr4's architecture that contains the type system. -After lexing and parsing a P4 program we get a program in our surface syntax. This -program is then passed through the _elaborator_ where type variables are introduced -instead of underscore and new type variable names are generated for variables with the -same name but in different scopes. This document does not discuss the innerworkings of -`elaborate`. Then, the program is passed through the type system (encoded in `checker`). -This document discusses the innerworking of the type system extensively. Finally, the -program is evaluated. +In this document, we formalize P4's type system. Formalizing P4 benefits the communit in different ways -~ Figure { #fig-arch; caption: "Part of Petr4's achitecture." } -![arch] -~ -[arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } +1. It makes working with and on P4 easier for both people who are just picking it up and those who have been working with/on it for some time. This is because clear formalization makes understanding a language and the behavior of programs written in it less cumbersome. +2. It provides a place for experts and users to refer to check the behavior of a program. It also provides a unified place for ensuring all references and implementations of P4 are consistent with each other. +3. It provides the bases for formally verifying P4's compilers and interpretors. -## Petr4's Type System { #sec-petr4-type-sys } +# Overview { #sec-overview } A P4 program is mainly a list of declarations and a declaration could be declaring a parser or control plane, instantiating an object, calling a (extern) function or method, and defining a type or an object. Each declaration may contain multiple statements and expressions within it. - Thus, Petr4's type system contains multiple typing judgments for -four main categories: -[types][#sec-types-typing], -[expressions][#sec-exp-typing], -[statements][#sec-stmt-typing], -and [declarations][#sec-decl-typing]. +Thus, in order to formalize P4's type system we need to: + +- have consisten and clear [notation][#sec-notation] +- formalize [P4's syntax][#sec-syntax] +- formalize type related rules, including [type well-formedness][#sec-type-well-formed], [type equality][#sec-type-eq], [type unification][#sec-type-unify] +- formalize [expressions typing][#sec-exp-typing] +- formalize [statements typing][#sec-stmt-typing] +- formalize [declarations typing][#sec-decl-typing] + +Furthermore, for readers who are less familiar with programming languages fundamentals we provide a [summary of programming languages terminology][#sec-terminology] and a [developer's guide to reading inference rules][#sec-guide]. + +Additionally, for developers and experts starting to work on Petr4 we provide a summary of its architecture and connect P4's formalization to Petr4's implementation in Appendix[#sec-petr4]. + +# Notation { #sec-notation } +In this section, we introduce the notation and naming convention that we use throughout this document. + +## Naming Convention Each typing judgment may use auxiliary judgment and helper functions. The auxiliary judgments are included in this document while the helper functions are just explained in plain English. @@ -319,16 +313,7 @@ Conventionally, in this document we accompany rule names with four possible suff - $\ruleNameS$ indicates that the rule is describing a rule for a statement - $\ruleNameD$ indicates that the rule is describing a rule for a declaration -The type system conducts three tasks simultaneously: - -1. It type checks P4 programs. -2. It conducts type inference. -3. It does a pass from the surface syntax to the first IR. - -```**TODO** maybe have more explanation on IR.``` - - -### Notation { #sec-notation } +## rest ``TODO: add followings.`` @@ -365,28 +350,14 @@ The following describes the metavariables used in this document: | $\anyTyp$ | a value of any type | ~ -## Connecting To The Implementation { #sec-conn } - -The following locates each data type in the implementation -(): - -- The surface AST is _types.program_ -- The type of programs of the surface syntax is _types.type.t_ -- The first IR is _prog.program_ -- The type of the first IR is _prog.type.t_ -- The type system is implemented in _checker.ml_ file. -For simplicity, we have removed the information that is needed to report when an error -happens. Such information is passed around in the surface syntax as a field (called -`tags`) of record for all data types. - -### Signatures +## Signatures ``TODO`` function signature. judgment signature. environment signature. -### contexts and environments +## contexts and environments -# Syntax +# Syntax { #sec-syntax } # Type Related Judgments { #sec-types-typing } @@ -1631,6 +1602,7 @@ $\funcCallNoTypArgs \exp \args$ both indicate a function call where A function call is well-typed if ``todo`` ```Check with ryan. when does it ever have partial assignment of type pars?``` +a type argument can be don't care and from there you'll have partial assignment. - The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1. it checks if the expression as a function call is acceptable, that is, if it is either a name or expression member @@ -1670,14 +1642,14 @@ It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \t ~ Begin InfRule - \mprset {vskip=0.5ex} + \mprset {vskip=0.7ex} {\inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ |\overline {\typ_0}| = |\typVars|\\\\ % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ - \matchParArg \prms \args = \overline {\param = \pprim {\maybe \exp}}\\ + \matchParArg \prms \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ @@ -1690,7 +1662,27 @@ It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \t \\ - \mprset {vskip=0.5ex} + \mprset {vskip=0.7ex} + {\inferrule + { + \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ + \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ + |\overline {\typ_0}| = |\typVars|\\\\ + % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ + \matchParArg \prms \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ + {\overline {\typVar : \maybe {\typ_1}}} = \constraint\\ + \inferTypParArg \constraint {\overline {\singleprm := \pprim {\maybe \exp}}} {\prim \constraint}\\\\ + \validatePars {\typs} {\unionEnv \env {\prim \constraint} } \kind \\ + \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + \callOK \ctxt \kind \\ + \sat {\typ_\ret} = {\prim \typ}_{\ret} + } + { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + \quad (\funcCallE\rSep\rn{discuss})} + +\\ + + \mprset {vskip=0.7ex} {\inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ @@ -1722,7 +1714,7 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { ```Concerns/questions:``` -- when does the expression typing returns an expression of type action (the $\nameActionE$ rule may never be trigured)? +- when does the expression typing returns an expression of type action (the $\nameActionE$ rule may never be trigured)? when the expression is a name and we look it up from the environment ~ Begin InfRuleHelper @@ -1833,6 +1825,22 @@ generates a list assignment of types to type variables ${\overline {\prim \typV \quad (\inferTypeArgAE) } +\\ + + \mprset {vskip=0.5ex} + {\inferrule + { \breakMaybes {\constraint_0} {\constraint_1} {\constraint_2}\\\\ + \prim \env = \unionEnv \env {\constraint_1}\\ + \expenvvv {\prim \env} {\exps} {\overline {\prim \exp, \prim \typ, \prim \dir}} \\\\ + \unify {\prim \env} \emp {\constraint_2} \typs {\overline {\prim \typ}} {\overline {\constraint_3}} \\\\ + \mergeConst {\constraint_2} {\overline {\constraint_3}} = \constraint_4\\\\ + \unionEnv {\constraint_1} {\toVoid{\constraint_4}} = \constraint_5 } + % \concatList {\overline {\typVar_2 : {\typ_2}}} { \toVoid {\overline {\typVar_3 : \maybe {\typ_5}}}} = {\overline {\typVar_1 : {\typ_6}}} } + {\inferTypParArg {\constraint_0} {\overline {\singleprm = {\maybe \exp}}} {\constraint_5}} + \quad (\inferTypeArgAE\rSep\rn{discuss}) + } + + ~ End InfRuleHelper ## Instantiation Rule { #sec-inst-e } @@ -2196,23 +2204,22 @@ Type System. ~~ ~ -# Appendix: Notation and Terminology { #sec-notation } +# Appendix: Programming Languages Terminology { #sec-terminology } -## Brief Terminology Note { #sec-note } - -It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages' terminology used in this document. +It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages terminology used in this document. **First, what is a type?** You can simply think of types as a set of language elements that share some features. For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. -That is why [@harper-types-PL] states: "The central organizing principle of language desing is the dientitfication of language features with types." +That is why Harper states: "The central organizing principle of language design is the identitfication of language features with types."[@harper-types-PL] +``TODO: add an example here of what a type looks like.`` **Second, what is a type system?** -A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expression, etc[@wiki-type-sys]. +A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expressions, etc.[@wiki-type-sys] Thus, a type system can be used as a simple reasoning tool for programs of a language. A type system formally defines many aspects of a programming language. -Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain errors in well-typed programs. +Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain group of errors in well-typed programs. **Third, what is surface syntax and intermediate representation (IR)?** The _surface syntax_ is the syntax used to write the source program by the developer @@ -2221,13 +2228,29 @@ The compiler does multiple _passes_ between different representations to add or information that it may or may not need. Each of these representations is called an _intermediate representation_. +``this paragraph is disconnected from the rest.`` Additionally, it is important for the reader to be able to read and understand typing rules which in essence are _inference rules_. Thus, we introduce inference rules by building a toy language gradually and providing its various typing rules at each step (Section [#sec-guide]). ## A Developer's Guide to Reading Inference Rules { #sec-guide } -A type system is made up of typing _rules_ that each has a specific _judgment form_. + +- ``maybe highlight the new feature and rule as you're adding them`` +- ``say and show name can also be on the side of the rule.`` +- ``state your type system changes based on your need`` +- ``have explanation on inductive relation, grammar, and judgment`` +- ``what we're basically doing is writing function/relation. it's a mathematical format for historical reasons we werite it this way.`` +- ``do not do build up`` +- ``have type checking with psudolang and show boilerplate and see how ugly. then massage it into inf rules and appeal to people's conciseness`` +- ``sigma v to t is total but the env itself is partial`` +- ``idea on some organization:`` + + grammars are inductively defined. a complier/rewritter can be inductively defined. + + these are a bunch of relation/function. eg: exp to type. then add env. wellformedness is also a function but it has a different judgment. + + the toatligy of it. the set of wel-typed terms is everything you can build with these rules. you can have a set. + + start at the bottom to show something type checkes. + +A type system is made up of typing _rules_. A typing rule has a specific _judgment form_ (which is the format it is written in and guides the reader on how to read all the typing rules using the judgement). A typing rule, in essence, is an _inference rule_. An inference rule contains zero or more _premises_ above the line and one _conclusion_ below the line @@ -2244,7 +2267,7 @@ $C$ is concluded if premises $A$ and $B$ hold. A rule without any premises is called an _axiom_ and it states that the conclusion holds uncoditionally. -Consider the simple toy expression language below that only consists of integers. Note +Consider the simple toy expression language below that only consists of integers for now. Note that $i$ is a _metavariable_ that represents any possible integer values. ~ Begin P4Grammar @@ -2252,7 +2275,7 @@ i := (any integer) e := i ~ End P4Grammar -We can have different typing systems for a language. For example, for the toy language we present two type systems. +We can have different typing systems for a language. For example, for our toy language we present two type systems. The first one has the judgment form $e$ which states that the expression $e$ is well-typed. For example, the rule $\rn{Integer1}\rE$ states that the expression $i$ is well-typed. Note that it does not state what its type is. @@ -2263,7 +2286,7 @@ state what its type is. {i} ~ End InfRule -We can a more detailed type system for our langauge. +We can have a more detailed type system for our langauge. The second type system has the judgment form $e:t$ which states that the expression $e$ is well-typed and it has the type $t$. Note that $t$ is a metavariable for all possible types of expressions. The rule $\rn{Integer2}\rE$ states that the @@ -2275,7 +2298,7 @@ expression $i$ is well-typed and it has the type $\mathsf{int}$. {i:\mathsf{int}} ~ End InfRule -We now extend the toy language by adding variable reference to expression which are +We now extend our toy language by adding variable reference to expression which are simply strings. ~ Begin P4Grammar @@ -2285,10 +2308,15 @@ e := i | v ~ End P4Grammar +``explain expression vs statement`` +``explain sigma: v to e is the type signature of env and say how to read it`` + Now our type systems have to include an environment. -The environment $\Sigma$ is needed to keep track of variables that have been declared and assigned a value/expression. The environment is a mapping of variables to a feature about the variable. This feature can be the type of the variable, the expression it has been assigned, or the value of evaluating the expression it has been assigned. +The environment $\Sigma$ is needed to keep track of variables that have been declared and assigned a value/expression. The environment is a mapping of variables to a feature about the variable. This feature can be the type of the variable, the expression it has been assigned, or the value resulting from evaluating the expression it has been assigned. -Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up.We only focus on expression's typing here. +Here, we consider the environment to be a mapping of variables to their assigned expressions, that is, $\Sigma : v \rightarrow e$. Note that assigning expressions to variables is done in statements and not expressions and that is where the environment is built up. We only focus on expression's typing here. + +``differentiate between the value of v which is a string and what it holds which is an expression and then it has the type int.`` The judgment form of our first type systems changes to $\Sigma \vdash e$ which states that under the environment $\Sigma$, the expression $e$ is well-typed. The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$, the expression $i$ is well-typed. @@ -2351,7 +2379,7 @@ well-typed. ~ End InfRule The $\rn{Integer2}\rE$ stays the same. However, the type of the expression assigned to -a variable now matters. This is stated in the $\rn{Variable2}\rE$. It particularly states that under the environment $\Sigma$, the expression $v$ has the type $t$ if the type of the expression $e$ assigned to the variable $v$ is $t$. Note that in this rule, we can no longer ignore the expression assigned to variable $v$ and returned by looking up the environment since we need to know its type. +a variable now matters. This is stated in the $\rn{Variable2}\rE$. It particularly states that under the environment $\Sigma$, the expression $v$ has the type $t$ if the type of the expression $e$ assigned to the variable $v$ is $t$. Note that in this rule, we can no longer ignore the expression assigned to variable $v$ which is returned by looking $v$ up in the environment since we need to know its type. The $\rn{Boolean2}\rE$ simply states that under the environment $\Sigma$, the expression $b$ has the type $\mathsf{bool}$. ~ Begin InfRule @@ -2457,8 +2485,8 @@ For example, the rules below rewrite expressions in our toy language (which uses and they have the judgment form $\Sigma \vdash e \rightarrow \prim e$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to expression $\prim e$ written in the prefix ordering. The rules $\rn{Integer3}\rE$, $\rn{Variable3}\rE$, and $\rn{Boolean3}\rE$ are rather simple. For example, the $\rn{Integer3}\rE$ rule states that under the environment $\Sigma$, the expression $i$ translates to $i$. -The rules $\rn{Addition3}\rE$ and $\rn{Equality3}\rE$ recursively translate their subexpressions and reorder their operator. -For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ translates to the expression $+ \ \prim {e_1} \ \prim {e_2}$ where expressions $\prim {e_1}$ and $\prim {e_2}$ are the translation of expressions $e_1$ and $e_2$, respectively. +The rules $\rn{Addition3}\rE$ and $\rn{Equality3}\rE$ recursively translate their subexpressions and reorder their operators. +For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ translates to the expression $+ \ \prim {e_1} \ \prim {e_2}$ where expressions $\prim {e_1}$ and $\prim {e_2}$ are the translations of expressions $e_1$ and $e_2$, respectively. ~ Begin InfRule \inferrule[\rn{Integer3}\rE] @@ -2484,6 +2512,7 @@ For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ {\Sigma \vdash e_1 == e_2 \rightarrow \ == \prim {e_1} \ \prim {e_2}} ~ End InfRule +``phrase the following paragraph and its point differently: the main point is that inference rules define inductively defined relation. these relations can be simple or complicated. eg, so far we have had simple ones but below we have more complicated ones. also use wiggly arrow and use colon for type, that is, i wiggly arrow i colon int`` An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewritting rules shown above and they have the judgment form $\Sigma \vdash e \rightarrow \prim e, t$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to the expression $\prim e$ written in the prefix ordering and has the type $t$. As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Sigma$, the expression $v$ translates to itself and has the type $t$ if the variable $v$ exists in environment $\Sigma$ and expression $e$ is assigned to it which has the type $t$. @@ -2514,4 +2543,47 @@ As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Si {\Sigma \vdash e_1 == e_2 \rightarrow \ == \ \prim {e_1} \ \prim {e_2}, \mathsf{bool}} ~ End InfRule +# Appendix: Petr4 { #sec-petr4 } + +## Petr4's Architecture { #sec-arch } + +Figure [#fig-arch] depicts part of Petr4's architecture that contains the type system. +After lexing and parsing a P4 program we get a program in our surface syntax. This +program is then passed through the _elaborator_ where type variables are introduced +instead of underscore and new type variable names are generated for variables with the +same name but in different scopes. This document does not discuss the innerworkings of +`elaborate`. Then, the program is passed through the type system (encoded in `checker`). +This document discusses the innerworking of the type system extensively. Finally, the +program is evaluated. + +~ Figure { #fig-arch; caption: "Part of Petr4's achitecture." } +![arch] +~ +[arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } + + +## Petr4's Type System { #sec-petr4-type-sys } + +The type system conducts three tasks simultaneously: + +1. It type checks P4 programs. +2. It conducts type inference. +3. It does a pass from the surface syntax to the first IR. + +```**TODO** maybe have more explanation on IR.``` + +## Connecting Formalization to Petr4's Implementation { #sec-conn } + +The following locates each data type in the implementation +(): + +- The surface AST is _types.program_ +- The type of programs of the surface syntax is _types.type.t_ +- The first IR is _prog.program_ +- The type of the first IR is _prog.type.t_ +- The type system is implemented in _checker.ml_ file. + +For simplicity, we have removed the information that is needed to report when an error +happens. Such information is passed around in the surface syntax as a field (called +`tags`) of record for all data types. diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index c20ddc7be..f91abef9a 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -194,7 +194,7 @@ %typ par : typ arg. par = exp. . typ par : typ arg (infered). % this has an extra input in code (which is constraints (init to typ par : typ arg)) but it's never used so i dropped it. same for return type. \newcommand{\inferTypParArg}[3]{\env, \ctxt \vdash {#1}, {#2} \mapsto {#3}} -\newcommand{\unify}[6]{{#1}, {#2}, {#3} \vDash {#4} \doteq {#5} \Vdash {#6}} +\newcommand{\unify}[6]{{#1}, {#2}, {#3} \vDash {#4} \Join {#5} \mapsto {#6}} %contexts: @@ -252,6 +252,7 @@ %metavariables: +\newcommand{\constraint}{C} \newcommand{\anyTyp}{a} \newcommand{\env}{\Gamma} \newcommand{\typEnv}{\Gamma} @@ -340,6 +341,7 @@ \newcommand{\shiftCond}[2]{\mathit{shift\_condition}({#1},{#2})} \newcommand{\addTypeEnv}[2]{\typEnv[{#1}:{#2}]} \newcommand{\addTypEnvv}[1]{\typEnv[{#1}]} +\newcommand{\unionEnv}[2]{{#1}\cup{#2}} \newcommand{\addConstEnv}[2]{\constEnv[{#1}={#2}]} \newcommand{\isNumeric}[1]{\mathit{is\_numeric}({#1})} %% \newcommand{\isArray}[1]{\mathit{is\_array}({#1})} From e19d2ed9da34b34dc803ef68be3b270d2f379ce2 Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 10 Aug 2022 15:12:39 -0400 Subject: [PATCH 21/30] func call done --- docs/petr4spec/Petr4-spec.mdk | 198 ++++++++++++++++++++++------------ docs/petr4spec/ops.tex | 7 +- 2 files changed, 136 insertions(+), 69 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index a635330f5..27f196387 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -348,6 +348,7 @@ The following describes the metavariables used in this document: | $\env$ | environments | | $\emp$ | empty list of elements | | $\anyTyp$ | a value of any type | +| $\constraint$, $\optConstraint$, $\nonoptConstraint$ | constraints | ~ @@ -756,6 +757,67 @@ the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which s ## Type Unification { #sec-type-unify } +- type unification for type produces by type checking, i.e., typed.type.t +- both types are reduced first. for breviety we omit the reduction from rules. so type 1 and type 2 in rules are already reduced. + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} + \quad (\rn{Bools})} + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \stringTyp \stringTyp {\overline {\typVar : \bot}}} + \quad (\rn{Strings})} + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \integerTyp \integerTyp {\overline {\typVar : \bot}}} + \quad (\rn{Integers})} + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \errTyp \errTyp {\overline {\typVar : \bot}}} + \quad (\rn{Errors})} + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \matchKindTyp \matchKindTyp {\overline {\typVar : \bot}}} + \quad (\rn{MatchKinds})} + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \voidTyp \voidTyp {\overline {\typVar : \bot}}} + \quad (\rn{Voids})} + + % \mprset {vskip=0.7ex} + % {\inferrule + % { } + % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} + % \quad (\rn{Bools})} + + % \mprset {vskip=0.7ex} + % {\inferrule + % { } + % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} + % \quad (\rn{Bools})} + + % \mprset {vskip=0.7ex} + % {\inferrule + % { } + % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} + % \quad (\rn{Bools})} + +~ End InfRule + # Expression's Typing Rules { #sec-exp-typing } The judgment form @@ -1170,6 +1232,7 @@ $\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$, the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only done implicitly or explicitly, respectively. +- $\trans \typ \emp$ ``TODO: complete`` ``**TODO**`` The implementation saturates types both in the $\castE$ rule as well as saturating them @@ -1599,10 +1662,7 @@ $\funcCallNoTypArgs \exp \args$ both indicate a function call where - $\args$ is the arguments passed to the function and they could be matched with parameters either based on name or position - $\typs$ is the type arguments passed to the function. -A function call is well-typed if ``todo`` - -```Check with ryan. when does it ever have partial assignment of type pars?``` -a type argument can be don't care and from there you'll have partial assignment. +A function call is well-typed if the called expression is an accepted function call and is well-typed and the passed (type) arguments do not violate any restrictions of (type) parameters. ``Ryan: better way of summarizing function call rule?`` - The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: 1. it checks if the expression as a function call is acceptable, that is, if it is either a name or expression member @@ -1610,10 +1670,11 @@ a type argument can be don't care and from there you'll have partial assignment. 3. it checks if the parameters and arguments match either based on their position or name. And has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. -- $\matchParArg \params \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\transMaybe \typ$ translates the surface type $\typ$ to underlying types and if the surface type is $\dontcareTyp$ it assigns $\bot$ to it. ``TODO: rewrite after adding syntax.`` +- $\matchParArg \prms \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. - $\validatePars \singleprm \env \kind$ validates the parameter $\singleprm$ under the environment $\env$ and the function kind $\kind$. That is, it confirms that the parameter is valid if **none** of the following cases hold: + $(\sat \typ) = \externTyp \whatevs$ and $\dir \neq \less$ - + $\compTimeKnown (\sat \typ)$ and $\dir \neq \less$ + + $\compTimeKnown {\sat \typ}$ and $\dir \neq \less$ + $\typNotWellFormed (\sat \typ)$ And **one** of the following holds: @@ -1622,8 +1683,10 @@ a type argument can be don't care and from there you'll have partial assignment. + $\kind = \methodKind$ and $\sat \typ=\externTyp \whatevs$ - The [infer type arguments auxiliary judgment][#sec-infer-type-args] infers the type of type parameters of a function call using the arguments passed to it and to ensure that they all match. -It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \typ}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar : \pprim \typ}}$ which states that under environment $\env$ and context $\ctxt$, the type parameters $\typVars$ have the type $\pprim \typ$ given the assignment of type parameters $\typVars$ to optional types $\overline {\maybe {\prim \typ}}$ and the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$. -- $\castParArg {\overline {\param = \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +It has the judgment form $\inferTypParArg {{\maybe \constraint}} {\overline {\singleprm := {\maybe \exp}}} {\prim \constraint}$ which states that under environment $\env$ and context $\ctxt$, +the assignment of arguments $\overline {\maybe \exp}$ to parameters $prms$ is valid under the constraints $\prim \constraint$ as long as the constraints $\prim \constraint$ do not contradict the constraints $\maybe \constraint$. +Constraints $\constraint$ are assignments of types to type variables and optional constraints $\maybe \constraint$ are assignments of optional types to type variable. Note that constraints denoted by a letter have the same fixed vector of type variables. +- $\castParArg {\overline {\param := \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. - $\callOK \ctxt \kind$ checks if the function kind is valid in a context. The following cases valid: ``TODO: break up ctxt. here ctxt is exprctxt.`` + $\ctxt = \parserCtxt$ and $\kind = \parserKind$ + $\ctxt = \applyBlockCtxt$ and $\kind = \controlKind$ @@ -1642,43 +1705,43 @@ It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \t ~ Begin InfRule - \mprset {vskip=0.7ex} - {\inferrule - { - \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ - \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ - |\overline {\typ_0}| = |\typVars|\\\\ - % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ - \matchParArg \prms \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ - % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ - \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ - \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ - \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ - \callOK \ctxt \kind \\ - \sat {\typ_\ret} = {\prim \typ}_{\ret} - } - { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } - \quad (\funcCallE)} - -\\ +% \mprset {vskip=0.7ex} +% {\inferrule +% { +% \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ +% \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ +% |\overline {\typ_0}| = |\typVars|\\\\ +% % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ +% \matchParArg \prms \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ +% % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ +% \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ +% \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ +% \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ +% \callOK \ctxt \kind \\ +% \sat {\typ_\ret} = {\prim \typ}_{\ret} +% } +% { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } +% \quad (\funcCallE)} + +% \\ \mprset {vskip=0.7ex} {\inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ - \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ + \transMaybe {\overline {\typ_0}} = \overline {\maybe {\typ_1}}\\ |\overline {\typ_0}| = |\typVars|\\\\ % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ \matchParArg \prms \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ - {\overline {\typVar : \maybe {\typ_1}}} = \constraint\\ - \inferTypParArg \constraint {\overline {\singleprm := \pprim {\maybe \exp}}} {\prim \constraint}\\\\ - \validatePars {\typs} {\unionEnv \env {\prim \constraint} } \kind \\ + % {\overline {\typVar : \maybe {\typ_1}}} = \constraint\\ + \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm := \pprim {\maybe \exp}}} { \constraint}\\\\ + \validatePars {\typs} {\unionEnv \env { \constraint} } \kind \\ \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ \callOK \ctxt \kind \\ \sat {\typ_\ret} = {\prim \typ}_{\ret} } { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } - \quad (\funcCallE\rSep\rn{discuss})} + \quad (\funcCallE)} \\ @@ -1686,11 +1749,11 @@ It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \t {\inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ - \matchParArg \params \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ - % \inferTypParArg {\typ_\ret} {\overline {\typVar : \bot }} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar : \bot}} {\overline {\typVar : \prim \typ}}\\\\ - \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}}\\\\ - \validatePars {\params} {\addTypEnvv {\overline {\typVar : \prim \typ}} } \kind \\ - \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \pprim \typ, \dir)}}\\\\ + \matchParArg \params \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ + \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm := \pprim {\maybe \exp}}} \constraint \\\\ + % \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}}\\\\ + \validatePars {\params} {\unionEnv \env {\constraint} } \kind \\ + \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \pprim \typ, \dir)}}\\\\ \callOK \ctxt \kind \\ \sat {\typ_\ret} = {\prim \typ}_{\ret} } @@ -1712,11 +1775,6 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { - Remember that parameters could be optional or have some default expression set as their expression. $\removeOptionalPars \params$ removes those parameters. - $\concatList {\overline \anyTyp} {\overline {\prim \anyTyp}}$ denotes concatenating two lists. -```Concerns/questions:``` - -- when does the expression typing returns an expression of type action (the $\nameActionE$ rule may never be trigured)? when the expression is a name and we look it up from the environment - - ~ Begin InfRuleHelper \mprset {vskip=0.5ex} @@ -1797,47 +1855,51 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { ### Infer Type Arguments Auxiliary Judgment { #sec-infer-type-args } This auxiliary judgment is used to infer the type of type parameters of a function call using the -arguments passed to it and to ensure that they all match. -It has the judgment form $\inferTypParArg {\overline {\typVar : \maybe {\prim \typ}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar : \pprim \typ}}$ which states that under environment $\env$ and context $\ctxt$, the type parameters $\typVars$ have the type $\pprim \typ$ given the assignment of type parameters $\typVars$ to optional types $\overline {\maybe {\prim \typ}}$ and the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$ if -the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any incosistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. +arguments passed to it and to ensure that there are no conflicts in the inferred types. +It has the judgment form $\inferTypParArg {\maybe \constraint} {\overline {\singleprm = {\maybe \exp}}} {\prim \constraint}$ which reads as under environment $\env$ and context $\ctxt$, the types of type parameters in the constraints $\maybe \constraint$ are inferred and returned in constraints $\prim \constraint$ given the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$. +As a reminder, constraints $\constraint$ are assignment of type parameters to types and optional constraints $\maybe \constraint$ are assignment of type parameters to optional types. The vector of type parameters in each constraint denoted by a letter is fixed. Hence, we additionally use $\optConstraint$ and $\nonoptConstraint$ to denote constraints when we have different vectors of type parameters. This means, for example, $\maybe \constraint$ and $\prim \constraint$ have the same vector of type parameters but the assignment of types to type parameters has changed. +The rule $\inferTypeArgAE$ states that +under environment $\env$ and context $\ctxt$, the types of type parameters in the constraints $\maybe \constraint$ are inferred and returned in constraints $\prim \constraint$ given the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$ +if the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any incosistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. -- $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim \anyTyp}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ and another that only contains the ones that are $\bot$. -- As a reminder $\unify \env {\overline {\typVar_1 = \typVar_2}} {{\typVars}} \typ { {\prim \typ}} { {\overline {\typVar : \maybe {\pprim \typ}}}}$ unifies the types $\typ$ and $\prim \typ$ under environment $\env$, equivalent type variables ${\overline {\typVar_1 = \typVar_2}}$, and type variables $\typVars$ that do not have any type assigned to them yet. If it can unify the two types, it -generates a list assignment of types to type variables ${\overline {\prim \typVar : \maybe {\pprim \typ}}}$. For detailed rules of this judgment refer to Section [#sec-type-unify]. -- $\mergeConst {\overline {\typVar : \bot}} {\overline {\overline {\typVar : \maybe {\typ}}}}$ merges the types assigned to type variables $\typVars$ recursively. It starts from no assignment ${\overline {\typVar : \bot}}$ as the base and recursively folds the merge of assigned types to a type variable from the list of assignments $\overline {\overline {\typVar : \maybe {\typ}}}$. The merging of types, that is, $\mathit{merge}(\typVar_1 : \typ_1, \typVar_1 :\typ_2)$, tries the following and if none of them matches it fails: + +- $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim \anyTyp}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ and another that only contains the ones that are $\bot$. So in the rule $\inferTypeArgAE$, the $\maybe \optConstraint$ is the list of type parameters that do not have a type assigned to them. +- As a reminder $\unify \env \typeEqs {{\typVars}} \typ { {\prim \typ}} {\maybe \constraint}$ unifies the types $\typ$ and $\prim \typ$ under environment $\env$, equivalent type variables $\typeEqs$ (which expanded is ${\overline {\typVar_1 = \typVar_2}}$), and type variables $\typVars$ that do not have any type assigned to them yet and returns the constraints $\maybe \constraint$ that is required for the two types to be unified. +For detailed rules of this judgment refer to Section [#sec-type-unify]. +- $\mergeConst {\overline {\maybe \constraint}}$ merges the types assigned to type variables in the list of constraints $\overline {\maybe \constraint}$ recursively. It starts from no assignment to any of the type variables as the base and recursively folds the merge of assigned types to a type variable from the list of assignments $\overline {\maybe \constraint}$. The merging of types, that is, $\mathit{merge}(\typVar_1 : \typ_1, \typVar_1 :\typ_2)$, tries the following and if none of them matches it fails: + if $\typEqEnv \emp {\typ_1} {\typ_2}$, then $\typ_1$ + if $\implCast {\typ_1} {\typ_2}$, then $\typ_2$ + if $\implCast {\typ_2} {\typ_1}$, then $\typ_1$ -- $\toVoid {\overline {\typVar : \maybe \typ}}$ takes a list of type variables with their optional assignments and if the assigment is $\bot$, it assigns the $\voidTyp$ type to the type variable. It leaves the type variables that have type assignments untouched. +- $\toVoid {\overline {\maybe \constraint}}$ assigns the $\voidTyp$ type to the type variables in constraints $\maybe \constraint$ that do not have a type assigned to them, i.e., $\bot$ is assigned to them. It leaves the type variables that have type assignments untouched. ~ Begin InfRuleHelper - \mprset {vskip=0.5ex} - {\inferrule - { \breakMaybes {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\typVar_2 : \typ_2}} {\overline {\typVar_3 : \bot}}\\\\ - \expenvvv {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} {\exps} {\overline {\prim \exp, \prim \typ, \prim \dir}} \\\\ - \unify {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} \emp {\overline {\typVar_3}} \typs {\overline {\prim \typ}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} \\\\ - \mergeConst {\overline {\typVar_3 : \bot}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} = {\overline {\typVar_3 : \maybe {\typ_5}}}\\\\ - \concatList {\overline {\typVar_2 : {\typ_2}}} { \toVoid {\overline {\typVar_3 : \maybe {\typ_5}}}} = {\overline {\typVar_1 : {\typ_6}}} } - {\inferTypParArg {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar_1 : {\typ_6}}}} - \quad (\inferTypeArgAE) - } + % \mprset {vskip=0.5ex} +% {\inferrule +% { \breakMaybes {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\typVar_2 : \typ_2}} {\overline {\typVar_3 : \bot}}\\\\ +% \expenvvv {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} {\exps} {\overline {\prim \exp, \prim \typ, \prim \dir}} \\\\ +% \unify {\addTypEnvv {\overline {\typVar_2 : \typ_2}}} \emp {\overline {\typVar_3}} \typs {\overline {\prim \typ}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} \\\\ +% \mergeConst {\overline {\typVar_3 : \bot}} {\overline {\overline {\typVar_3 : \maybe {\typ_4}}}} = {\overline {\typVar_3 : \maybe {\typ_5}}}\\\\ +% \concatList {\overline {\typVar_2 : {\typ_2}}} { \toVoid {\overline {\typVar_3 : \maybe {\typ_5}}}} = {\overline {\typVar_1 : {\typ_6}}} } +% {\inferTypParArg {\overline {\typVar_1 : \maybe {\typ_1}}} {\overline {\singleprm = {\maybe \exp}}} {\overline {\typVar_1 : {\typ_6}}}} +% \quad (\inferTypeArgAE) +% } -\\ +% \\ \mprset {vskip=0.5ex} {\inferrule - { \breakMaybes {\constraint_0} {\constraint_1} {\constraint_2}\\\\ - \prim \env = \unionEnv \env {\constraint_1}\\ + { \breakMaybes {\maybe \constraint} {\nonoptConstraint} {\maybe \optConstraint}\\\\ + \prim \env = \unionEnv \env {\nonoptConstraint}\\ \expenvvv {\prim \env} {\exps} {\overline {\prim \exp, \prim \typ, \prim \dir}} \\\\ - \unify {\prim \env} \emp {\constraint_2} \typs {\overline {\prim \typ}} {\overline {\constraint_3}} \\\\ - \mergeConst {\constraint_2} {\overline {\constraint_3}} = \constraint_4\\\\ - \unionEnv {\constraint_1} {\toVoid{\constraint_4}} = \constraint_5 } + \unify {\prim \env} \emp {\maybe \optConstraint} \typs {\overline {\prim \typ}} {\overline {\maybe {\prim \optConstraint}}} \\\\ + \mergeConst {\overline {\maybe {\prim \optConstraint}}} = \maybe {\pprim \optConstraint}\\\\ + \unionEnv {\nonoptConstraint} {\toVoid{\maybe {\pprim \optConstraint}}} = \prim \constraint } % \concatList {\overline {\typVar_2 : {\typ_2}}} { \toVoid {\overline {\typVar_3 : \maybe {\typ_5}}}} = {\overline {\typVar_1 : {\typ_6}}} } - {\inferTypParArg {\constraint_0} {\overline {\singleprm = {\maybe \exp}}} {\constraint_5}} - \quad (\inferTypeArgAE\rSep\rn{discuss}) + {\inferTypParArg {\maybe \constraint} {\overline {\singleprm := {\maybe \exp}}} {\prim \constraint}} + \quad (\inferTypeArgAE) } diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index f91abef9a..6974340c4 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -253,6 +253,9 @@ %metavariables: \newcommand{\constraint}{C} +\newcommand{\optConstraint}{B} +\newcommand{\nonoptConstraint}{N} +\newcommand{\typeEqs}{\Delta} \newcommand{\anyTyp}{a} \newcommand{\env}{\Gamma} \newcommand{\typEnv}{\Gamma} @@ -318,7 +321,7 @@ \newcommand{\methods}[2]{\overline {{#1}:{#2}}} %function helpers -\newcommand{\mergeConst}[2]{\mathit{merge\_types}({#1},{#2})} +\newcommand{\mergeConst}[1]{\mathit{merge\_types}({#1})} \newcommand{\toVoid}[1]{\mathit{voidify}({#1})} \newcommand{\breakMaybes}[3]{\mathit{break\_option}({#1})=\left({#2},{#3}\right)} \newcommand{\isExtern}[1]{\mathit{is\_extern}({#1})} @@ -360,6 +363,7 @@ \newcommand{\compTimeKnown}[1]{\mathit{compile\_time\_known}({#1})_\env} \newcommand{\sat}[1]{\mathit{saturate}({#1})_\env} \newcommand{\trans}[2]{\mathit{translate}({#1})_{\env,{#2}}} +\newcommand{\transMaybe}[1]{\mathit{optional\_translate}({#1})_{\env}} \newcommand{\isValidNestedTyp}[1]{\mathit{is\_valid\_nested}({#1})_\env} %{#1} is outer, 2 is inner \newcommand{\noDup}[1]{\mathit{no\_duplicate}({#1})} @@ -416,6 +420,7 @@ \newcommand{\newtypKey}{\mathsf{newtype}} %types: +\newcommand{\dontcareTyp}{\mathsf{dont\_care}} \newcommand{\bitWidthTyp}[1]{\mathsf{bit}\langle{#1}\rangle} \newcommand{\intWidthTyp}[1]{\mathsf{int}\langle{#1}\rangle} \newcommand{\boolTyp}{\mathsf{bool}} From 2257660c1bf61003f5ab90c430e4b849c26116b9 Mon Sep 17 00:00:00 2001 From: pataei Date: Thu, 11 Aug 2022 14:50:52 -0400 Subject: [PATCH 22/30] added anonymous instantiation and initial type unification...both have to be completed --- docs/petr4spec/Petr4-spec.mdk | 243 ++++++++++++++++++++++++++++++---- docs/petr4spec/ops.tex | 10 +- lib/checker.ml | 2 +- 3 files changed, 226 insertions(+), 29 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 27f196387..f305f9107 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -344,6 +344,7 @@ The following describes the metavariables used in this document: | $\typ$ | types | | $\dir$ | directions | | $\typVar$ | type variables | +| $\wildcardParam$ | wild card type parameters | | $\field$ | field names | | $\env$ | environments | | $\emp$ | empty list of elements | @@ -712,10 +713,11 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re ~ Begin InfRule \inferrule - { \typWellFormed \typ \\ + { \typWellFormed {\typ_\ret} \\ % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ - \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs} } - { \typWellFormed {\constructorTyp \typ \name \typParams {\prms}} } + \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs} \\ + \isDirectionless {\dirs}} + { \typWellFormed {\constructorTyp \typParams \prms \wildcardParams {\typ_\ret}}} \quad (\constructorT) ~ End InfRule @@ -798,26 +800,182 @@ the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which s { \unify \env \typeEqs \typVars \voidTyp \voidTyp {\overline {\typVar : \bot}}} \quad (\rn{Voids})} - % \mprset {vskip=0.7ex} - % {\inferrule - % { } - % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} - % \quad (\rn{Bools})} +~ End InfRule + + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Specializeds})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{TypeNames})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{NewTypes})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{FixedLengths})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Arrays})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Tuples})} + +~ End InfRule + +~ Begin InfRule + +% check which one of record, header, header union, struct you used in well-formedness. + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Records})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Sets})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Enums})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Packages})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Controls})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Parsers})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Externs})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Actions})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Functions})} - % \mprset {vskip=0.7ex} - % {\inferrule - % { } - % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} - % \quad (\rn{Bools})} +~ End InfRule + +~ Begin InfRule - % \mprset {vskip=0.7ex} - % {\inferrule - % { } - % { \unify \env \typeEqs \typVars \boolTyp \boolTyp {\overline {\typVar : \bot}}} - % \quad (\rn{Bools})} + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Constructors})} + +~ End InfRule + +~ Begin InfRule + + \mprset {vskip=0.7ex} + {\inferrule + { } + { \unify \env \typeEqs \typVars \ \ {\overline {\typVar : \bot}}} + \quad (\rn{Tables})} ~ End InfRule +``TODO: check see if you need implicit casting incorporated in unification of types.`` + # Expression's Typing Rules { #sec-exp-typing } The judgment form @@ -1864,7 +2022,7 @@ under environment $\env$ and context $\ctxt$, the types of type parameters in th if the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any incosistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. -- $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim \anyTyp}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ and another that only contains the ones that are $\bot$. So in the rule $\inferTypeArgAE$, the $\maybe \optConstraint$ is the list of type parameters that do not have a type assigned to them. +- $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim {\maybe \anyTyp}}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ (that is, $\overline {\prim \anyTyp}$) and another that only contains the ones that are $\bot$ (that is, $\overline {\pprim {\maybe \anyTyp}}$). So in the rule $\inferTypeArgAE$, the $\maybe \optConstraint$ is the list of type parameters that do not have a type assigned to them. - As a reminder $\unify \env \typeEqs {{\typVars}} \typ { {\prim \typ}} {\maybe \constraint}$ unifies the types $\typ$ and $\prim \typ$ under environment $\env$, equivalent type variables $\typeEqs$ (which expanded is ${\overline {\typVar_1 = \typVar_2}}$), and type variables $\typVars$ that do not have any type assigned to them yet and returns the constraints $\maybe \constraint$ that is required for the two types to be unified. For detailed rules of this judgment refer to Section [#sec-type-unify]. - $\mergeConst {\overline {\maybe \constraint}}$ merges the types assigned to type variables in the list of constraints $\overline {\maybe \constraint}$ recursively. It starts from no assignment to any of the type variables as the base and recursively folds the merge of assigned types to a type variable from the list of assignments $\overline {\maybe \constraint}$. The merging of types, that is, $\mathit{merge}(\typVar_1 : \typ_1, \typVar_1 :\typ_2)$, tries the following and if none of them matches it fails: @@ -1905,23 +2063,58 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. ~ End InfRuleHelper -## Instantiation Rule { #sec-inst-e } +## Anonymous Instantiation Rule { #sec-inst-e } + +``TODO: complete this thu aug 11`` + +- validate par arg checks if optional is some and it passes if expression is compile time known or if it is none and parameter is none. ~ Begin InfRule - % \inferrule - % { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } - % { \expenv {\instantiation {\spcTyp \name {\typ_1, \ldots, \typ_m}} {\arg_1, \ldots, \arg_n}} {\instantiation {\spcTyp \name {\typArg_1, \ldots, \typArg_m}} {\prim {\arg_1}, \ldots, \prim {\arg_n}}} {\prim \typ} \less} - % \quad (\instE:\rn{SpecializedType}) + \inferrule + % { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } + { \transMaybe \typs = \overline {\prim {\maybe \typ}} \\ + \resolveConstOver \name \args \typParams \wildcardParams \prms \retTyp \\ + \matchParArg \prms \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ + |\typs| = |\typParams| \\ + \inferTypParArg {\concatList {\overline {\typVar : \maybe {\typ_1}}} {\overline {\wildcardParam : \bot}}} {\overline {\singleprm := \pprim {\maybe \exp}}} { \constraint}\\\\ + \prim \env = \unionEnv \env \constraint \\ + \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + \validateParArg {\overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}}\\ + \sat \retTyp = \prim \retTyp} + { \expenv {\instantiation {\spcTyp \name {\typs}} {\args}} {\instantiation {\spcTyp \name {\typs}} {\overline {\prim \arg}}} {\pprim \typ} \less} + \quad (\instE\rSep\rn{1}) +% typename of type_nameless_instantiation \inferrule - { \expenv {\instantiation {\spcTyp \name {\ }} {\arg_1, \ldots, \arg_n}} {\prim \exp} \typ \dir} + { \expenv {\instantiation {\spcTyp \name {\ }} {\args}} {\prim \exp} \typ \dir} %name in the following is typename { \expenv {\instantiation {\name} {\args}} {\prim \exp} \typ \dir } \quad (\instE\rSep\rn{2}) ~ End InfRule +~ Begin InfRuleHelper + + \mprset {vskip=0.5ex} + { \inferrule + { \lookupEnv \name = \overline {(\typ, \dir)} \\ + \exists (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)}} + { \resolveConstOver \name {\overline {\var = \exp}} \typParams \wildcardParams \prms \retTyp } + \quad (blah) + } + + \mprset {vskip=0.5ex} + { \inferrule + { \lookupEnv \name = \overline {(\typ, \dir)} \\ + \exists (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)} \\ + |\removeOptionalPars \params| = |\argexps|} + { \resolveConstOver \name \argexps \typParams \wildcardParams \prms \retTyp } + \quad (blah) + } + +~ End InfRuleHelper + ## Mask Rule { #sec-mask-e } The expression $\mask {\exp_1} {\exp_2}$ denotes a masking expression where every 0 bit in $\exp_2$ is turned into don't care and the rest of the bits of expressions $\exp_1$ and $\exp_2$ are conjuncted. Thus, it returns a set of expressions: diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 6974340c4..de34a7f32 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -195,7 +195,7 @@ % this has an extra input in code (which is constraints (init to typ par : typ arg)) but it's never used so i dropped it. same for return type. \newcommand{\inferTypParArg}[3]{\env, \ctxt \vdash {#1}, {#2} \mapsto {#3}} \newcommand{\unify}[6]{{#1}, {#2}, {#3} \vDash {#4} \Join {#5} \mapsto {#6}} - +\newcommand{\resolveConstOver}[6]{\env, \ctxt \vdash {#1}, {#2} \twoheadrightarrow {#3}, {#4}, {#5}, {#6}} %contexts: \newcommand{\cte}{\mathfrak{constant}} @@ -297,7 +297,8 @@ \newcommand{\typParams}{\overline \typParam} \newcommand{\pari}[1]{\dir_{#1} \typ_{#1} \typParam_{#1}} \newcommand{\pars}[2]{\pari {#1}, \ldots, \pari {#2}} -\newcommand{\wildcardParam}{w} +% wildcard param for wild card type vars. +\newcommand{\wildcardParam}{W} \newcommand{\wildcardParams}{\overline \wildcardParam} \renewcommand{\arg}{\mathit{arg}} \newcommand{\args}{\overline \arg} @@ -309,6 +310,7 @@ \newcommand{\dcl}{\mathit{dcl}} \newcommand{\kind}{k} \newcommand{\ret}{\mathit{return}} +\newcommand{\retTyp}{\typ_\ret} \newcommand{\argexp}{\exp} \newcommand{\argexps}{\overline \argexp} \newcommand{\argexpi}[1]{\argexp_{#1}} @@ -383,6 +385,7 @@ %% \newcommand{\zip}[2]{\mathit{zip} ({#1},{#2})} \newcommand{\matchParArg}[2]{\mathit{macth\_parameter\_argument}({#1},{#2})} \newcommand{\validatePars}[3]{\mathit{validate\_parameter}({#1})_{{#2},{#3}}} +\newcommand{\validateParArg}[1]{\mathit{validate\_parmeter\_argument}({#1})} \newcommand{\maybe}[1]{{#1}_{\bot}} \newcommand{\castParArg}[1]{\mathit{cast\_parameter\_argument}({#1})} \newcommand{\callOK}[2]{\mathit{call\_ok}({#1},{#2})} @@ -466,7 +469,8 @@ \newcommand{\simpFuncTyp}[2]{{#1} \rightarrow {#2}} %kind.type param. param. return type. \newcommand{\funcType}[4]{\mathsf{function}\ {#1}\ \langle{#2}\rangle ({#3})\rightarrow {#4}} -\newcommand{\constructorTyp}[4]{{#1}\ {#2}\ \langle{#3}\rangle\ ({#4}, \_)} +% type params: list of name. wildcard param: list of name. params: list of type dir name. return: typed. +\newcommand{\constructorTyp}[4]{\mathsf{constructor}\langle{#1},{#2}\rangle\ ({#3}) \rightarrow {#4}} \newcommand{\externTyp}[1]{\mathsf{extern} \ {#1}} \newcommand{\spcTyp}[2]{{#1}\langle{#2}\rangle} \newcommand{\parserTyp}[2]{\mathsf{parser}\langle{#1}\rangle({#2})} diff --git a/lib/checker.ml b/lib/checker.ml index d14ef326b..9a9b817af 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -2769,7 +2769,6 @@ and call_ok (ctx: ExprContext.t) (fn_kind: Typed.FunctionType.kind) : bool = | _, Builtin -> true end -(* TODO *) and type_function_call env ctx call_tags func type_args (args: Argument.t list) : Prog.Expression.t = let open Prog.Expression in (* Printf.printf "we're here!!!"; *) @@ -3020,6 +3019,7 @@ and type_constructor_invocation env ctx tags decl_name type_args args : Prog.Exp let params_args = match_params_to_args tags constructor_type.parameters args in let type_params_args = infer_constructor_type_args env ctx t_params w_params params_args type_args in let env' = CheckerEnv.insert_types type_params_args env in + (* have to add this. TODO*) let cast_arg (param, arg: Typed.Parameter.t * Types.Expression.t option) = match cast_param_arg env' ctx tags (param, arg) with | _, Some e -> From 31d9d2fe04db33fb43235267495f21603dfd883b Mon Sep 17 00:00:00 2001 From: pataei Date: Fri, 12 Aug 2022 13:07:15 -0400 Subject: [PATCH 23/30] revised func call --- docs/petr4spec/Petr4-spec.mdk | 86 ++++++++++++++++++----------------- docs/petr4spec/ops.tex | 19 ++++---- lib/checker.ml | 43 +++++++++++++++++- 3 files changed, 97 insertions(+), 51 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index f305f9107..df649f62a 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -1811,7 +1811,7 @@ true and the false expressions have the infinite precision integer type when the condition can be evaluated at compilation time. However, this is allowed by P4 spec. -## Function Call Rule +## Function Call Rule { #sec-func-call } Expressions $\funcCall \exp {\typs} \args$ and $\funcCallNoTypArgs \exp \args$ both indicate a function call where @@ -1820,9 +1820,9 @@ $\funcCallNoTypArgs \exp \args$ both indicate a function call where - $\args$ is the arguments passed to the function and they could be matched with parameters either based on name or position - $\typs$ is the type arguments passed to the function. -A function call is well-typed if the called expression is an accepted function call and is well-typed and the passed (type) arguments do not violate any restrictions of (type) parameters. ``Ryan: better way of summarizing function call rule?`` +A function call is well-typed if the called expression is an accepted function call and is well-typed and the passed (type) arguments do not violate any restrictions of (type) parameters. -- The [function call auxiliary judgment][#sec-func-call] carries out multiple roles: +- The [dispatch function call arguments auxiliary judgment][#sec-func-call-helper] carries out multiple roles: 1. it checks if the expression as a function call is acceptable, that is, if it is either a name or expression member 2. it checks if the type of the expression is either a function, an action, an extern, or a specialized type 3. it checks if the parameters and arguments match either based on their position or name. @@ -1830,12 +1830,13 @@ A function call is well-typed if the called expression is an accepted function c And has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. - $\transMaybe \typ$ translates the surface type $\typ$ to underlying types and if the surface type is $\dontcareTyp$ it assigns $\bot$ to it. ``TODO: rewrite after adding syntax.`` - $\matchParArg \prms \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. +- $\types \constraint$ returns the types assigned to the vector of type variables in the constraint $\constraint$. - $\validatePars \singleprm \env \kind$ validates the parameter $\singleprm$ under the environment $\env$ and the function kind $\kind$. That is, it confirms that the parameter is valid if **none** of the following cases hold: + $(\sat \typ) = \externTyp \whatevs$ and $\dir \neq \less$ + $\compTimeKnown {\sat \typ}$ and $\dir \neq \less$ + $\typNotWellFormed (\sat \typ)$ - And **one** of the following holds: + And **one** of the following holds: ```TODO: this is wrong. refer to is\_valid\_param\_type. however, I prefer finding a way to avoid writing all the cases in that function.``` + $\kind = \parserKind$ and $\sat \typ=\externTyp \whatevs$ + $\kind = \controlKind$ and $\sat \typ=\externTyp \whatevs$ + $\kind = \methodKind$ and $\sat \typ=\externTyp \whatevs$ @@ -1844,7 +1845,12 @@ arguments passed to it and to ensure that they all match. It has the judgment form $\inferTypParArg {{\maybe \constraint}} {\overline {\singleprm := {\maybe \exp}}} {\prim \constraint}$ which states that under environment $\env$ and context $\ctxt$, the assignment of arguments $\overline {\maybe \exp}$ to parameters $prms$ is valid under the constraints $\prim \constraint$ as long as the constraints $\prim \constraint$ do not contradict the constraints $\maybe \constraint$. Constraints $\constraint$ are assignments of types to type variables and optional constraints $\maybe \constraint$ are assignments of optional types to type variable. Note that constraints denoted by a letter have the same fixed vector of type variables. -- $\castParArg {\overline {\param := \maybe \exp}}$ bundles up the parameter with the expression's IR representation if possible: if $\maybe \exp \neq \bot$, it bundles up the parameter with $\castExpression \typ \exp$ if the direction of the parameter is correct (refer to _check\_direction_ function). Otherwise, if the parameter type isn't void and the direction is out or parameter is optional, it bundles up the parameter with bottom. +- $\castParArg { {\singleprm := \maybe \exp}}$ + + when $\exp \neq \bot$ it assigns the cast expression $\cast \typ \exp$ (which would be an IR expression $(\prim \exp, \prim \typ, \prim \dir$) to the parameter $\param$ if one of the following holds: + * $\dir = \less$ + * $\dir = \inDir$ and $\prim \typ \neq \externTyp \whatevs$ + * ($\dir = \out$ or $\dir = \inout$) and $\! \isLval (\prim \exp, \prim \typ, \prim \dir)$ and $\prim \dir \neq \inDir$ where $\isLval (\prim \exp, \prim \typ, \prim \dir)$ chckes whether its input is lvalue. + + When $\exp = \bot$ it assigns bottom to the parameter if $\typ \neq \voidTyp$ and either $\dir = \out$ or parameter is optional. - $\callOK \ctxt \kind$ checks if the function kind is valid in a context. The following cases valid: ``TODO: break up ctxt. here ctxt is exprctxt.`` + $\ctxt = \parserCtxt$ and $\kind = \parserKind$ + $\ctxt = \applyBlockCtxt$ and $\kind = \controlKind$ @@ -1863,23 +1869,23 @@ Constraints $\constraint$ are assignments of types to type variables and optiona ~ Begin InfRule -% \mprset {vskip=0.7ex} -% {\inferrule -% { -% \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ -% \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ -% |\overline {\typ_0}| = |\typVars|\\\\ -% % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ -% \matchParArg \prms \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ -% % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ -% \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ -% \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ -% \castParArg {\overline {\param = \pprim {\maybe \exp}}} = \overline {\param = \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ -% \callOK \ctxt \kind \\ -% \sat {\typ_\ret} = {\prim \typ}_{\ret} -% } -% { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } -% \quad (\funcCallE)} + % \mprset {vskip=0.7ex} + % {\inferrule + % { + % \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ + % \trans {\overline {\typ_0}} \emp = \overline {\typ_1}\\ + % |\overline {\typ_0}| = |\typVars|\\\\ + % % \overline {\typVar : \typ} = \zip \typVars {\overline {\prim \typ}}\\ + % \matchParArg \prms \args = \overline {\singleprm = \pprim {\maybe \exp}}\\ + % % \inferTypParArg {\typ_\ret} {\overline {\typVar : \typ_1}} {\overline {\param = \pprim {\maybe \exp}}} {\overline {\typVar :\typ_1}} {\overline {\typVar : \typ_2}}\\\\ + % \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \typ_2}}\\\\ + % \validatePars {\typs} {\addTypEnvv {\overline {\typVar : \typ_2}} } \kind \\ + % \castParArg {\overline {\prm := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + % \callOK \ctxt \kind \\ + % \sat {\typ_\ret} = {\prim \typ}_{\ret} + % } + % { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + % \quad (\funcCallE)} % \\ @@ -1893,12 +1899,13 @@ Constraints $\constraint$ are assignments of types to type variables and optiona \matchParArg \prms \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ % {\overline {\typVar : \maybe {\typ_1}}} = \constraint\\ \inferTypParArg {\overline {\typVar : \maybe {\typ_1}}} {\overline {\singleprm := \pprim {\maybe \exp}}} { \constraint}\\\\ + \types \constraint = \overline {\typ_2}\\ \validatePars {\typs} {\unionEnv \env { \constraint} } \kind \\ - \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + \castParArg {\overline {\singleprm := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \prim \dir)}}\\\\ \callOK \ctxt \kind \\ \sat {\typ_\ret} = {\prim \typ}_{\ret} } - { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + { \expenv {\funcCall \exp {\overline {\typ_0}} \args} {\funcCall {\prim \exp} {\overline { \typ_2}} {\overline{\maybe {(\ppprim \exp, \prim \typ, \prim \dir)}}} } {{\prim \typ}_{\ret}} \less } \quad (\funcCallE)} \\ @@ -1907,20 +1914,17 @@ Constraints $\constraint$ are assignments of types to type variables and optiona {\inferrule { \resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} \\\\ - \matchParArg \params \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ - \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm := \pprim {\maybe \exp}}} \constraint \\\\ - % \inferTypParArg {\overline {\typVar : \bot }} {\overline {\singleprm = \pprim {\maybe \exp}}} {\overline {\typVar : \prim \typ}}\\\\ - \validatePars {\params} {\unionEnv \env {\constraint} } \kind \\ - \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \pprim \typ, \dir)}}\\\\ - \callOK \ctxt \kind \\ - \sat {\typ_\ret} = {\prim \typ}_{\ret} - } - { \expenv {\funcCallNoTypArgs \exp \args} {\funcCall {\prim \exp} {\overline {\prim \typ}} {\overline{\maybe {(\ppprim \exp, \pprim \typ, \dir)}}} } {{\prim \typ}_{\ret}} \less } + {\prim \typ} = \dontcareTyp\\ + | \overline {\prim \typ} | = | \typVars |\\\\ + \expenv {\funcCall \exp {\overline {\prim \typ}} \args} {\funcCall {\prim \exp} {\overline {\ppprim \typ}} {\overline{\maybe {(\pprim \exp, \pprim \typ, \prim \dir)}}} } {{\prim \typ}_{\ret}} \less} + { \expenv {\funcCallNoTypArgs \exp \args} {\funcCall {\prim \exp} {\overline {\ppprim \typ}} {\overline{\maybe {(\pprim \exp, \pprim \typ, \prim \dir)}}} } {{\prim \typ}_{\ret}} \less } \quad (\funcCallNoTypeArgE)} ~ End InfRule -### Function Call Auxiliary Judgment { #sec-func-call } +### Dispatch Function Call Arguments Auxiliary Judgment { #sec-func-call-helper } + +```TODO: change C bottom to just C. instead, define don't care as bot. this way you can simplify optional translate and C bot``` This judgment checks the details of a function call: @@ -1939,7 +1943,7 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { {\inferrule % [\nameFuncNameE] { \lookupEnv {\name_0} = \overline {(\typ, \dir)}\\ - \exists (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2)\in \overline {(\typ, \dir)}} + (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2)\in \overline {(\typ, \dir)}} % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams {\pars 1 n} {\typ_\ret} } { \resolveFuncOver {\name_0} {\overline {\var_1 = \exp}} {\name_0} \typParams {\overline {\prm 1}} \kind {\typ_\ret} } \quad (\nameFuncNameE) @@ -1950,7 +1954,7 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { {\inferrule % [\nameFuncCountE] { \lookupEnv {\name_0} = \overline {(\typ, \dir)}\\ - \exists (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2) \in \overline {(\typ, \dir)}\\ + (\funcType \kind \typParams {\overline {\prm 1}} {\typ_\ret},\dir_2) \in \overline {(\typ, \dir)}\\ % \exists (\typ,\dir) \in (\overline {\typ, \dir}). \typ = \funcType \kind \typParams \params {\typ_\ret}\\ |\removeOptionalPars \params| = |\argexps|} { \resolveFuncOver {\name_0} {\argexps} {\name_0} \typParams {\overline {\prm 1}} \kind {\typ_\ret} } @@ -1974,7 +1978,7 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { { \expenv {\expMem {\name_0} {\exp_0}} {\exp_1} {\typ_1} {\dir_1}\\ \reduce {\typ_1} = \externTyp {\name_1}\\\\ \lookupEnv { \name_1} = (\typParams, \methods {\name_2} {\typ_2})\\\\ - \exists (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})} + (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})} } {\resolveFuncOver {\expMem {\name_0} {\exp_0}} \argkvs {\exp_1} {\overline {\prim \typParam}} \prms \kind {\typ_\ret}} \quad (\expMemExternNameE) @@ -1987,7 +1991,7 @@ It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind { { \expenv {\expMem {\name_0} {\exp_0}} {\exp_1} {\typ_1} {\dir_1}\\ \reduce {\typ_1} = \externTyp {\name_1}\\\\ \lookupEnv { \name_1} = (\typParams, \methods {\name_2} {\typ_2})\\\\ - \exists (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})}\\\\ + (\name_0, \funcType \kind {\overline {\prim \typParam}} {\prms} {\typ_\ret}) \in {(\methods {\name_2} {\typ_2})}\\\\ |\prms| = |\argexps| } {\resolveFuncOver {\expMem {\name_0} {\exp_0}} \argexps {\exp_1} {\overline {\prim \typParam}} \prms \kind {\typ_\ret} } @@ -2079,7 +2083,7 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. |\typs| = |\typParams| \\ \inferTypParArg {\concatList {\overline {\typVar : \maybe {\typ_1}}} {\overline {\wildcardParam : \bot}}} {\overline {\singleprm := \pprim {\maybe \exp}}} { \constraint}\\\\ \prim \env = \unionEnv \env \constraint \\ - \castParArg {\overline {\param := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}\\\\ + \castParArg {\overline {\singleprm := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \prim \dir)}}\\\\ \validateParArg {\overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}}\\ \sat \retTyp = \prim \retTyp} { \expenv {\instantiation {\spcTyp \name {\typs}} {\args}} {\instantiation {\spcTyp \name {\typs}} {\overline {\prim \arg}}} {\pprim \typ} \less} @@ -2099,7 +2103,7 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. \mprset {vskip=0.5ex} { \inferrule { \lookupEnv \name = \overline {(\typ, \dir)} \\ - \exists (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)}} + (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)}} { \resolveConstOver \name {\overline {\var = \exp}} \typParams \wildcardParams \prms \retTyp } \quad (blah) } @@ -2107,7 +2111,7 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. \mprset {vskip=0.5ex} { \inferrule { \lookupEnv \name = \overline {(\typ, \dir)} \\ - \exists (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)} \\ + (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)} \\ |\removeOptionalPars \params| = |\argexps|} { \resolveConstOver \name \argexps \typParams \wildcardParams \prms \retTyp } \quad (blah) diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index de34a7f32..4fe3cc28f 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -190,7 +190,7 @@ \newcommand{\implCast}[2]{\castenv {i} {#1} {#2}} %exp, args. exp', type pars, pars, kind, return type. %check if you need the dir to be returned as well. -\newcommand{\resolveFuncOver}[7]{\env, \ctxt \vdash {#1}, {#2} \twoheadrightarrow {#3}, {#4}, {#5}, {#6}, {#7}} +\newcommand{\resolveFuncOver}[7]{\env, \ctxt \vdash \mathit{dispatch}({#1}, {#2}, {#3}, \funcType {#6} {#4} {#5} {#7})} %typ par : typ arg. par = exp. . typ par : typ arg (infered). % this has an extra input in code (which is constraints (init to typ par : typ arg)) but it's never used so i dropped it. same for return type. \newcommand{\inferTypParArg}[3]{\env, \ctxt \vdash {#1}, {#2} \mapsto {#3}} @@ -198,14 +198,14 @@ \newcommand{\resolveConstOver}[6]{\env, \ctxt \vdash {#1}, {#2} \twoheadrightarrow {#3}, {#4}, {#5}, {#6}} %contexts: -\newcommand{\cte}{\mathfrak{constant}} -\newcommand{\applyBlockCtxt}{\mathfrak{applyBlock}} -\newcommand{\actionCtxt}{\mathfrak{action}} -\newcommand{\tableActionCtxt}{\mathfrak{tableAction}} -\newcommand{\funcCtxt}[1]{\mathfrak{function}\ {#1}} -\newcommand{\parserCtxt}{\mathfrak{parserState}} -\newcommand{\toplevel}{\mathfrak{topLevel}} -\newcommand{\declLocalCtxt}{\mathfrak{declLocal}} +\newcommand{\cte}{\mathsf{constant}} +\newcommand{\applyBlockCtxt}{\mathsf{applyBlock}} +\newcommand{\actionCtxt}{\mathsf{action}} +\newcommand{\tableActionCtxt}{\mathsf{tableAction}} +\newcommand{\funcCtxt}[1]{\mathsf{function}\ {#1}} +\newcommand{\parserCtxt}{\mathsf{parserState}} +\newcommand{\toplevel}{\mathsf{topLevel}} +\newcommand{\declLocalCtxt}{\mathsf{declLocal}} %operators: \newcommand{\mask}[2]{{#1}\ \&\&\&\ {#2}} @@ -323,6 +323,7 @@ \newcommand{\methods}[2]{\overline {{#1}:{#2}}} %function helpers +\newcommand{\types}[1]{\mathit{types\_of}({#1})} \newcommand{\mergeConst}[1]{\mathit{merge\_types}({#1})} \newcommand{\toVoid}[1]{\mathit{voidify}({#1})} \newcommand{\breakMaybes}[3]{\mathit{break\_option}({#1})=\left({#2},{#3}\right)} diff --git a/lib/checker.ml b/lib/checker.ml index 9a9b817af..9b7ea119e 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -964,7 +964,7 @@ and cast_to_same_type (env: CheckerEnv.t) (ctx: Typed.ExprContext.t) (exp1: Expr then exp1, add_cast env exp2 typ1 else failwith "cannot cast types so that they agree" -(* takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. *) +(* takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. NOTE: it already know the cast, if needed, is valid. *) and cast_expression (env: CheckerEnv.t) ctx (typ: Typed.Type.t) (exp: Expression.t) = let module E = Prog.Expression in let typ = reduce_type env typ in @@ -1553,6 +1553,47 @@ and validate_param env ctx (typ: Typed.Type.t) dir tags = if not (is_valid_param_type env ctx typ) then raise_s [%message "Type cannot be passed as a parameter" ~info:(tags:Info.t)]; + (** copied this ease of access and read for formalization doc. *) + (* and is_valid_param_type env (ctx: Typed.ParamContext.t) (typ: Typed.Type.t) = *) + (* let typ = reduce_to_underlying_type env typ in *) + (* match ctx with *) + (* | Constructor decl -> *) + (* begin match typ, decl with *) + (* | Package _, Package -> true *) + (* | Package _, _ -> false *) + (* | Parser _, Package *) + (* | Parser _, Parser -> true *) + (* | Parser _, _ -> false *) + (* | Control _, Package *) + (* | Control _, Control -> true *) + (* | Control _, _ -> false *) + (* | Extern _, Package *) + (* | Extern _, Parser *) + (* | Extern _, Control *) + (* | Extern _, Method -> true *) + (* | Extern _, _ -> false *) + (* | Function _, _ -> false *) + (* | Action _, _ -> false *) + (* | Table _, _ -> false *) + (* | Set _, _ -> false *) + (* | _ -> true *) + (* end *) + (* | Runtime decl -> *) + (* begin match typ, decl with *) + (* | Package _, _ -> false *) + (* | Parser _, _ -> false *) + (* | Control _, _ -> false *) + (* | Extern _, Parser *) + (* | Extern _, Control *) + (* | Extern _, Method -> true *) + (* | Extern _, _ -> false *) + (* | Table _, _ -> false *) + (* | Set _, _ -> false *) + (* | Action _, _ -> false *) + (* | Function _, _ -> false *) + (* | _ -> true *) + (* end *) + and type_param' ?(gen_wildcards=false) env (ctx: Typed.ParamContext.t) (param : Types.Parameter.t) : Typed.Parameter.t * string list = let typ, wildcards = translate_type' ~gen_wildcards env [] param.typ in let env = CheckerEnv.insert_type_vars wildcards env in From 4e142ea75fb5559a30c699b35ff0d84f6da4e700 Mon Sep 17 00:00:00 2001 From: pataei Date: Fri, 12 Aug 2022 13:08:34 -0400 Subject: [PATCH 24/30] drop comment --- docs/petr4spec/Petr4-spec.mdk | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index df649f62a..a33735fd0 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -2069,8 +2069,6 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. ## Anonymous Instantiation Rule { #sec-inst-e } -``TODO: complete this thu aug 11`` - - validate par arg checks if optional is some and it passes if expression is compile time known or if it is none and parameter is none. ~ Begin InfRule From 454158a206a9c63063f97ecbab5bac2f05f92241 Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 31 Aug 2022 17:21:25 -0400 Subject: [PATCH 25/30] adding syn --- docs/petr4spec/Petr4-spec.mdk | 342 ++++++++++++++++++++++++++-------- docs/petr4spec/ops.tex | 49 +++-- lib/types.mli | 2 +- 3 files changed, 292 insertions(+), 101 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index a33735fd0..72b1378c2 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -1,4 +1,4 @@ -Title : Petr4 Type System Formalization +Title : P4 Type System Formalization Title Footer : &date; Author : Petr4 Team Affiliation : Cornell University @@ -137,7 +137,7 @@ p4grammar { @if tex { p4grammar { replace: "~ Begin P4GrammarBlock&nl;\ - ````&nl;&source;&nl;````&nl;\ + &source;&nl;\ ~ End P4GrammarBlock"; breakable: true; margin-top: 6pt; @@ -149,6 +149,35 @@ p4grammar { } } +@if html { +p4syntax { + replace: "~ Begin P4SyntaxBlock&nl;\ + &source;&nl;\ + ~ End P4SyntaxBlock"; + border: solid; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #e6ffff; + border-width: 0.5pt; +} +} + +@if tex { +p4syntax { + replace: "~ Begin P4SyntaxBlock&nl;\ + ````&nl;&source;&nl;````&nl;\ + ~ End P4SyntaxBlock"; + breakable: true; + margin-top: 6pt; + margin-bottom: 6pt; + padding: 6pt; + background-color: #e6ffff; + border: solid; + border-width: 0.5pt; +} +} + @if html { infrule { replace: "~ Begin InfRuleBlock&nl;\ @@ -243,7 +272,7 @@ infrulehelper { ~ Begin Abstract -P4's type system is currently distributed between its language specification and its reference implementation p4c. Unfortunattely, this state of affairs results in ambiguity while reasoning through the behavior of a P4 program, evident from the many issues opened on P4's GitHub repo. +P4's type system is currently distributed between its language specification and its reference implementation p4c. Unfortunately, this state of affairs results in ambiguity while reasoning through the behavior of a P4 program, evident from the many issues opened on P4's GitHub repository. In this document, we provide a formalization of P4's type system to unify the expected behavior of P4 programs. The target audience of this document includes language designers and compiler experts that work (or starting to work) on P4 as well as developers and debuggers that work @@ -267,11 +296,11 @@ There are multiple problems with both: [p4spec]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html [p4cgit]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html -1. Figuring out how a program behaves and whether it type checks or not is extremely hard. In P4 spec, one has to jump from place to place to find whether each part of the program type checks or not since information regarding type checking a program is staggered all over the place and even worse in some cases it is missing. In p4c, one has to either write a sample program and compile it to see if it type checks or they have to go through all p4c's code to figure out the behavior of their program. For example, ``todo: add github issues. add number of loc of p4c.`` +1. Figuring out how a program behaves and whether it type checks or not is extremely hard. In P4 spec, one has to jump from place to place to find whether each part of the program type checks or not since information regarding type checking a program is staggered all over the place and even worse in some cases it is missing. In p4c, one has to either write a sample program and compile it to see if it type checks or they have to go through all P4C's code to figure out the behavior of their program. For example, ``todo: add GitHub issues. add number of loc of P4C.`` 2. Adding a new feature to P4 requires extending its type system and often times results in revising parts of the current type system as well. Doing so for both P4 spec and p4c is rather burdensome and error-prone due to the distribution of explanation in P4 spec and implementation in p4c. -3. Even more concerning, despite lots of effort by the P4 language committee, there are discrepnecies between P4 spec and p4c's implementation. For example, ``TODO: add github issues`` +3. Even more concerning, despite lots of effort by the P4 language committee, there are discrepancies between P4 spec and P4C's implementation. For example, ``TODO: add GitHub issues`` -In this document, we formalize P4's type system. Formalizing P4 benefits the communit in different ways +In this document, we formalize P4's type system. Formalizing P4 benefits the community in different ways 1. It makes working with and on P4 easier for both people who are just picking it up and those who have been working with/on it for some time. This is because clear formalization makes understanding a language and the behavior of programs written in it less cumbersome. 2. It provides a place for experts and users to refer to check the behavior of a program. It also provides a unified place for ensuring all references and implementations of P4 are consistent with each other. @@ -286,7 +315,7 @@ and defining a type or an object. Each declaration may contain multiple statemen expressions within it. Thus, in order to formalize P4's type system we need to: -- have consisten and clear [notation][#sec-notation] +- have consistent and clear [notation][#sec-notation] - formalize [P4's syntax][#sec-syntax] - formalize type related rules, including [type well-formedness][#sec-type-well-formed], [type equality][#sec-type-eq], [type unification][#sec-type-unify] - formalize [expressions typing][#sec-exp-typing] @@ -325,8 +354,8 @@ Metavariables are place holders for values of a type. For example, $\bool$ stand - $\overline x$ denotes a list of $x$. - For simplicity, we omit mapping a function/judgment on a list of elements. Instead, we just apply the function/judgment to a list. So every time you see a function applied to a list, read it as mapping the function over all the elements of the list. -- An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgements. -- The notation $\maybe \anyTyp$ denotes an optional type, that is, the type of $\anyTyp$ has been extended with bottom (maybe type in Haskell, or option type in Ocaml). So if $\anyTyp$ denotes an integer, $\maybe \anyTyp$ could either be an integer number or bottom. +- An underscore (that is, $\_$) is used when we do not need to use some specific information returned by some helper in judgments. +- The notation $\maybe \anyTyp$ denotes an optional type, that is, the type of $\anyTyp$ has been extended with bottom (maybe type in Haskell, or option type in OCaml). So if $\anyTyp$ denotes an integer, $\maybe \anyTyp$ could either be an integer number or bottom. The following describes the metavariables used in this document: @@ -340,7 +369,7 @@ The following describes the metavariables used in this document: | $\size$ | size of a data structure | | $\bitWidth \bit \width$ | fixed length integer | | $\intWidth \int \width$ | signed integer | -| $\name$ | strings represing any kinds of names | +| $\name$ | strings representing any kinds of names | | $\typ$ | types | | $\dir$ | directions | | $\typVar$ | type variables | @@ -361,6 +390,153 @@ function signature. judgment signature. environment signature. # Syntax { #sec-syntax } +data types used in programs: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\baseTyp$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | +| | $\vert$ | $\errTyp$ | $\qquad \text{errors}$ | +| | $\vert$ | $\integerTyp$ | $\qquad \text{infinite-precision integers}$ | +| | $\vert$ | $\intWidthTyp \exp$ | $\qquad \text{fixed-width signed integers}$ | +| | $\vert$ | $\bitWidthTyp \exp$ | $\qquad \text{fixed-width unsigned integers}$ | +| | $\vert$ | $\varBitTyp \exp$ | $\qquad \text{variable-width integers with a maximum width}$ | +| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | +| | $\vert$ | $\spcTyp \baseTyp \baseTyps$ | $\qquad \text{specialized type}$ | +| | $\vert$ | $\stackTyp \baseTyp \exp$ | $\qquad \text{stacks}$ | +| | $\vert$ | $\tupleTyps \baseTyps$ | $\qquad \text{tuples}$ | +| | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | +| | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | +| | $\vert$ | $\dontcareTyp$ | $\qquad \text{don't care}$ | +~ End P4Syntax + +types of programs: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\typ$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | +| | $\vert$ | $\errTyp$ | $\qquad \text{errors}$ | +| | $\vert$ | $\integerTyp$ | $\qquad \text{infinite-precision integers}$ | +| | $\vert$ | $\intWidthTyp \width$ | $\qquad \text{fixed-width signed integers}$ | +| | $\vert$ | $\bitWidthTyp \width$ | $\qquad \text{fixed-width unsigned integers}$ | +| | $\vert$ | $\varBitTyp \width$ | $\qquad \text{variable-width integers}$ | +| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | +| | $\vert$ | $\spcTyp \typ \typs$ | $\qquad \text{specialized type}$ | +| | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples}$ | +| | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | +| | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | +| | $\vert$ | $\dontcareTyp$ | $\qquad \text{don't care}$ | +| | $\vert$ | $\arrayTyp \typ \width$ | $\qquad \text{arrays}$ | +| | $\vert$ | $\listTyps \typs$ | $\qquad \text{lists}$ | +| | $\vert$ | $\recordTyps$ | $\qquad \text{records}$ | +| | $\vert$ | $\setTyp \typ$ | $\qquad \text{sets}$ | +| | $\vert$ | $\matchKindTyp$ | $\qquad \text{match kinds}$ | +| | $\vert$ | $-$ | $\qquad \text{reference}$ | +| | $\vert$ | $\headerTyps \field \typ$ | $\qquad \text{headers}$ | +| | $\vert$ | $\headerUnionTyps \field \typ $ | $\qquad \text{header unions}$ | +| | $\vert$ | $\structTyps \field \typ$ | $\qquad \text{structs}$ | +| | $\vert$ | $\enumTypDef$ | $\qquad \text{enums}$ | +| | $\vert$ | $\packageTyp \typParams \prms \wildcardParams$ | $\qquad \text{packages}$ | +| | $\vert$ | $\controlTyp \typParams \prms$ | $\qquad \text{controls}$ | +| | $\vert$ | $\parserTyp \typParams \prms$ | $\qquad \text{parsers}$ | +| | $\vert$ | $\externTyp \name$ | $\qquad \text{externs}$ | +| | $\vert$ | $\funcType \kind \typParams \params \typ$ | $\qquad \text{functions}$ | +| | $\vert$ | $\actionTyp {\overline {\prm 1}} {\overline {\prm 2}}$ | $\qquad \text{actions}$ | +| | $\vert$ | $\constructorTyp \typParams \prms \wildcardParams \typ$ | $\qquad \text{constructors}$ | +| | $\vert$ | $\tableTyp \name$ | $\qquad \text{tables}$ | +{ .booktable } +~ End P4Syntax + +directions: (check with .ml file) +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\dir$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | +| | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | +| | $\vert$ | $\less$ | $\qquad \text{copy-in-out}$ | +~ End P4Syntax + +parameters: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $-$ | $::=$ | $- $ | $\qquad \text{-}$ | +| | $\vert$ | $- $ | $\qquad \text{-}$ | +~ End P4Syntax + +expressions: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\exp$ | $::=$ | $\bool$ | $\qquad \text{booleans}$ | +| | $\vert$ | $\str$ | $\qquad \text{strings}$ | +| | $\vert$ | $\int$ | $\qquad \text{integers}$ | +| | $\vert$ | $n_w$ | $\qquad \text{fixed-width signed integers}$ | +| | $\vert$ | $b_w$ | $\qquad \text{fixed-width unsigned integers}$ | +| | $\vert$ | $\name$ | $\qquad \text{names}$ | +| | $\vert$ | $\arrayAccess {\exp_1} {\exp_2}$ | $\qquad \text{array accesses}$ | +| | $\vert$ | $\bitStringAccess {\exp_1} {\exp_2} {\exp_3}$ | $\qquad \text{bitstring slices}$ | +| | $\vert$ | $\list \exps$ | $\qquad \text{lists}$ | +| | $\vert$ | $\records \exp$ | $\qquad \text{records}$ | +| | $\vert$ | $- $ | $\qquad \text{unary operations}$ | +| | $\vert$ | $- $ | $\qquad \text{binary operations}$ | +| | $\vert$ | $\cast \typ \exp$ | $\qquad \text{casts}$ | +| | $\vert$ | $\typMem \typ \name$ | $\qquad \text{type members}$ | +| | $\vert$ | $\errMem \name$ | $\qquad \text{error members}$ | +| | $\vert$ | $\expMem \exp \name$ | $\qquad \text{expression members}$ | +| | $\vert$ | $\ternary {\exp_1} {\exp_2} {\exp_3}$ | $\qquad \text{conditionals}$ | +| | $\vert$ | $\funcCall \exp {\typs} \args$ | $\qquad \text{function calls}$ | +| | $\vert$ | $\instantiation {\spcTyp \name {\typs}} {\args}$ | $\qquad \text{anonymous instantiation}$ | +| | $\vert$ | $\mask {\exp_1} {\exp_2}$ | $\qquad \text{bit masks}$ | +| | $\vert$ | $\range {\exp_1} {\exp_2}$ | $\qquad \text{ranges}$ | +~ End P4Syntax + +statements: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\stmt$ | $::=$ | $- $ | $\qquad \text{method call}$ | +| | $\vert$ | $- $ | $\qquad \text{assignment}$ | +| | $\vert$ | $- $ | $\qquad \text{direct application}$ | +| | $\vert$ | $- $ | $\qquad \text{if then else}$ | +| | $\vert$ | $- $ | $\qquad \text{block statement}$ | +| | $\vert$ | $- $ | $\qquad \text{exit}$ | +| | $\vert$ | $- $ | $\qquad \text{empty}$ | +| | $\vert$ | $- $ | $\qquad \text{return}$ | +| | $\vert$ | $- $ | $\qquad \text{switch}$ | +| | $\vert$ | $- $ | $\qquad \text{declaration}$ | +~ End P4Syntax + +declarations: +~ Begin P4Syntax +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\dcl$ | $::=$ | $- $ | $\qquad \text{constants}$ | +| | $\vert$ | $- $ | $\qquad \text{instantiations}$ | +| | $\vert$ | $- $ | $\qquad \text{parsers}$ | +| | $\vert$ | $- $ | $\qquad \text{controls}$ | +| | $\vert$ | $- $ | $\qquad \text{functions}$ | +| | $\vert$ | $- $ | $\qquad \text{extern functions}$ | +| | $\vert$ | $- $ | $\qquad \text{variables}$ | +| | $\vert$ | $- $ | $\qquad \text{parser value sets}$ | +| | $\vert$ | $- $ | $\qquad \text{actions}$ | +| | $\vert$ | $- $ | $\qquad \text{tables}$ | +| | $\vert$ | $- $ | $\qquad \text{header types}$ | +| | $\vert$ | $- $ | $\qquad \text{header union types}$ | +| | $\vert$ | $- $ | $\qquad \text{struct types}$ | +| | $\vert$ | $- $ | $\qquad \text{error types}$ | +| | $\vert$ | $- $ | $\qquad \text{match kind types}$ | +| | $\vert$ | $- $ | $\qquad \text{enumerated types}$ | +| | $\vert$ | $- $ | $\qquad \text{serializable enumerated types}$ | +| | $\vert$ | $- $ | $\qquad \text{extern objects}$ | +| | $\vert$ | $- $ | $\qquad \text{type definitions}$ | +| | $\vert$ | $- $ | $\qquad \text{generative type definitions}$ | +| | $\vert$ | $- $ | $\qquad \text{control types}$ | +| | $\vert$ | $- $ | $\qquad \text{parser types}$ | +| | $\vert$ | $- $ | $\qquad \text{package types}$ | +~ End P4Syntax + + + # Type Related Judgments { #sec-types-typing } Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. @@ -379,11 +555,11 @@ All typing rules first saturate all types, that is, it eliminates all type references in type $\typ$ and replaces them with the type they refer to. Thus, the result of saturation contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. Then it checks the well-formedness of the saturated type. -For breviety, we don't include the saturation in rules. +For brevity, we don't include the saturation in rules. ### Base Types { #sec-base-t } -The following base types are well-formed unconditionally since there is not any room for an error while constructing a value of these types. For example, the $\boolTyp$ only has two constructors $\mathit{true}$ and $\mathit{false}$ which do not take any arguement so there is no room to construct a value incorrectly. +The following base types are well-formed unconditionally since there is not any room for an error while constructing a value of these types. For example, the $\boolTyp$ only has two constructors $\mathit{true}$ and $\mathit{false}$ which do not take any argument so there is no room to construct a value incorrectly. ~ Begin InfRule @@ -505,7 +681,7 @@ An enumeration type contains a number of constants of string type and its declar The rules below state that an enum type is well-formed if the underlying representation is well-formed, if it has one. -``**DISCREPENCY**`` +``**DISCREPANCY**`` Petr4 doesn't allow for an enum to have default values for constants, however, P4 spec does. Here's an [example][enum-ex]. [enum-ex]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-enum-types @@ -568,13 +744,13 @@ Note that headers, header unions, and struct also have a record type. ### New Type Type { #sec-newtype-t } -New type assings a name to a type. So the $\newTypeT$ checks if the assignee type $\typ$ is well-formed. +New type assigns a name to a type. So the $\newTypeT$ checks if the assignee type $\typ$ is well-formed. ~ Begin InfRule \inferrule { \typWellFormed \typ } - { \typWellFormed {\newTypeTyp \typ \name} } + { \typWellFormed {\newTypeTyp \typ \typVar} } \quad (\newTypeT) ~ End InfRule @@ -588,13 +764,13 @@ The rule $\specializedExternT$ states that the specialization of an extern type - Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. -- $\lookupEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. +- ```TODO: correct this explanation.```$\lookupExternEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. - $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. ~ Begin InfRule \inferrule - { \lookupEnv \name = ([\params], \_ ) \\ + { \lookupExternEnv \name = ([\params], \_ ) \\ % 1 \leq i \leq n. \typWellFormed {\typ_i} \\ \typWellFormed \typs\\ |\typs| = |\params|} @@ -613,11 +789,11 @@ The rule $\specializedExternT$ states that the specialization of an extern type ### Package Type { #sec-package-t } -A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. ```TODO: question for Ryan, what's the purpose of them?``` -The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are directionless and their types are well-formed. +A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. +The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are direction-less and their types are well-formed. - A parameter $\singleprm$ has direction $\dir$, type $\typ$, and name $\name$. -- $\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}$ extends the environment $\env$ with type variables $\typParams$. Note that the type inserted in the environement for type variables is a type name. +- $\extendTypEnv \typVar$ extends the type environment $\typEnv$ with type variable $\typParam$. Note that the type inserted in the environment for a type variable is a type name. - $\isDirectionless \dir$ checks that the direction $\dir$ is $\less$, that is, $\dir = \less$. ~ Begin InfRule @@ -625,7 +801,8 @@ The rule $\packageT$ states that a package type is well-formed under the environ \inferrule { \isDirectionless \dirs \\ % 1 \leq i \leq n. \dir_i = \less \\ - 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} + \typWellFormedWithEnv {\extendTypEnv \typVars} \typs } + % 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} { \typWellFormed {\packageTyp {\typParams} {\prms} {\wildcardParams}} } \quad (\packageT) @@ -637,7 +814,7 @@ A control type is similar to a type signature of a function in that it defines t Parsers also have a control type. -``**DISCREPENCY** +``**DISCREPANCY** P4 spec states that "The types parser, control, and package cannot be used as types of arguments for methods, parsers, controls, tables, actions. They can be used as types for the arguments passed to constructors." We could check this in the well-formedness of types or even when we're declaring a method, parser, control, table, or action, instead of when we're defining their type (make sure we're not checking it then).`` ([p4 spec ref][parser-type]) [parser-type]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-parser-control-types @@ -645,7 +822,7 @@ P4 spec states that "The types parser, control, and package cannot be used as ty ~ Begin InfRule \inferrule - {\typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs}} + {\typWellFormedWithEnv {\extendTypEnv \typParams} {\typs}} { \typWellFormed {\controlTyp {\typParams} {\prms} } } \quad (\controlT) @@ -659,16 +836,18 @@ P4 spec states that "The types parser, control, and package cannot be used as ty ### Extern Type { #sec-extern-t } The rule $\externT$ states that an extern type is well-formed if it has no type parameter in the environment. -lookup extern in env returns an externMethods type which includes a list of strings as +$\lookupEnv \name$ where $\name$ is an extern returns an externMethods type which includes a list of strings as type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. +``TODO: revise the definition of look up extern after breaking up env.`` + ```**DISCUSSION** This seems way too simple and loose.``` ~ Begin InfRule \inferrule - { \lookupEnv \name = (\emp, \_ )} + { \lookupExternEnv \name = (\emp, \_ )} { \typWellFormed {\externTyp \name} } \quad (\externT) @@ -682,7 +861,7 @@ A function type describes the return type of the function, its type parameters, \inferrule { \typWellFormed \typ \\ - \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} \typs} + \typWellFormedWithEnv {\extendTypEnv \typVars} \typs} % 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } % (x1,...,xn) {...} { \typWellFormed {\funcTyp \typ {\typParams} {\prms}} } @@ -692,7 +871,7 @@ A function type describes the return type of the function, its type parameters, ### Action Type { #sec-action-t } -An action type defines data and control parameters and it is well-formed if the types of all parameters are well-formed and the control parameters are directionless. +An action type defines data and control parameters and it is well-formed if the types of all parameters are well-formed and the control parameters are direction-less. ~ Begin InfRule @@ -715,7 +894,7 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re \inferrule { \typWellFormed {\typ_\ret} \\ % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ - \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typs} \\ + \typWellFormedWithEnv {\extendTypEnv \typVars} {\typs} \\ \isDirectionless {\dirs}} { \typWellFormed {\constructorTyp \typParams \prms \wildcardParams {\typ_\ret}}} \quad (\constructorT) @@ -726,12 +905,12 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re A table type is well-formed under an environment if it exists in the environment. -- Looking up type variables returns the type assigned to it. +- $\lookupTypEnv \name $ Looks up $\name$ from the type environment $\typEnv$ and returns the type assigned to it. ~ Begin InfRule \inferrule - { \lookupEnv \name = \typ} + { \lookupTypEnv \name = \whatevs} { \typWellFormed {\tableTyp \name} } \quad (\tableT) @@ -744,7 +923,7 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the ~ Begin InfRule \inferrule - { \lookupEnv \name = \typ} + { \lookupTypEnv \name = \whatevs} { \typWellFormed {\typNameTyp \name} } \quad (\typeNameT) @@ -754,13 +933,13 @@ The rule $\typeNameT$ states that the type name $\name$ is well-formed under the ```**TODO**: refer to type_equality and solve_types functions in impl. For type equality of p4 spec refer to to section 8, under each operation there's a one liner that talks about when two types are equal for the type it's covering. ``` - The [type equality judgment][#sec-type-eq] checks the equality of two types. It has -the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equaivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. +the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which states that the types $\typ_1$ and $\typ_2$ are equivalent under the environment $\env$ with equivalent variable pairs $\overline {(\var, \prim \var)}$. Note that Alpha equivalent types are equivalent. ## Type Unification { #sec-type-unify } - type unification for type produces by type checking, i.e., typed.type.t -- both types are reduced first. for breviety we omit the reduction from rules. so type 1 and type 2 in rules are already reduced. +- both types are reduced first. for brevity we omit the reduction from rules. so type 1 and type 2 in rules are already reduced. ~ Begin InfRule @@ -987,12 +1166,12 @@ between the two. ``**Restriction**`` Petr4 doesn't have the product operation where multiple sets can be combined using -cartesian product and the type of a product of sets is a set of tuples. (refer to +Cartesian product and the type of a product of sets is a set of tuples. (refer to section 8.12.5. of P4 spec (**DISCUSS**)) ``**NOTE**`` I couldn't find the followings in section 8 of p4 spec: -array access, bist string access, type member, anonymous instant (this is probably method invocation or sth). +array access, bits string access, type member, anonymous instant (this is probably method invocation or something). ## Boolean, String, and Integer Constructor Rules { #sec-base-const-e } @@ -1081,7 +1260,7 @@ The rule $\bitStringAccessE$ states that accessing $\exp_2$ to $\exp_1$ from the - $\widthInt \typ$ checks if the type $\typ$ is a fixed-length integer, that is, if it is either $\bitWidthTyp \width$ or $\intWidthTyp \width$ and returns its width. -- $\sat \typ$ satuarates a type. +- $\sat \typ$ saturates a type. Remember that saturating a type eliminates all type references in type $\typ$ and replaces them with the type they refer to. Thus, the result of saturation contains no type synonym (_TypeName_ in Petr4) constructors that are used to give a name to a new type. @@ -1116,7 +1295,7 @@ the list $\list {\exps}$ translates to $\list {\overline {\prim \exp}}$ in the IR and has the tuple type $\listTyps \typ$ with direction $\less$ if its expressions translate to $\overline {\prim \exp}$ with types $\typs$ and directions $\dirs$ under the -same enviroment and context. +same environment and context. ~ Begin InfRule @@ -1160,7 +1339,7 @@ Additionally, they restrict the type of the $\exp$. - $\isInt \typ$ checks if the type $\typ$ is either $\bitWidthTyp \width$, $\intWidthTyp \width$, or $\integerTyp$. -``**Discrepency**`` +``**Discrepancy**`` P4 spec states that all expressions of type int MUST be compile-time known values but Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) @@ -1187,7 +1366,7 @@ Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or bin ~ End InfRule -``**DISCREPENCY**`` +``**DISCREPANCY**`` - P4 spec defines bitwise complement only for bit but Petr4 also allows it for int. (ref: type_unary_op bitnot impl. section 8.5 spec. bitwisecomplement rule.) @@ -1215,7 +1394,7 @@ casting behavior and it is defined in more details in [cast auxiliary judgment][ * $\implicitCast \integerTyp {\intWidthTyp \width} = \intWidthTyp \width$ - $\cast \typ \exp$ synthesizes a cast expression if the type of the expression $\exp$ is different from the type $\typ$. - $\reduceEnums \typ$ removes all the enums recursively from a type after reducing it. -- $\inOrLess {\dir_1} {\dir_2}$ retunrs the $\inDir$ direction if both directions $\dir_1$ and $\dir_2$ are $\inDir$, otherwise, it returns the $\less$ direction. +- $\inOrLess {\dir_1} {\dir_2}$ returns the $\inDir$ direction if both directions $\dir_1$ and $\dir_2$ are $\inDir$, otherwise, it returns the $\less$ direction. - $\typHasEq \typ$ checks if equality of two expressions from the type $\typ$ has been defined. Note that it first reduces the type $\typ$. - $\concatCond {\typ_1} {\typ_2}$ is a helper function that determines the type of a concatenation expression based on the types of its two operands: + if $\typ_1 = \bitWidthTyp {\width_1}, \typ_2 = \bitWidthTyp {\width_2}$, then @@ -1364,7 +1543,7 @@ compile time we still consider it known at compile time. ~ End InfRule -``**DISCREPENCY**`` +``**DISCREPANCY**`` - P4 spec states that all expressions of type int MUST be compile-time known values but Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or binaryops rules.) @@ -1385,7 +1564,7 @@ translated type of casting type $\typ$ (that is, $\prim \typ$) is valid. - $\explicitCastOK {\typ_1} {\typ_2}$ is an auxiliary judgment for valid explicit cast of types. The [casting auxiliary judgment][#sec-cast-helper] defines rules for implicitly -and/or explicitly casting one type to another. Sepcifically, the judgment +and/or explicitly casting one type to another. Specifically, the judgment $\castenv \ {\typ_1} {\typ_2}$ states that under environment $\env$, the type $\typ_1$ can be casted to type $\typ_2$ either explicitly or implicitly. However, if the arrow is subscripted with $i$ or $e$ it states that the cast is only @@ -1414,14 +1593,14 @@ in the helper judgment. Fix this later. ### Cast Auxiliary Judgment { #sec-cast-helper } This auxiliary judgment states if casting of a type to another, either explicitly or implicitly or both, is valid. -The arrow subscription with $e$ or $i$ indicates if a rule only applies for explicit or implicit cast only, respecctively. Otherwise, the arrow does not have a subscription, +The arrow subscription with $e$ or $i$ indicates if a rule only applies for explicit or implicit cast only, respectively. Otherwise, the arrow does not have a subscription, meaning that it applies for both explicit and implicit casts. -The cast first saturates both types and then checks if the cast is valid. For simplicity, we omited type saturations from the rules. +The cast first saturates both types and then checks if the cast is valid. For simplicity, we omitted type saturations from the rules. ``**NOTE**`` P4 spec specifies casts up to Sets rule. The rest might be stated throughout the spec but I haven't found them yet. -``**Discrepency**`` +``**Discrepancy**`` P4 spec states during the cast between int and bit or int the compiler would complain about overflow (or conversion of negative value for bit) but Petr4's type system doesn't check this. (ref: I'm not sure if any other part of petr4 takes care of this. section 8.9.1 spec. cast_ok impl. explicit cast judgment.) @@ -1684,7 +1863,7 @@ It has the form $\fieldAccessEnv \ctxt \name \typ {\prim \typ}$ which states that under environment $\env$ and context $\ctxt$, the member $\name$ has the type $\prim \typ$ in an expression of type $\typ$. Simply stated, it looks up the type of the member from the expression passed from the $\expMemE$ rule. -Note that the expression has to be of a one of the types: record, extern, speciliazed, or arry. +Note that the expression has to be of a one of the types: record, extern, specialized, or array. ~ Begin InfRule @@ -1816,7 +1995,7 @@ condition can be evaluated at compilation time. However, this is allowed by P4 s Expressions $\funcCall \exp {\typs} \args$ and $\funcCallNoTypArgs \exp \args$ both indicate a function call where -- $\exp$ is either a name or an expression member that is bein called +- $\exp$ is either a name or an expression member that is being called - $\args$ is the arguments passed to the function and they could be matched with parameters either based on name or position - $\typs$ is the type arguments passed to the function. @@ -1827,7 +2006,7 @@ A function call is well-typed if the called expression is an accepted function c 2. it checks if the type of the expression is either a function, an action, an extern, or a specialized type 3. it checks if the parameters and arguments match either based on their position or name. - And has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. + And has the judgment form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret}$ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameters $\prms$, kind $\kind$, and the return type $\typ_\ret$. - $\transMaybe \typ$ translates the surface type $\typ$ to underlying types and if the surface type is $\dontcareTyp$ it assigns $\bot$ to it. ``TODO: rewrite after adding syntax.`` - $\matchParArg \prms \args$ matches parameters $\params$ to arguments $\args$. A parameter is used when defining a function/structure. It has a type and a variable name. Additionally, it can have a direction and an optional value. On the other hand, an argument is what is actually passed to the function/structure when it is called and it can either be an expression, a key-value, or don't care. So the role of this helper function is to match the parameters to the passed arguments. If all arguments are key-values it simply matches the arguments and parameters based on their names. If the arguments are expressions or don't care, it matches them based on their positions. Thus, it returns a list of pairs of parameter names and optional expressions. - $\types \constraint$ returns the types assigned to the vector of type variables in the constraint $\constraint$. @@ -1849,7 +2028,7 @@ Constraints $\constraint$ are assignments of types to type variables and optiona + when $\exp \neq \bot$ it assigns the cast expression $\cast \typ \exp$ (which would be an IR expression $(\prim \exp, \prim \typ, \prim \dir$) to the parameter $\param$ if one of the following holds: * $\dir = \less$ * $\dir = \inDir$ and $\prim \typ \neq \externTyp \whatevs$ - * ($\dir = \out$ or $\dir = \inout$) and $\! \isLval (\prim \exp, \prim \typ, \prim \dir)$ and $\prim \dir \neq \inDir$ where $\isLval (\prim \exp, \prim \typ, \prim \dir)$ chckes whether its input is lvalue. + * ($\dir = \out$ or $\dir = \inout$) and $\! \isLval (\prim \exp, \prim \typ, \prim \dir)$ and $\prim \dir \neq \inDir$ where $\isLval (\prim \exp, \prim \typ, \prim \dir)$ checks whether its input is lvalue. + When $\exp = \bot$ it assigns bottom to the parameter if $\typ \neq \voidTyp$ and either $\dir = \out$ or parameter is optional. - $\callOK \ctxt \kind$ checks if the function kind is valid in a context. The following cases valid: ``TODO: break up ctxt. here ctxt is exprctxt.`` + $\ctxt = \parserCtxt$ and $\kind = \parserKind$ @@ -1932,7 +2111,7 @@ This judgment checks the details of a function call: 2) it checks if the type of the expression is either a function, an action, an extern, or a specialized type 3) the parameters and arguments either match based on their position or name. -It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} $ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameteres $\prms$, kind $\kind$, and the return type $\typ_\ret$. +It has the form $\resolveFuncOver \exp \args {\prim \exp} \typVars \prms \kind {\typ_\ret} $ which states that the expression $\exp$ called as a function with arguments $\args$ under environment $\env$ and context $\ctxt$, translates to the expression $\prim \exp$ in the IR and has the type parameters $\typVars$, parameters $\prms$, kind $\kind$, and the return type $\typ_\ret$. - Remember that parameters could be optional or have some default expression set as their expression. $\removeOptionalPars \params$ removes those parameters. - $\concatList {\overline \anyTyp} {\overline {\prim \anyTyp}}$ denotes concatenating two lists. @@ -2023,7 +2202,7 @@ As a reminder, constraints $\constraint$ are assignment of type parameters to ty The rule $\inferTypeArgAE$ states that under environment $\env$ and context $\ctxt$, the types of type parameters in the constraints $\maybe \constraint$ are inferred and returned in constraints $\prim \constraint$ given the assignment of parameters $\prms$ to optional expressions $\overline {\maybe \exp}$ -if the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any incosistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. +if the result of the unification of the type of arguments and their parameter types (which is the assignment of type parameters to types) does not include any inconsistency. For example, one does not state that type parameter $\typVar$ is $\integerTyp$ while the other states that it is $\tupleTyps \integerTyp$. - $\breakMaybes {\overline {\maybe \anyTyp}} {\overline {\prim \anyTyp}} {\overline {\pprim {\maybe \anyTyp}}}$ breaks down a list of optional things (reminder: $\anyTyp$ is a metavariable of any type you want) into two lists: one that only contains values other than $\bot$ (that is, $\overline {\prim \anyTyp}$) and another that only contains the ones that are $\bot$ (that is, $\overline {\pprim {\maybe \anyTyp}}$). So in the rule $\inferTypeArgAE$, the $\maybe \optConstraint$ is the list of type parameters that do not have a type assigned to them. @@ -2074,17 +2253,17 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. ~ Begin InfRule \inferrule - % { (\prim {\arg_1}, \ldots, \prim {\arg_n}, \prim \typ) = typeConstInvoc } { \transMaybe \typs = \overline {\prim {\maybe \typ}} \\ - \resolveConstOver \name \args \typParams \wildcardParams \prms \retTyp \\ + |\typs| = |\typParams| \\\\ + \resolveConstOver \name \args \typParams \wildcardParams \prms \retTyp \\\\ \matchParArg \prms \args = \overline {\singleprm := \pprim {\maybe \exp}}\\ - |\typs| = |\typParams| \\ - \inferTypParArg {\concatList {\overline {\typVar : \maybe {\typ_1}}} {\overline {\wildcardParam : \bot}}} {\overline {\singleprm := \pprim {\maybe \exp}}} { \constraint}\\\\ - \prim \env = \unionEnv \env \constraint \\ + \constraint = \concatList {\overline {\typVar : \maybe {\typ_1}}} {\overline {\wildcardParam : \bot}}\\ + \inferTypParArg {\constraint} {\overline {\singleprm := \pprim {\maybe \exp}}} {\prim \constraint}\\\\ + \prim \env = \unionEnv \env {\prim \constraint} \\ \castParArg {\overline {\singleprm := \pprim {\maybe \exp}}} = \overline {\param := \maybe {(\ppprim \exp, \prim \typ, \prim \dir)}}\\\\ \validateParArg {\overline {\param := \maybe {(\ppprim \exp, \prim \typ, \dir)}}}\\ \sat \retTyp = \prim \retTyp} - { \expenv {\instantiation {\spcTyp \name {\typs}} {\args}} {\instantiation {\spcTyp \name {\typs}} {\overline {\prim \arg}}} {\pprim \typ} \less} + { \expenv {\instantiation {\spcTyp \name {\typs}} {\args}} {\instantiation {\spcTyp \name {\typs}} {\overline {\prim \arg}}} {\prim \retTyp} \less} \quad (\instE\rSep\rn{1}) % typename of type_nameless_instantiation @@ -2170,7 +2349,7 @@ p4 spec only states that the type can be bit or int but petr4 also allows ~ End InfRule # Statement's Typing Rules { #sec-stmt-typing } -this judgment type checks a statment written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. +this judgment type checks a statement written in surface syntax, generates the IR statement from it and if applicable updates the env and ctxt. is_lvalue checks if an IR expression is lvalue. cast_expr takes a type and surface syntax expression. after generating the IR expression by type_expression, it checks if the given type and type of IR expression are equal it just returns the IR exp o.w. it casts (if possible) the IR expression to the given type. if void type returns a void type if a (or two) type is (are) void and otherwise returns a unit type. @@ -2272,7 +2451,7 @@ get enum typ takes a type and checks if it's an enum. if so it returns the enums # Declaration's Typing Rules { #sec-decl-typing } is allowed type for variable checks if a type is allowed for declaring a variable. it includes all types after saturation except for string, integer, list, set, void, specialized type, package, control, parser, extern, function, action, constructor, and table. -check parameter shadowing takes two lists of paramets and checks if there is any duplicate in them. +check parameter shadowing takes two lists of parameters and checks if there is any duplicate in them. ~ Begin InfRule @@ -2451,8 +2630,8 @@ check parameter shadowing takes two lists of paramets and checks if there is any ~ Bibliography { caption:"00" } ~~Bibitem {#harper-types-PL} -Rober Harper. -Types and Prgarmming Languages. +Robert Harper. +Types and Programming Languages. ~~ ~~Bibitem {#wiki-type-sys} @@ -2461,22 +2640,22 @@ Type System. ~~ ~ -# Appendix: Programming Languages Terminology { #sec-terminology } +# Appendix: Programming Languages Terminology { #sec-terminology; @h1:"A" } It is important that the reader is familiar with the basic programming languages terminology. And more importantly, it is crucial for them to understand the reason for having a type system and what its role is. To this end, we introduce the main programming languages terminology used in this document. **First, what is a type?** You can simply think of types as a set of language elements that share some features. For example, the type natural number is the set of numbers that is either zero or an increment of zero for multiple repetitions. -Grouping language elements into a set (called type) abstracts out some unncessary details when reasoning about programs. -That is why Harper states: "The central organizing principle of language design is the identitfication of language features with types."[@harper-types-PL] +Grouping language elements into a set (called type) abstracts out some unnecessary details when reasoning about programs. +That is why Harper states: "The central organizing principle of language design is the identification of language features with types."[@harper-types-PL] ``TODO: add an example here of what a type looks like.`` **Second, what is a type system?** A _type system_ is a collection of rules that assign a property called type to the various language constructs, such as variables, functions, expressions, etc.[@wiki-type-sys] Thus, a type system can be used as a simple reasoning tool for programs of a language. A type system formally defines many aspects of a programming language. -Most importantly, it states which programs are allowed in the langauge, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain group of errors in well-typed programs. +Most importantly, it states which programs are allowed in the language, also known as a _well-typed_ program and if possible it assigns a type to such a program. Alternatively, you can think of a type system as a system that ensures the absence of certain group of errors in well-typed programs. **Third, what is surface syntax and intermediate representation (IR)?** The _surface syntax_ is the syntax used to write the source program by the developer @@ -2497,17 +2676,17 @@ and providing its various typing rules at each step (Section [#sec-guide]). - ``say and show name can also be on the side of the rule.`` - ``state your type system changes based on your need`` - ``have explanation on inductive relation, grammar, and judgment`` -- ``what we're basically doing is writing function/relation. it's a mathematical format for historical reasons we werite it this way.`` +- ``what we're basically doing is writing function/relation. it's a mathematical format for historical reasons we write it this way.`` - ``do not do build up`` -- ``have type checking with psudolang and show boilerplate and see how ugly. then massage it into inf rules and appeal to people's conciseness`` +- ``have type checking with pseudo-language and show boilerplate and see how ugly. then massage it into inference rules and appeal to people's conciseness`` - ``sigma v to t is total but the env itself is partial`` - ``idea on some organization:`` - + grammars are inductively defined. a complier/rewritter can be inductively defined. - + these are a bunch of relation/function. eg: exp to type. then add env. wellformedness is also a function but it has a different judgment. - + the toatligy of it. the set of wel-typed terms is everything you can build with these rules. you can have a set. - + start at the bottom to show something type checkes. + + grammars are inductively defined. a complier/rewriter can be inductively defined. + + these are a bunch of relation/function. eg: exp to type. then add env. well-formedness is also a function but it has a different judgment. + + the totality of it. the set of well-typed terms is everything you can build with these rules. you can have a set. + + start at the bottom to show something type checks. -A type system is made up of typing _rules_. A typing rule has a specific _judgment form_ (which is the format it is written in and guides the reader on how to read all the typing rules using the judgement). +A type system is made up of typing _rules_. A typing rule has a specific _judgment form_ (which is the format it is written in and guides the reader on how to read all the typing rules using the judgment). A typing rule, in essence, is an _inference rule_. An inference rule contains zero or more _premises_ above the line and one _conclusion_ below the line @@ -2522,7 +2701,7 @@ $C$ is concluded if premises $A$ and $B$ hold. ~ End InfRule A rule without any premises is called an _axiom_ and it states that -the conclusion holds uncoditionally. +the conclusion holds unconditionally. Consider the simple toy expression language below that only consists of integers for now. Note that $i$ is a _metavariable_ that represents any possible integer values. @@ -2543,7 +2722,7 @@ state what its type is. {i} ~ End InfRule -We can have a more detailed type system for our langauge. +We can have a more detailed type system for our language. The second type system has the judgment form $e:t$ which states that the expression $e$ is well-typed and it has the type $t$. Note that $t$ is a metavariable for all possible types of expressions. The rule $\rn{Integer2}\rE$ states that the @@ -2579,7 +2758,7 @@ The judgment form of our first type systems changes to $\Sigma \vdash e$ which s The rule $\rn{Integer1}\rE$ states that under environment $\Sigma$, the expression $i$ is well-typed. The typing system is also extended by a rule for variable reference. The rule $\rn{Variable1}\rE$ states that under environment $\Sigma$, the expression $v$ is -well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its asignee expression. +well-typed if it exists in the environment. Note that $\Sigma(v)$ looks up variable $v$ from the environment $\Sigma$ and returns the expression assigned to it but since the rule does not need to do anything with that expression we use \_ to denote that the variable $v$ exists in the environment $\Sigma$ but we don't care about its assignee expression. Note that in rule $\rn{Integer1}\rE$ we do not need to check the type of $i$ since $i$ only stands for integers and can only be constructed by integer values. ~ Begin InfRule @@ -2737,7 +2916,7 @@ $e_1 == e_2$ has the $\mathsf{bool}$ type if expressions $e_1$ and $e_2$ both ha An inference rule is not only used for specifying types of programs. In fact, inference rules are used to write translation of programs from one representation to another, -program syntesis, type inference, program semantics, etc. +program synthesis, type inference, program semantics, etc. For example, the rules below rewrite expressions in our toy language (which uses infix ordering of operators) to one that uses prefix ordering of operators and they have the judgment form $\Sigma \vdash e \rightarrow \prim e$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to expression $\prim e$ written in the prefix ordering. @@ -2769,8 +2948,8 @@ For example, the $\rn{Addition3}\rE$ rule states that the expression $e_1 + e_2$ {\Sigma \vdash e_1 == e_2 \rightarrow \ == \prim {e_1} \ \prim {e_2}} ~ End InfRule -``phrase the following paragraph and its point differently: the main point is that inference rules define inductively defined relation. these relations can be simple or complicated. eg, so far we have had simple ones but below we have more complicated ones. also use wiggly arrow and use colon for type, that is, i wiggly arrow i colon int`` -An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewritting rules shown above and they have the judgment form +``phrase the following paragraph and its point differently: the main point is that inference rules define inductively defined relation. these relations can be simple or complicated. E.g., so far we have had simple ones but below we have more complicated ones. also use wiggly arrow and use colon for type, that is, i wiggly arrow i colon int`` +An inference rule can conduct multiple tasks at the same time. In other words, an inference rule can be a combination of two inference rules. For example, the typing rules below combine the typing and rewriting rules shown above and they have the judgment form $\Sigma \vdash e \rightarrow \prim e, t$ which states that under the environment $\Sigma$, the expression $e$ written in the infix ordering translates to the expression $\prim e$ written in the prefix ordering and has the type $t$. As an example , the $\rn{Variable4}\rE$ rule reads as under the environment $\Sigma$, the expression $v$ translates to itself and has the type $t$ if the variable $v$ exists in environment $\Sigma$ and expression $e$ is assigned to it which has the type $t$. @@ -2808,12 +2987,12 @@ Figure [#fig-arch] depicts part of Petr4's architecture that contains the type s After lexing and parsing a P4 program we get a program in our surface syntax. This program is then passed through the _elaborator_ where type variables are introduced instead of underscore and new type variable names are generated for variables with the -same name but in different scopes. This document does not discuss the innerworkings of +same name but in different scopes. This document does not discuss the inner-workings of `elaborate`. Then, the program is passed through the type system (encoded in `checker`). -This document discusses the innerworking of the type system extensively. Finally, the +This document discusses the inner-working of the type system extensively. Finally, the program is evaluated. -~ Figure { #fig-arch; caption: "Part of Petr4's achitecture." } +~ Figure { #fig-arch; caption: "Part of Petr4's architecture." } ![arch] ~ [arch]: figs/petr4/arch.png { width: 100%; page-align: forcehere } @@ -2844,3 +3023,4 @@ For simplicity, we have removed the information that is needed to report when an happens. Such information is passed around in the surface syntax as a field (called `tags`) of record for all data types. + diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 4fe3cc28f..f1901ed34 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -140,9 +140,12 @@ \newcommand{\ppprim}[1]{{#1}^{\prime\prime\prime}} \newcommand{\so}[2]{{#1} \Rightarrow {#2}} \newcommand{\lookupEnv}[1]{\env({#1})} +\newcommand{\lookupExternEnv}[1]{\externEnv({#1})} +\newcommand{\lookupTypEnv}[1]{\typEnv({#1})} \newcommand{\emp}{[\ ]} -\newcommand{\insertToEnv}[2]{\env, [{#1} : {#2} ]} -\newcommand{\insertToEnvv}[1]{\env, [{#1}]} +\newcommand{\insertToEnv}[2]{\env[{#1} : {#2} ]} +\newcommand{\insertToEnvv}[1]{\env[{#1}]} +\newcommand{\extendTypEnv}[1]{\typEnv[{#1} \ \mathsf{var}]} \newcommand{\suchThat}[2]{{#1}\ . \ {#2}} \newcommand{\tr}{\mathsf{true}} \newcommand{\fl}{\mathsf{false}} @@ -168,16 +171,16 @@ %typing judgments: \newcommand{\envOne}[2]{\Delta, T, \Gamma \vdash {#1} : {#2}} -\newcommand{\expenv}[4]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3}, {#4}} -\newcommand{\expenvv}[5]{\env_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} -\newcommand{\expenvvv}[3]{{#1}, \ctxt \vdash {#2} \leadsto {#3}} -\newcommand{\expenvWithCtxt}[5]{\env, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} +\newcommand{\expenv}[4]{\constEnv, \varEnv, \typEnv, \ctxt \vdash {#1} \leadsto {#2}, {#3}, {#4}} +\newcommand{\expenvv}[5]{\constEnv_{#5}, \varEnv_{#5}, \typEnv_{#5}, \ctxt_{#5} \vdash {#1} \leadsto {#2}, {#3}, {#4}} +\newcommand{\expenvvv}[3]{{#1}, \ctxt \vdash {#2} \leadsto {#3}} %%TODO: check where you've used this and correct the envs +\newcommand{\expenvWithCtxt}[5]{\constEnv, \varEnv, \typEnv, {#1} \vdash {#2} \leadsto {#3}, {#4}, {#5}} \newcommand{\coerceBinArgsEnv}[3]{\env, \ctxt \vdash {#1} \twoheadrightarrow ({#2}), ({#3})} \newcommand{\binOpEnv}[7]{\env \vdash {#1}, ({#4}, {#5}), ({#6}, {#7}) : {#2}, {#3}} -\newcommand{\typWellFormed}[1]{\env \vdash {#1}} -\newcommand{\typNotWellFormed}[1]{\env \nvdash {#1}} -\newcommand{\typWellFormedWithEnv}[2]{{#1} \vdash {#2}} -\newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} +\newcommand{\typWellFormed}[1]{\typEnv, \externEnv \vdash {#1}} +\newcommand{\typNotWellFormed}[1]{\typEnv, \externEnv \nvdash {#1}} +\newcommand{\typWellFormedWithEnv}[2]{{#1}, \externEnv \vdash {#2}} +\newcommand{\typEqEnv}[3]{ {#2} ==_{\env,{#1}} {#3}} %%todo: fix env %context. type of expression. type of returned name.exp \newcommand{\fieldAccessEnv}[4]{\env, {#1} \vdash {#2}, {#3} : {#4}} \newcommand{\stmtenv}[3]{\env, \ctxt \vdash {#1} \leadsto {#2}, {#3} \dashv \env} @@ -195,7 +198,7 @@ % this has an extra input in code (which is constraints (init to typ par : typ arg)) but it's never used so i dropped it. same for return type. \newcommand{\inferTypParArg}[3]{\env, \ctxt \vdash {#1}, {#2} \mapsto {#3}} \newcommand{\unify}[6]{{#1}, {#2}, {#3} \vDash {#4} \Join {#5} \mapsto {#6}} -\newcommand{\resolveConstOver}[6]{\env, \ctxt \vdash {#1}, {#2} \twoheadrightarrow {#3}, {#4}, {#5}, {#6}} +\newcommand{\resolveConstOver}[6]{\env, \ctxt \vdash \mathit{dispatch} \left( {#1}, {#2} \constructorTyp {#3} {#4} {#5} {#6}\right)} %contexts: \newcommand{\cte}{\mathsf{constant}} @@ -257,11 +260,17 @@ \newcommand{\nonoptConstraint}{N} \newcommand{\typeEqs}{\Delta} \newcommand{\anyTyp}{a} -\newcommand{\env}{\Gamma} -\newcommand{\typEnv}{\Gamma} +\newcommand{\typEnv}{\Delta} +\newcommand{\varEnv}{\Gamma} \newcommand{\constEnv}{\Sigma} +\newcommand{\externEnv}{\Xi} +\newcommand{\env}{\Gamma} +%% \newcommand{\typEnv}{\Gamma} +%% \newcommand{\constEnv}{\Sigma} \newcommand{\typ}{\tau} \newcommand{\typs}{\overline \typ} +\newcommand{\baseTyp}{\rho} +\newcommand{\baseTyps}{\overline \baseTyp} \newcommand{\ctxt}{c} \newcommand{\bool}{b} \newcommand{\str}{s} @@ -355,7 +364,7 @@ \newcommand{\isConstant}[1]{\mathit{is\_constant} ({#1})} \newcommand{\isInstantiation}[1]{\mathit{is\_instantiation} ({#1})} \newcommand{\isVariable}[1]{\mathit{is\_variable} ({#1})} -\newcommand{\compileTimeEval}[1]{\llbracket{#1}\rrbracket_\env} +\newcommand{\compileTimeEval}[1]{\llbracket{#1}\rrbracket_{\constEnv, \typEnv}} \newcommand{\implicitCast}[2]{\mathit{implicit\_cast}({#1},{#2})} \newcommand{\reduceEnums}[1]{\mathit{reduce\_enums}({#1})_\env} \newcommand{\inOrLess}[2]{\mathit{in\_or\_directionless}({#1},{#2})} @@ -363,8 +372,8 @@ \newcommand{\typHasEq}[1]{\mathit{has\_equality}({#1})_\env} \newcommand{\nonNeg}[1]{\mathit{is\_nonneg\_numeric}({#1})_\env} \newcommand{\pos}[1]{\mathit{is\_pos\_numeric}({#1})_\env} -\newcommand{\compTimeKnown}[1]{\mathit{compile\_time\_known}({#1})_\env} -\newcommand{\sat}[1]{\mathit{saturate}({#1})_\env} +\newcommand{\compTimeKnown}[1]{\mathit{compile\_time\_known}({#1})_{\constEnv, \typEnv}} +\newcommand{\sat}[1]{\mathit{saturate}({#1})_\typEnv} \newcommand{\trans}[2]{\mathit{translate}({#1})_{\env,{#2}}} \newcommand{\transMaybe}[1]{\mathit{optional\_translate}({#1})_{\env}} \newcommand{\isValidNestedTyp}[1]{\mathit{is\_valid\_nested}({#1})_\env} @@ -373,8 +382,8 @@ \newcommand{\explicitCastOK}[2]{\explCast {#1} {#2}} \newcommand{\insertTypVars}[1]{\mathit{insert\_type\_vars}({#1}, \env)} \newcommand{\getTypeParams}[1]{\mathit{get\_type\_params}({#1})} -\newcommand{\reduce}[1]{\mathit{reduce}({#1})_\env} -\newcommand{\reduceWithEnv}[2]{\mathit{reduce}({#2})_{#1}} +\newcommand{\reduce}[1]{\mathit{reduce}({#1})_\typEnv} +\newcommand{\reduceWithEnv}[2]{\mathit{reduce}({#2})_{#1}} %%TODO: adjust env where it's used. %% \newcommand{\fieldOrMethodTyp}[1]{\mathit{field\_or\_method\_type}({#1})} \newcommand{\isLval}[1]{\mathit{is\_lvalue}({#1})} %type. exp. @@ -441,7 +450,7 @@ \newcommand{\tupleTyps}[1]{\mathsf{tuple}\langle{#1}\rangle} \newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} \newcommand{\listTyps}[1]{\tupleTyps {#1}} -\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\name}\ \{\names\}} +\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\typVar}\ \{\names\}} \newcommand{\enumTyp}[3]{\mathsf{enum}\ {#1}\ {#2}\ \{{#3}\}} \newcommand{\enumTypNoTypDef}{\mathsf{enum} \ {\name}\ \{\names\}} \newcommand{\enumTypNoTyp}[2]{\mathsf{enum} \ {#1}\ \{{#2}\}} @@ -451,6 +460,7 @@ \newcommand{\recordTyps}{\{\overline {\field : \typ}\}} \newcommand{\recordTypss}[2]{\{\overline {{#1} : {#2}}\}} \newcommand{\headerUnionTyp}[2]{\recordTyp {#1} {#2}} +\newcommand{\headerUnionTyps}[2]{\recordTypss {#1} {#2}} \newcommand{\headerTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\structTyp}[2]{\recordTyp {#1} {#2}} \newcommand{\headerTyps}[2]{\recordTypss {#1} {#2}} @@ -481,6 +491,7 @@ \newcommand{\tableTyp}[1]{\mathsf{table}\ {#1}} \newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} \newcommand{\unitTyp}{()} +\newcommand{\stackTyp}[2]{{#1}[{#2}]} %directions: \newcommand{\less}{\mathsf{directionless}} diff --git a/lib/types.mli b/lib/types.mli index 3927045af..f177e0035 100644 --- a/lib/types.mli +++ b/lib/types.mli @@ -196,7 +196,7 @@ and Type : sig | IntType of { tags: 'a; expr: Expression.t} - (** Fixed-with signed integers *) + (** Fixed-width signed integers *) | BitType of { tags: 'a; expr: Expression.t} From 55776b0a102bff54adedfcfaafdbb7766cfad82d Mon Sep 17 00:00:00 2001 From: pataei Date: Mon, 12 Sep 2022 17:24:17 -0400 Subject: [PATCH 26/30] syntax done --- docs/petr4spec/Petr4-spec.mdk | 257 ++++++++++++++++++++++++---------- docs/petr4spec/ops.tex | 138 ++++++++++++++---- 2 files changed, 293 insertions(+), 102 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 72b1378c2..2fc1b51af 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -390,8 +390,11 @@ function signature. judgment signature. environment signature. # Syntax { #sec-syntax } -data types used in programs: +In the following we present P4 syntax. Note that we omitted annotations and meta-information since they are not required for type checking. + ~ Begin P4Syntax +**Data types used in P4 programs:** + | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\baseTyp$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | @@ -407,10 +410,9 @@ data types used in programs: | | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | | | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | | | $\vert$ | $\dontcareTyp$ | $\qquad \text{don't care}$ | -~ End P4Syntax -types of programs: -~ Begin P4Syntax +**Types of P4 expressions:** + | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\typ$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | @@ -419,7 +421,6 @@ types of programs: | | $\vert$ | $\intWidthTyp \width$ | $\qquad \text{fixed-width signed integers}$ | | | $\vert$ | $\bitWidthTyp \width$ | $\qquad \text{fixed-width unsigned integers}$ | | | $\vert$ | $\varBitTyp \width$ | $\qquad \text{variable-width integers}$ | -| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | | | $\vert$ | $\spcTyp \typ \typs$ | $\qquad \text{specialized type}$ | | | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples}$ | | | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | @@ -430,7 +431,8 @@ types of programs: | | $\vert$ | $\recordTyps$ | $\qquad \text{records}$ | | | $\vert$ | $\setTyp \typ$ | $\qquad \text{sets}$ | | | $\vert$ | $\matchKindTyp$ | $\qquad \text{match kinds}$ | -| | $\vert$ | $-$ | $\qquad \text{reference}$ | +| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | +| | $\vert$ | $\newTypeTyp \typVar \typ$ | $\qquad \text{reference}$ | | | $\vert$ | $\headerTyps \field \typ$ | $\qquad \text{headers}$ | | | $\vert$ | $\headerUnionTyps \field \typ $ | $\qquad \text{header unions}$ | | | $\vert$ | $\structTyps \field \typ$ | $\qquad \text{structs}$ | @@ -444,27 +446,79 @@ types of programs: | | $\vert$ | $\constructorTyp \typParams \prms \wildcardParams \typ$ | $\qquad \text{constructors}$ | | | $\vert$ | $\tableTyp \name$ | $\qquad \text{tables}$ | { .booktable } -~ End P4Syntax -directions: (check with .ml file) -~ Begin P4Syntax + +**Directions of parameters:** + | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\dir$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | | | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | -| | $\vert$ | $\less$ | $\qquad \text{copy-in-out}$ | -~ End P4Syntax +| | $\vert$ | $\inout$ | $\qquad \text{copy-in-out}$ | + +**Direction of expressions:** -parameters: -~ Begin P4Syntax | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $-$ | $::=$ | $- $ | $\qquad \text{-}$ | -| | $\vert$ | $- $ | $\qquad \text{-}$ | -~ End P4Syntax +| $\direction$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | +| | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | +| | $\vert$ | $\inout$ | $\qquad \text{copy-in-out}$ | +| | $\vert$ | $\less$ | $\qquad \text{direction-less}$ | + +**Parameters:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\prmDef$ | $::=$ | $\var : \baseTyp$ | $\qquad \text{parameters (no direction)}$ | +| | $\vert$ | $\dir \, \var : \baseTyp$ | $\qquad \text{parameters}$ | +| | $\vert$ | $\var : (\baseTyp, \exp)$ | $\qquad \text{parameters with value (no direction)}$ | +| | $\vert$ | $\dir \,\var : (\baseTyp, \exp)$ | $\qquad \text{parameters with value}$ | + +**Unary operations:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\unaryOp$ | $::=$ | $!$ | $\qquad \text{logical negation}$ | +| | $\vert$ | $\bitComplement$ | $\qquad \text{bitwise complement}$ | +| | $\vert$ | $-$ | $\qquad \text{unary minus}$ | + +**Binary operations:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\binOp$ | $::=$ | $\&\&$ | $\qquad \text{logical and}$ | +| | $\vert$ | $\|\|$ | $\qquad \text{logical or}$ | +| | $\vert$ | $+$ | $\qquad \text{numerical addition}$ | +| | $\vert$ | $-$ | $\qquad \text{numerical subtraction}$ | +| | $\vert$ | $*$ | $\qquad \text{numerical multiplication}$ | +| | $\vert$ | $\div$ | $\qquad \text{numerical division}$ | +| | $\vert$ | $\mod$ | $\qquad \text{numerical modulo}$ | +| | $\vert$ | $==$ | $\qquad \text{equality check}$ | +| | $\vert$ | $!=$ | $\qquad \text{inequality check}$ | +| | $\vert$ | $\plusSat$ | $\qquad \text{saturating addition}$ | +| | $\vert$ | $\subSat$ | $\qquad \text{saturation subtraction}$ | +| | $\vert$ | $\bitAnd$ | $\qquad \text{bitwise and}$ | +| | $\vert$ | $\bitOr$ | $\qquad \text{bitwise or}$ | +| | $\vert$ | $\bitXor$ | $\qquad \text{bitwise xor}$ | +| | $\vert$ | $\bitComplement$ | $\qquad \text{bitwise complement}$ | +| | $\vert$ | $\concat$ | $\qquad \text{bitwise concatenation}$ | +| | $\vert$ | $\shiftL$ | $\qquad \text{shift left}$ | +| | $\vert$ | $\shiftR$ | $\qquad \text{shift right}$ | +| | $\vert$ | $<$ | $\qquad \text{less than}$ | +| | $\vert$ | $\leq$ | $\qquad \text{less than or equal}$ | +| | $\vert$ | $>$ | $\qquad \text{greater than}$ | +| | $\vert$ | $\geq$ | $\qquad \text{greater than or equal}$ | + +**Arguments:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\arg$ | $::=$ | $\argexp$ | $\qquad \text{expression}$ | +| | $\vert$ | $\argkv$ | $\qquad \text{key value}$ | +| | $\vert$ | $\missingarg$ | $\qquad \text{missing}$ | + +**Expressions:** -expressions: -~ Begin P4Syntax | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\exp$ | $::=$ | $\bool$ | $\qquad \text{booleans}$ | @@ -472,67 +526,124 @@ expressions: | | $\vert$ | $\int$ | $\qquad \text{integers}$ | | | $\vert$ | $n_w$ | $\qquad \text{fixed-width signed integers}$ | | | $\vert$ | $b_w$ | $\qquad \text{fixed-width unsigned integers}$ | -| | $\vert$ | $\name$ | $\qquad \text{names}$ | +| | $\vert$ | $\name$ | $\qquad \text{names (variables)}$ | | | $\vert$ | $\arrayAccess {\exp_1} {\exp_2}$ | $\qquad \text{array accesses}$ | | | $\vert$ | $\bitStringAccess {\exp_1} {\exp_2} {\exp_3}$ | $\qquad \text{bitstring slices}$ | | | $\vert$ | $\list \exps$ | $\qquad \text{lists}$ | | | $\vert$ | $\records \exp$ | $\qquad \text{records}$ | -| | $\vert$ | $- $ | $\qquad \text{unary operations}$ | -| | $\vert$ | $- $ | $\qquad \text{binary operations}$ | -| | $\vert$ | $\cast \typ \exp$ | $\qquad \text{casts}$ | -| | $\vert$ | $\typMem \typ \name$ | $\qquad \text{type members}$ | -| | $\vert$ | $\errMem \name$ | $\qquad \text{error members}$ | -| | $\vert$ | $\expMem \exp \name$ | $\qquad \text{expression members}$ | +| | $\vert$ | $\unaryOp \exp$ | $\qquad \text{unary operations}$ | +| | $\vert$ | $\exp_1 \binOp \exp_2$ | $\qquad \text{binary operations}$ | +| | $\vert$ | $\cast \baseTyp \exp$ | $\qquad \text{casts}$ | +| | $\vert$ | $\typMem \typVar \field$ | $\qquad \text{type members}$ | +| | $\vert$ | $\errMem \field$ | $\qquad \text{error members}$ | +| | $\vert$ | $\expMem \exp \field$ | $\qquad \text{expression members}$ | | | $\vert$ | $\ternary {\exp_1} {\exp_2} {\exp_3}$ | $\qquad \text{conditionals}$ | -| | $\vert$ | $\funcCall \exp {\typs} \args$ | $\qquad \text{function calls}$ | -| | $\vert$ | $\instantiation {\spcTyp \name {\typs}} {\args}$ | $\qquad \text{anonymous instantiation}$ | +| | $\vert$ | $\funcCall \exp {\baseTyps} \args$ | $\qquad \text{function calls}$ | +| | $\vert$ | $\instantiation {\baseTyp} {\args}$ | $\qquad \text{anonymous instantiation}$ | | | $\vert$ | $\mask {\exp_1} {\exp_2}$ | $\qquad \text{bit masks}$ | | | $\vert$ | $\range {\exp_1} {\exp_2}$ | $\qquad \text{ranges}$ | -~ End P4Syntax -statements: -~ Begin P4Syntax +**Labels:** + | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\stmt$ | $::=$ | $- $ | $\qquad \text{method call}$ | -| | $\vert$ | $- $ | $\qquad \text{assignment}$ | -| | $\vert$ | $- $ | $\qquad \text{direct application}$ | -| | $\vert$ | $- $ | $\qquad \text{if then else}$ | -| | $\vert$ | $- $ | $\qquad \text{block statement}$ | -| | $\vert$ | $- $ | $\qquad \text{exit}$ | -| | $\vert$ | $- $ | $\qquad \text{empty}$ | -| | $\vert$ | $- $ | $\qquad \text{return}$ | -| | $\vert$ | $- $ | $\qquad \text{switch}$ | -| | $\vert$ | $- $ | $\qquad \text{declaration}$ | -~ End P4Syntax +| $\lbl$ | $::=$ | $\defLbl$ | $\qquad \text{default}$ | +| | $\vert$ | $\str$ | $\qquad \text{string labels}$ | + +**Switchs:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\switchCase$ | $::=$ | $\actionCase \stmts$ | $\qquad \text{labeled block}$ | +| | $\vert$ | $\lbl$ | $\qquad \text{fall through with label}$ | + + +**Statements:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\stmt$ | $::=$ | $\methodCall \exp \baseTyps \args$ | $\qquad \text{method call}$ | +| | $\vert$ | $\assign {\exp_1} {\exp_2}$ | $\qquad \text{assignment}$ | +| | $\vert$ | $\dirApp \baseTyp \args$ | $\qquad \text{direct application}$ | +| | $\vert$ | $\ifthen \exp \stmt$ | $\qquad \text{if then}$ | +| | $\vert$ | $\ifthenelse \exp {\stmt_1} {\stmt_2}$ | $\qquad \text{if then else}$ | +| | $\vert$ | $\block \stmts$ | $\qquad \text{sequencing}$ | +| | $\vert$ | $\exit$ | $\qquad \text{exit}$ | +| | $\vert$ | $\noop$ | $\qquad \text{noop}$ | +| | $\vert$ | $\return \exp$ | $\qquad \text{return}$ | +| | $\vert$ | $\retNothing$ | $\qquad \text{return nothing}$ | +| | $\vert$ | $\switch \exp \switchCases$ | $\qquad \text{switch}$ | +| | $\vert$ | $\dcl$ | $\qquad \text{declaration}$ | + +**Parser states:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\nxt$ | $::=$ | $\str$ | $\qquad \text{next state}$ | +| $\pmatch$ | $::=$ | $\defMatch$ | $\qquad \text{default match}$ | +| | $\vert$ | $\dontcareMatch$ | $\qquad \text{don't care match}$ | +| | $\vert$ | $\exp$ | $\qquad \text{expression match}$ | +| $\case$ | $::=$ | $\expandCase \pmatches \nxt$ | $\qquad \text{match cases for the next state}$ | +| $\parserTran$ | $::=$ | $\nxt$ | $\qquad \text{next state transition}$ | +| | $\vert$ | $\slctTran \exp \pcases$ | $\qquad \text{select next state transition}$ | +| $\state$ | $::=$ | $\stateDef \var \stmts \parserTran$ | $\qquad \text{states}$ | + +**Table properties:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\action$ | $::=$ | $\actionDef \var \arg$ | $\qquad \text{actions}$ | +| $\prop$ | $::=$ | $\key \exp \var$ | $\qquad \text{keys}$ | +| | $\vert$ | $\action$ | $\qquad \text{actions}$ | +| | $\vert$ | $\entry \pmatch \action$ | $\qquad \text{entries}$ | +| | $\vert$ | $\custom \bool \var \exp$ | $\qquad \text{custom property}$ | + +**Methods:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\extMethod$ | $::=$ | $\constructor \var \prmDef$ | $\qquad \text{constructors}$ | +| | $\vert$ | $\abstractMethod \baseTyp \var \typVar \prmDef$ | $\qquad \text{abstract methods}$ | +| | $\vert$ | $-$ | $\qquad \text{methods}$ | + +**Declarations:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\dcl$ | $::=$ | $\constDcl \baseTyp \var \exp$ | $\qquad \text{constants}$ | +| | $\vert$ | $\inst \baseTyp \args \var \stmts$ | $\qquad \text{instantiations (initialized)}$ | +| | $\vert$ | $\instNoBlock \baseTyp \args \var$ | $\qquad \text{instantiations (uninitialized)}$ | +| | $\vert$ | $\parserDcl \var \typVars {\overline {\prmDef_1}} {\overline {\prmDef_2}} \dcls \states$ | $\qquad \text{parsers}$ | +| | $\vert$ | $\controlDcl \var \typVars \prmDefs \stmts$ | $\qquad \text{controls}$ | +| | $\vert$ | $\funcDcl \baseTyp \var \typVars \prmDefs \stmts$ | $\qquad \text{functions}$ | +| | $\vert$ | $\externFuncDcl \baseTyp \var \typVars \prmDefs$ | $\qquad \text{extern functions}$ | +| | $\vert$ | $\varDclInit \baseTyp \var \exp$ | $\qquad \text{local variables (initialized)}$ | +| | $\vert$ | $\varDcl \baseTyp \var$ | $\qquad \text{local variables (uninitialized)}$ | +| | $\vert$ | $\valSetDcl \baseTyp \exp \var$ | $\qquad \text{parser value sets}$ | +| | $\vert$ | $\actionDcl \var \prmDefs \stmts$ | $\qquad \text{actions}$ | +| | $\vert$ | $\tableDcl \var \props$ | $\qquad \text{tables}$ | +| | $\vert$ | $\headerDcl \typVar \fieldTyps$ | $\qquad \text{header types}$ | +| | $\vert$ | $\headerUnionDcl \typVar \fieldTyps$ | $\qquad \text{header union types}$ | +| | $\vert$ | $\structDcl \typVar \fieldTyps$ | $\qquad \text{struct types}$ | +| | $\vert$ | $\errDcl \fields$ | $\qquad \text{error types}$ | +| | $\vert$ | $\matchkindDcl \fields$ | $\qquad \text{match kind types}$ | +| | $\vert$ | $\enumDcl \typVar \fields$ | $\qquad \text{enumerated types}$ | +| | $\vert$ | $\serEnumDcl \baseTyp \typVar \field \exp$ | $\qquad \text{serializable enumerated types}$ | +| | $\vert$ | $\externObjDcl \var \typVars \extMethods$ | $\qquad \text{extern objects}$ | +| | $\vert$ | $\typdefDcl \typVar \baseTyp$ | $\qquad \text{type definitions}$ | +| | $\vert$ | $\typdefDcl \typVar \dcl$ | $\qquad \text{type definitions (declarations)}$ | +| | $\vert$ | $\newtypeDcl \typVar \baseTyp$ | $\qquad \text{generative type definitions}$ | +| | $\vert$ | $\newtypeDcl \typVar \dcl$ | $\qquad \text{generative type definitions (declarations)}$ | +| | $\vert$ | $\controlTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{control types}$ | +| | $\vert$ | $\parserTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{parser types}$ | +| | $\vert$ | $\packageTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{package types}$ | + +**Programs:** -declarations: -~ Begin P4Syntax | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\dcl$ | $::=$ | $- $ | $\qquad \text{constants}$ | -| | $\vert$ | $- $ | $\qquad \text{instantiations}$ | -| | $\vert$ | $- $ | $\qquad \text{parsers}$ | -| | $\vert$ | $- $ | $\qquad \text{controls}$ | -| | $\vert$ | $- $ | $\qquad \text{functions}$ | -| | $\vert$ | $- $ | $\qquad \text{extern functions}$ | -| | $\vert$ | $- $ | $\qquad \text{variables}$ | -| | $\vert$ | $- $ | $\qquad \text{parser value sets}$ | -| | $\vert$ | $- $ | $\qquad \text{actions}$ | -| | $\vert$ | $- $ | $\qquad \text{tables}$ | -| | $\vert$ | $- $ | $\qquad \text{header types}$ | -| | $\vert$ | $- $ | $\qquad \text{header union types}$ | -| | $\vert$ | $- $ | $\qquad \text{struct types}$ | -| | $\vert$ | $- $ | $\qquad \text{error types}$ | -| | $\vert$ | $- $ | $\qquad \text{match kind types}$ | -| | $\vert$ | $- $ | $\qquad \text{enumerated types}$ | -| | $\vert$ | $- $ | $\qquad \text{serializable enumerated types}$ | -| | $\vert$ | $- $ | $\qquad \text{extern objects}$ | -| | $\vert$ | $- $ | $\qquad \text{type definitions}$ | -| | $\vert$ | $- $ | $\qquad \text{generative type definitions}$ | -| | $\vert$ | $- $ | $\qquad \text{control types}$ | -| | $\vert$ | $- $ | $\qquad \text{parser types}$ | -| | $\vert$ | $- $ | $\qquad \text{package types}$ | +| $\prog$ | $::=$ | $\dcls$ | $\qquad \text{programs}$ | + ~ End P4Syntax @@ -916,15 +1027,15 @@ A table type is well-formed under an environment if it exists in the environment ~ End InfRule -### Typename Type { #sec-typename-t } +### Reference Type { #sec-typename-t } The rule $\typeNameT$ states that the type name $\name$ is well-formed under the environment $\env$ if it exists in the environment. ~ Begin InfRule \inferrule - { \lookupTypEnv \name = \whatevs} - { \typWellFormed {\typNameTyp \name} } + { \lookupTypEnv \typVar = \whatevs} + { \typWellFormed {\typVar} } \quad (\typeNameT) ~ End InfRule @@ -1354,7 +1465,7 @@ Petr4 doesn't always check this. (ref: section 8.7 spec. e.g., unaryminus or bin { \expenv \exp {\prim \exp} \typ \dir \\ \widthInt \typ = \_} % \typ = {\bitWidthTyp \width} \textOr \intWidthTyp \width} - { \expenv {\bitComplement\!\exp} {\bitComplement\!\prim \exp} {\typ} \dir } + { \expenv {\bitComplement\exp} {\bitComplement\prim \exp} {\typ} \dir } \quad (\bitwiseComplementE) \inferrule @@ -2459,7 +2570,7 @@ check parameter shadowing takes two lists of parameters and checks if there is a { \prim \typ = \trans \typ \emp \\ (\prim \exp, \pprim \typ, \dir) = \castExpression \exp {\prim \typ}\\ \val = \compileTimeEval {\prim \exp} } - { \dclenvvv {\const \typ \var \exp} {\const {\prim \typ} \var \val} {\addConstEnv \var \val} {\addTypeEnv \var {(\prim \typ, \less)}}} + { \dclenvvv {\constDcl \typ \var \exp} {\constDcl {\prim \typ} \var \val} {\addConstEnv \var \val} {\addTypeEnv \var {(\prim \typ, \less)}}} \quad (\constantD) \inferrule @@ -2501,7 +2612,7 @@ check parameter shadowing takes two lists of parameters and checks if there is a \prim \typ = \trans \typ \emp \\ \allowedTypeForVar {\prim \typ} \\ \typWellFormed {\prim \typ}} - { \dclenvvv {\varDecl \typ \var } {\varDecl {\prim \typ} \var} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + { \dclenvvv {\varDcl \typ \var } {\varDcl {\prim \typ} \var} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } \quad (\varD) \inferrule @@ -2510,7 +2621,7 @@ check parameter shadowing takes two lists of parameters and checks if there is a \allowedTypeForVar {\prim \typ} \\ \typWellFormed {\prim \typ} \\ (\prim \exp, \prim \typ, \dir) = \castExpression {\prim \typ} \exp} - { \dclenvvv {\varInit \typ \var \exp} {\varInit {\prim \typ} \var {(\prim \exp, \prim \typ, \dir)}} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } + { \dclenvvv {\varDclInit \typ \var \exp} {\varDclInit {\prim \typ} \var {(\prim \exp, \prim \typ, \dir)}} \constEnv {\addTypeEnv \var {(\prim \typ, \inout)}} } \quad (\varInitD) \inferrule diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index f1901ed34..14799866a 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -41,7 +41,7 @@ \newcommand*{\actionT}{\rn{Action}\rT} \newcommand*{\constructorT}{\rn{Constructor}\rT} \newcommand*{\tableT}{\rn{Table}\rT} -\newcommand*{\typeNameT}{\rn{TypeName}\rT} +\newcommand*{\typeNameT}{\rn{Reference}\rT} \newcommand*{\boolE}{\rn{Bool}\rE} \newcommand*{\stringE}{\rn{String}\rE} @@ -213,7 +213,7 @@ %operators: \newcommand{\mask}[2]{{#1}\ \&\&\&\ {#2}} \newcommand{\range}[2]{{#1}..{#2}} -\newcommand{\ternary}[3]{{#1}\ ?\ {#2}\ : \ {#3}} +\newcommand{\ternary}[3]{{#1}\, ?\, {#2}\, : \, {#3}} \newcommand{\errMem}[1]{\mathsf{error}.{#1}} \newcommand{\typMem}[2]{{#1}.{#2}} \newcommand{\shiftR}{\gg} @@ -221,30 +221,21 @@ \newcommand{\concat}{+\!+\ } \newcommand{\restOps}{\odot} \newcommand{\ops}{\odot} -\newcommand{\cast}[2]{({#1}){#2}} +\newcommand{\unaryOp}{\ominus} +\newcommand{\binOp}{\oplus} +\newcommand{\cast}[2]{({#1})\,{#2}} \newcommand{\plusSat}{\vert+\vert} \newcommand{\subSat}{\vert-\vert} \newcommand{\bitAnd}{\&} \newcommand{\bitOr}{\vert} \newcommand{\bitXor}{\hat{}} -\newcommand{\bitComplement}{\sim} +\newcommand{\bitComplement}{\sim\!} \renewcommand{\div}{/} \renewcommand{\mod}{\%} -\newcommand{\funcCall}[3]{{#1}\langle{#2}\rangle({#3})} +\newcommand{\funcCall}[3]{{#1}\,\langle{#2}\rangle\,({#3})} \newcommand{\funcCallNoTypArgs}[2]{{#1}({#2})} \newcommand{\expMem}[2]{{#1}.{#2}} -\newcommand{\instantiation}[2]{{#1}({#2})} -\newcommand{\assign}[2]{{#1}={#2}} -\newcommand{\noop}{;} -\newcommand{\return}[1]{\mathsf{return}\ {#1}} -\newcommand{\exit}{\mathit{exit}} -\newcommand{\switch}[2]{\mathit{switch}\ ({#1}) \{{#2}\}} -\newcommand{\lbl}{l} -\newcommand{\actionCase}[1]{\lbl : \block {#1}} -\newcommand{\const}[3]{\mathit{const}\ {#1}\ {#2} := {#3}} -\newcommand{\inst}[4]{{#1} ({#2}) {#3} \{{#4}\}} -\newcommand{\varDecl}[2]{{#1}\ {#2}} -\newcommand{\varInit}[3]{{#1}\ {#2} := {#3}} +\newcommand{\instantiation}[2]{{#1}\, ({#2})} %%anonymous instantiation %name. %% \newcommand{\parserDecl}[]{\mathit{parser}\ {#1} (type_param param) {const_param locals states} \renewcommand{\list}[1]{\{{#1}\}} @@ -255,6 +246,8 @@ %metavariables: +\newcommand{\prmDef}{\mathit{prm}} +\newcommand{\prmDefs}{\overline \prmDef} \newcommand{\constraint}{C} \newcommand{\optConstraint}{B} \newcommand{\nonoptConstraint}{N} @@ -298,25 +291,20 @@ \newcommand{\fields}{\overline \field} \newcommand{\param}{x} \newcommand{\params}{\overline x} -\newcommand{\prm}[1]{\dir_{#1} \ \typ_{#1}\ \param_{#1}} -\newcommand{\singleprm}{\dir \ \typ \ \param} +\newcommand{\prm}[1]{\dir_{#1}\ \param_{#1}:\typ_{#1}} +\newcommand{\singleprm}{\dir \ \param: \typ } \newcommand{\prms}{\overline {\singleprm}} -\newcommand{\prmss}{\overline {\prim \dir \ \prim \typ \ \prim \param}} +\newcommand{\prmss}{\overline {\prim \dir \ \prim \param: \prim \typ}} \newcommand{\typParam}{\typVar} \newcommand{\typParams}{\overline \typParam} -\newcommand{\pari}[1]{\dir_{#1} \typ_{#1} \typParam_{#1}} +\newcommand{\pari}[1]{\dir_{#1}\ \param_{#1}: \typ_{#1}} +\newcommand{\paris}[1]{\overline {\pari {#1}}} \newcommand{\pars}[2]{\pari {#1}, \ldots, \pari {#2}} % wildcard param for wild card type vars. \newcommand{\wildcardParam}{W} \newcommand{\wildcardParams}{\overline \wildcardParam} \renewcommand{\arg}{\mathit{arg}} \newcommand{\args}{\overline \arg} -\newcommand{\stmt}{\mathit{stmt}} -\newcommand{\stmts}{\overline \stmt} -\newcommand{\block}[1]{\{ {#1} \}} -\newcommand{\ifthen}[2]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}} -\newcommand{\ifthenelse}[3]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}\ \mathsf{else}\ {#3}} -\newcommand{\dcl}{\mathit{dcl}} \newcommand{\kind}{k} \newcommand{\ret}{\mathit{return}} \newcommand{\retTyp}{\typ_\ret} @@ -328,9 +316,100 @@ \newcommand{\argkvi}[1]{\var_{#1}=\exp_{#1}} \newcommand{\argkvs}{\overline \argkv} \newcommand{\argkvss}[2]{\argkvi {#1}, \ldots, \argkvi {#2}} +\newcommand{\missingarg}{\_\!\_\!\_\!\_} \newcommand{\names}{\overline \name} \newcommand{\methods}[2]{\overline {{#1}:{#2}}} +% statements +\newcommand{\stmt}{\mathit{stmt}} +\newcommand{\stmts}{\overline \stmt} +\newcommand{\block}[1]{\{ {#1} \}} +\newcommand{\ifthen}[2]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}} +\newcommand{\ifthenelse}[3]{\mathsf{if}\ {#1}\ \mathsf{then}\ {#2}\ \mathsf{else}\ {#3}} +\newcommand{\methodCall}[3]{{#1}\,\langle{#2}\rangle\, \left({#3}\right)} +\newcommand{\assign}[2]{{#1}:={#2}} +\newcommand{\noop}{;} +\newcommand{\return}[1]{\mathsf{return}\ {#1}} +\newcommand{\retNothing}{\mathsf{return ;}} +\newcommand{\exit}{\mathsf{exit}} +\newcommand{\switch}[2]{\mathsf{switch}\ ({#1})\, \{{#2}\}} +\newcommand{\lbl}{l} +\newcommand{\actionCase}[1]{\lbl : \block {#1}} +\newcommand{\switchCase}{\mathit{switch}} +\newcommand{\switchCases}{\overline \switchCase} +\newcommand{\dirApp}[2]{{#1} \left({#2}\right)} +\newcommand{\defLbl}{\mathsf{default}} + +%% parser states +\newcommand{\slctTran}[2]{({#1})\ \{{#2}\}} +\newcommand{\expandCase}[2]{{#1} \ {#2}} +\newcommand{\nxt}{\mathit{nxt}} +\newcommand{\dontcareMatch}{\_\!\_\!\_} +\newcommand{\defMatch}{\mathsf{default}} +\newcommand{\pmatch}{\mathit{mtch}} +\newcommand{\pmatches}{\overline \pmatch} +\newcommand{\case}{\mathit{case}} +\newcommand{\pcases}{\overline \case} +\newcommand{\parserTran}{t} +\newcommand{\parserTrans}{\overline \parserTran} +\newcommand{\stateDef}[3]{{#1}\ \{{#2}\} \ {#3}} +\newcommand{\state}{\mathit{st}} +\newcommand{\states}{\overline \state} + + +%% table properties +\newcommand{\custom}[3]{{#1}\,({#2},{#3})} +\newcommand{\entry}[2]{\overline {#1} \, {#2}} +\newcommand{\action}{\mathit{act}} +\newcommand{\actionDef}[2]{{#1}\, ({#2})} +\newcommand{\actions}{\overline \action} +\newcommand{\key}[2]{{#1} : {#2}} +\newcommand{\keys}[2]{\overline {\key {#1} {#2}}} +\newcommand{\prop}{\mathit{prop}} +\newcommand{\props}{\overline \prop} + +%% field type pairs +\newcommand{\fieldTyp}{\field:\baseTyp} +\newcommand{\fieldTyps}{\overline \fieldTyp} + +%% methods +\newcommand{\constructor}[2]{{#1}\,(\overline {{#2}})} +\newcommand{\abstractMethod}[4]{{#1}\, {#2}\, \langle\overline {{#3}}\rangle\,(\overline {{#4}})} +\newcommand{\extMethod}{\mathit{mth}} +\newcommand{\extMethods}{\overline \extMethod} + +% declarations +\newcommand{\dcl}{\mathit{dcl}} +\newcommand{\dcls}{\overline \dcl} +\newcommand{\constDcl}[3]{\mathsf{const}\ {#1}\ {#2} := {#3}} +\newcommand{\inst}[4]{{#1}\, ({#2})\, {#3}\, \{{#4}\}} +\newcommand{\instNoBlock}[3]{{#1}\, ({#2})\, {#3}} +\newcommand{\parserDcl}[6]{\mathsf{parser}\ {#1}\, \langle {#2}\rangle\, ({#3})\, ({#4})\, \{{#5}\ {#6} \}} +\newcommand{\controlDcl}[4]{\mathsf{control}\ {#1}\, \langle {#2}\rangle\, ({#3})\, \{ {#4} \}} +\newcommand{\funcDcl}[5]{\mathsf{function}\ {#1}\, {#2}\, \langle {#3}\rangle\, ({#4})\, \{ {#5}\}} +\newcommand{\externFuncDcl}[4]{\mathsf{extern\_function}\ {#1}\, {#2}\, \langle {#3}\rangle\, ({#4})} +\newcommand{\varDclInit}[3]{{#1}\ {#2} := {#3}} +\newcommand{\varDcl}[2]{{#1}\, {#2}} +%type. expression. name. +\newcommand{\valSetDcl}[3]{{#1}\, {#3}:{#2}} +\newcommand{\actionDcl}[3]{\mathsf{action}\ {#1}\, (\prms)\, \{{#3}\}} +\newcommand{\tableDcl}[2]{\mathsf{table}\ {#1}\, \{{#2}\}} +\newcommand{\headerDcl}[2]{\mathsf{header}\ {#1}\, \{{#2}\}} +\newcommand{\headerUnionDcl}[2]{\mathsf{header\_union}\ {#1}\, \{{#2}\}} +\newcommand{\structDcl}[2]{\mathsf{struct}\ {#1}\, \{{#2}\}} +\newcommand{\errDcl}[1]{\mathsf{error}\ \{ {#1} \}} +\newcommand{\matchkindDcl}[1]{\mathsf{match\_kind}\ \{{#1}\}} +\newcommand{\enumDcl}[2]{\mathsf{enum}\ {#1}\, \{{#2} \}} +\newcommand{\serEnumDcl}[4]{\mathsf{enum}\ {#1} \, {#2}\, \{\overline {{#3}:{#4}} \}} +\newcommand{\externObjDcl}[3]{\mathsf{extern}\ {#1}\, \langle{#2}\rangle\, \{{#3} \}} +\newcommand{\newtypeDcl}[2]{{#1}={#2}} +\newcommand{\typdefDcl}[2]{\mathsf{typedef}\ {#2}\, {#1}} +\newcommand{\controlTypDcl}[3]{\mathsf{ctrl}\ {#1}\, \langle{#2}\rangle\, ({#3})} +\newcommand{\parserTypDcl}[3]{\mathsf{prs}\ {#1}\, \langle{#2}\rangle\, ({#3})} +\newcommand{\packageTypDcl}[3]{\mathsf{pckg}\ {#1}\, \langle{#2}\rangle\, ({#3})} + +\newcommand{\prog}{\mathit{prog}} + %function helpers \newcommand{\types}[1]{\mathit{types\_of}({#1})} \newcommand{\mergeConst}[1]{\mathit{merge\_types}({#1})} @@ -402,7 +481,7 @@ \newcommand{\removeOptionalPars}[1]{\mathit{remove\_optional\_parameteres}({#1})} \newcommand{\concatList}[2]{{#1}\ +\!+\ {#2}} \newcommand{\isDirectionless}[1]{\mathit{is\_directionless}({#1})} -\newcommand{\whatevs}{\_} +\newcommand{\whatevs}{\_\!\_} %fields \newcommand{\isValid}{\mathsf{isValid}} @@ -489,13 +568,14 @@ \newcommand{\packageTyp}[3]{\mathsf{package}\langle{#1}\rangle({#2},{#3})} \newcommand{\actionTyp}[2]{\mathsf{action}(\mathsf{data:}\ {#1},\mathsf{control:}\ {#2})} \newcommand{\tableTyp}[1]{\mathsf{table}\ {#1}} -\newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} +%% \newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} \newcommand{\unitTyp}{()} \newcommand{\stackTyp}[2]{{#1}[{#2}]} %directions: \newcommand{\less}{\mathsf{directionless}} \newcommand{\dir}{d} +\newcommand{\direction}{\mathit{dir}} %%for the typed.direction \newcommand{\dirs}{\overline \dir} \newcommand{\inDir}{\mathsf{in}} \newcommand{\out}{\mathsf{out}} From 3044cdbcf228c5dabb93161b4b75c8a308553e1f Mon Sep 17 00:00:00 2001 From: pataei Date: Tue, 27 Sep 2022 10:44:32 -0400 Subject: [PATCH 27/30] final touch on syntax --- docs/petr4spec/Petr4-spec.mdk | 20 +++++--------------- docs/petr4spec/ops.tex | 3 ++- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 2fc1b51af..e3e938aee 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -448,15 +448,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta { .booktable } -**Directions of parameters:** - -| | | | | -|~~~~:|:~~~~:|:~~~~|:~~~~| -| $\dir$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | -| | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | -| | $\vert$ | $\inout$ | $\qquad \text{copy-in-out}$ | - -**Direction of expressions:** +**Directions:** | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| @@ -469,9 +461,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\prmDef$ | $::=$ | $\var : \baseTyp$ | $\qquad \text{parameters (no direction)}$ | -| | $\vert$ | $\dir \, \var : \baseTyp$ | $\qquad \text{parameters}$ | -| | $\vert$ | $\var : (\baseTyp, \exp)$ | $\qquad \text{parameters with value (no direction)}$ | +| $\prmDef$ | $::=$ | $\dir \, \var : \baseTyp$ | $\qquad \text{parameters}$ | | | $\vert$ | $\dir \,\var : (\baseTyp, \exp)$ | $\qquad \text{parameters with value}$ | **Unary operations:** @@ -487,7 +477,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\binOp$ | $::=$ | $\&\&$ | $\qquad \text{logical and}$ | -| | $\vert$ | $\|\|$ | $\qquad \text{logical or}$ | +| | $\vert$ | $\vert\vert$ | $\qquad \text{logical or}$ | | | $\vert$ | $+$ | $\qquad \text{numerical addition}$ | | | $\vert$ | $-$ | $\qquad \text{numerical subtraction}$ | | | $\vert$ | $*$ | $\qquad \text{numerical multiplication}$ | @@ -604,7 +594,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta |~~~~:|:~~~~:|:~~~~|:~~~~| | $\extMethod$ | $::=$ | $\constructor \var \prmDef$ | $\qquad \text{constructors}$ | | | $\vert$ | $\abstractMethod \baseTyp \var \typVar \prmDef$ | $\qquad \text{abstract methods}$ | -| | $\vert$ | $-$ | $\qquad \text{methods}$ | +| | $\vert$ | $\methodDef \baseTyp \var \typVar \prmDef$ | $\qquad \text{methods}$ | **Declarations:** @@ -614,7 +604,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\inst \baseTyp \args \var \stmts$ | $\qquad \text{instantiations (initialized)}$ | | | $\vert$ | $\instNoBlock \baseTyp \args \var$ | $\qquad \text{instantiations (uninitialized)}$ | | | $\vert$ | $\parserDcl \var \typVars {\overline {\prmDef_1}} {\overline {\prmDef_2}} \dcls \states$ | $\qquad \text{parsers}$ | -| | $\vert$ | $\controlDcl \var \typVars \prmDefs \stmts$ | $\qquad \text{controls}$ | +| | $\vert$ | $\controlDcl \var \typVars {\overline {\prmDef_1}} {\overline {\prmDef_2}} \dcls \stmts$ | $\qquad \text{controls}$ | | | $\vert$ | $\funcDcl \baseTyp \var \typVars \prmDefs \stmts$ | $\qquad \text{functions}$ | | | $\vert$ | $\externFuncDcl \baseTyp \var \typVars \prmDefs$ | $\qquad \text{extern functions}$ | | | $\vert$ | $\varDclInit \baseTyp \var \exp$ | $\qquad \text{local variables (initialized)}$ | diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 14799866a..550ee6d50 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -375,6 +375,7 @@ %% methods \newcommand{\constructor}[2]{{#1}\,(\overline {{#2}})} \newcommand{\abstractMethod}[4]{{#1}\, {#2}\, \langle\overline {{#3}}\rangle\,(\overline {{#4}})} +\newcommand{\methodDef}[4]{{#1}\, {#2}\, \langle\overline {{#3}}\rangle\,(\overline {{#4}})} \newcommand{\extMethod}{\mathit{mth}} \newcommand{\extMethods}{\overline \extMethod} @@ -385,7 +386,7 @@ \newcommand{\inst}[4]{{#1}\, ({#2})\, {#3}\, \{{#4}\}} \newcommand{\instNoBlock}[3]{{#1}\, ({#2})\, {#3}} \newcommand{\parserDcl}[6]{\mathsf{parser}\ {#1}\, \langle {#2}\rangle\, ({#3})\, ({#4})\, \{{#5}\ {#6} \}} -\newcommand{\controlDcl}[4]{\mathsf{control}\ {#1}\, \langle {#2}\rangle\, ({#3})\, \{ {#4} \}} +\newcommand{\controlDcl}[6]{\mathsf{control}\ {#1}\, \langle {#2}\rangle\, ({#3})\, ({#4})\, \{ {#5}\ {#6} \}} \newcommand{\funcDcl}[5]{\mathsf{function}\ {#1}\, {#2}\, \langle {#3}\rangle\, ({#4})\, \{ {#5}\}} \newcommand{\externFuncDcl}[4]{\mathsf{extern\_function}\ {#1}\, {#2}\, \langle {#3}\rangle\, ({#4})} \newcommand{\varDclInit}[3]{{#1}\ {#2} := {#3}} From 4a146259e61aa5c181c802136f2e5c1a16d0f95c Mon Sep 17 00:00:00 2001 From: pataei Date: Mon, 3 Oct 2022 22:36:37 -0400 Subject: [PATCH 28/30] type well formed ready for merge --- docs/petr4spec/Petr4-spec.mdk | 316 ++++++++++++++++++---------------- docs/petr4spec/ops.tex | 39 +++-- 2 files changed, 192 insertions(+), 163 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index e3e938aee..f1fb20fff 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -390,7 +390,13 @@ function signature. judgment signature. environment signature. # Syntax { #sec-syntax } -In the following we present P4 syntax. Note that we omitted annotations and meta-information since they are not required for type checking. +In the following we present P4 syntax. Note that we omitted annotations and meta-information since they are not required for type checking. Some notes about the syntax follows: + + +- Two types are provided. The first one is denoted by $\baseTyp$ which is the data types availabe in P4 language. The second one is denoted by $\typ$ and is the type generated by the type system which could be the result of a type declaration in a P4 program. +- Parameters, denoted by $\prmDef \typKind$, are paremeterized by the type they have, that is, $\typKind$ represent a type where it can either be $\baseTyp$ or $\typ$. This is because they are used in different places and depending on where they are used they may have a different type. +- For simplicity, we use the expanded format of parameter in most rules to have fine access to its direction and type. However, we often don't need its initializer so we omit that. Keep in mind that a parameter could or could not have an initializer. +- Direction is optional in parameter declaration. However, for simpilicity, we just use $\less$ to denote a missing direction. ~ Begin P4Syntax **Data types used in P4 programs:** @@ -410,6 +416,26 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | | | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | | | $\vert$ | $\dontcareTyp$ | $\qquad \text{don't care}$ | +{ .booktable } + +**Directions:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\dir$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | +| | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | +| | $\vert$ | $\inout$ | $\qquad \text{copy-in-out}$ | +| | $\vert$ | $\less$ | $\qquad \text{direction-less}$ | +{ .booktable } + +**Parameters:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\prmDef \typKind$ | $::=$ | $\dir \, \typKind \, \var$ | $\qquad \text{parameters}$ | +| | $\vert$ | $\dir \, \typKind \, \var = \exp$ | $\qquad \text{parameters with value}$ | +{ .booktable } + **Types of P4 expressions:** @@ -421,49 +447,28 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\intWidthTyp \width$ | $\qquad \text{fixed-width signed integers}$ | | | $\vert$ | $\bitWidthTyp \width$ | $\qquad \text{fixed-width unsigned integers}$ | | | $\vert$ | $\varBitTyp \width$ | $\qquad \text{variable-width integers}$ | +| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | | | $\vert$ | $\spcTyp \typ \typs$ | $\qquad \text{specialized type}$ | -| | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples}$ | +| | $\vert$ | $\arrayTyp \typ \width$ | $\qquad \text{arrays}$ | +| | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples/lists}$ | | | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | | | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | -| | $\vert$ | $\dontcareTyp$ | $\qquad \text{don't care}$ | -| | $\vert$ | $\arrayTyp \typ \width$ | $\qquad \text{arrays}$ | -| | $\vert$ | $\listTyps \typs$ | $\qquad \text{lists}$ | -| | $\vert$ | $\recordTyps$ | $\qquad \text{records}$ | +| | $\vert$ | $\recordTyps$ | $\qquad \text{records/headers/header unions/structs}$ | | | $\vert$ | $\setTyp \typ$ | $\qquad \text{sets}$ | | | $\vert$ | $\matchKindTyp$ | $\qquad \text{match kinds}$ | -| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | | | $\vert$ | $\newTypeTyp \typVar \typ$ | $\qquad \text{reference}$ | -| | $\vert$ | $\headerTyps \field \typ$ | $\qquad \text{headers}$ | -| | $\vert$ | $\headerUnionTyps \field \typ $ | $\qquad \text{header unions}$ | -| | $\vert$ | $\structTyps \field \typ$ | $\qquad \text{structs}$ | -| | $\vert$ | $\enumTypDef$ | $\qquad \text{enums}$ | -| | $\vert$ | $\packageTyp \typParams \prms \wildcardParams$ | $\qquad \text{packages}$ | -| | $\vert$ | $\controlTyp \typParams \prms$ | $\qquad \text{controls}$ | -| | $\vert$ | $\parserTyp \typParams \prms$ | $\qquad \text{parsers}$ | +| | $\vert$ | $\enumTypDef$ | $\qquad \text{serializable enums}$ | +| | $\vert$ | $\enumTypNoTypDef$ | $\qquad \text{enums}$ | +| | $\vert$ | $\packageTyp \typParams {\prmDefs \typ} \wildcardParams$ | $\qquad \text{packages}$ | +| | $\vert$ | $\controlTyp \typParams {\prmDefs \typ}$ | $\qquad \text{controls}$ | +| | $\vert$ | $\parserTyp \typParams {\prmDefs \typ}$ | $\qquad \text{parsers}$ | | | $\vert$ | $\externTyp \name$ | $\qquad \text{externs}$ | | | $\vert$ | $\funcType \kind \typParams \params \typ$ | $\qquad \text{functions}$ | -| | $\vert$ | $\actionTyp {\overline {\prm 1}} {\overline {\prm 2}}$ | $\qquad \text{actions}$ | -| | $\vert$ | $\constructorTyp \typParams \prms \wildcardParams \typ$ | $\qquad \text{constructors}$ | +| | $\vert$ | $\actionTyp {\overline { {\prmDef \typ}}} {\overline {\VVal {\prmDef \typ}}}$ | $\qquad \text{actions}$ | +| | $\vert$ | $\constructorTyp \typParams {\prmDefs \typ} \wildcardParams \typ$ | $\qquad \text{constructors}$ | | | $\vert$ | $\tableTyp \name$ | $\qquad \text{tables}$ | { .booktable } - -**Directions:** - -| | | | | -|~~~~:|:~~~~:|:~~~~|:~~~~| -| $\direction$ | $::=$ | $\inDir$ | $\qquad \text{copy-in}$ | -| | $\vert$ | $\out$ | $\qquad \text{copy-out}$ | -| | $\vert$ | $\inout$ | $\qquad \text{copy-in-out}$ | -| | $\vert$ | $\less$ | $\qquad \text{direction-less}$ | - -**Parameters:** - -| | | | | -|~~~~:|:~~~~:|:~~~~|:~~~~| -| $\prmDef$ | $::=$ | $\dir \, \var : \baseTyp$ | $\qquad \text{parameters}$ | -| | $\vert$ | $\dir \,\var : (\baseTyp, \exp)$ | $\qquad \text{parameters with value}$ | - **Unary operations:** | | | | | @@ -471,6 +476,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | $\unaryOp$ | $::=$ | $!$ | $\qquad \text{logical negation}$ | | | $\vert$ | $\bitComplement$ | $\qquad \text{bitwise complement}$ | | | $\vert$ | $-$ | $\qquad \text{unary minus}$ | +{ .booktable } **Binary operations:** @@ -498,6 +504,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\leq$ | $\qquad \text{less than or equal}$ | | | $\vert$ | $>$ | $\qquad \text{greater than}$ | | | $\vert$ | $\geq$ | $\qquad \text{greater than or equal}$ | +{ .booktable } **Arguments:** @@ -506,6 +513,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | $\arg$ | $::=$ | $\argexp$ | $\qquad \text{expression}$ | | | $\vert$ | $\argkv$ | $\qquad \text{key value}$ | | | $\vert$ | $\missingarg$ | $\qquad \text{missing}$ | +{ .booktable } **Expressions:** @@ -514,8 +522,8 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | $\exp$ | $::=$ | $\bool$ | $\qquad \text{booleans}$ | | | $\vert$ | $\str$ | $\qquad \text{strings}$ | | | $\vert$ | $\int$ | $\qquad \text{integers}$ | -| | $\vert$ | $n_w$ | $\qquad \text{fixed-width signed integers}$ | -| | $\vert$ | $b_w$ | $\qquad \text{fixed-width unsigned integers}$ | +| | $\vert$ | $\intWidth \int \width$ | $\qquad \text{fixed-width signed integers}$ | +| | $\vert$ | $\bitWidth \bit \width$ | $\qquad \text{fixed-width unsigned integers}$ | | | $\vert$ | $\name$ | $\qquad \text{names (variables)}$ | | | $\vert$ | $\arrayAccess {\exp_1} {\exp_2}$ | $\qquad \text{array accesses}$ | | | $\vert$ | $\bitStringAccess {\exp_1} {\exp_2} {\exp_3}$ | $\qquad \text{bitstring slices}$ | @@ -532,6 +540,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\instantiation {\baseTyp} {\args}$ | $\qquad \text{anonymous instantiation}$ | | | $\vert$ | $\mask {\exp_1} {\exp_2}$ | $\qquad \text{bit masks}$ | | | $\vert$ | $\range {\exp_1} {\exp_2}$ | $\qquad \text{ranges}$ | +{ .booktable } **Labels:** @@ -539,6 +548,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta |~~~~:|:~~~~:|:~~~~|:~~~~| | $\lbl$ | $::=$ | $\defLbl$ | $\qquad \text{default}$ | | | $\vert$ | $\str$ | $\qquad \text{string labels}$ | +{ .booktable } **Switchs:** @@ -546,7 +556,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta |~~~~:|:~~~~:|:~~~~|:~~~~| | $\switchCase$ | $::=$ | $\actionCase \stmts$ | $\qquad \text{labeled block}$ | | | $\vert$ | $\lbl$ | $\qquad \text{fall through with label}$ | - +{ .booktable } **Statements:** @@ -564,6 +574,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\retNothing$ | $\qquad \text{return nothing}$ | | | $\vert$ | $\switch \exp \switchCases$ | $\qquad \text{switch}$ | | | $\vert$ | $\dcl$ | $\qquad \text{declaration}$ | +{ .booktable } **Parser states:** @@ -577,6 +588,7 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | $\parserTran$ | $::=$ | $\nxt$ | $\qquad \text{next state transition}$ | | | $\vert$ | $\slctTran \exp \pcases$ | $\qquad \text{select next state transition}$ | | $\state$ | $::=$ | $\stateDef \var \stmts \parserTran$ | $\qquad \text{states}$ | +{ .booktable } **Table properties:** @@ -587,14 +599,16 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\action$ | $\qquad \text{actions}$ | | | $\vert$ | $\entry \pmatch \action$ | $\qquad \text{entries}$ | | | $\vert$ | $\custom \bool \var \exp$ | $\qquad \text{custom property}$ | +{ .booktable } **Methods:** | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\extMethod$ | $::=$ | $\constructor \var \prmDef$ | $\qquad \text{constructors}$ | -| | $\vert$ | $\abstractMethod \baseTyp \var \typVar \prmDef$ | $\qquad \text{abstract methods}$ | -| | $\vert$ | $\methodDef \baseTyp \var \typVar \prmDef$ | $\qquad \text{methods}$ | +| $\extMethod$ | $::=$ | $\constructor \var {\prmDef \baseTyp}$ | $\qquad \text{constructors}$ | +| | $\vert$ | $\abstractMethod \baseTyp \var \typVar {\prmDef \baseTyp}$ | $\qquad \text{abstract methods}$ | +| | $\vert$ | $\methodDef \baseTyp \var \typVar {\prmDef \baseTyp}$ | $\qquad \text{methods}$ | +{ .booktable } **Declarations:** @@ -603,14 +617,14 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | $\dcl$ | $::=$ | $\constDcl \baseTyp \var \exp$ | $\qquad \text{constants}$ | | | $\vert$ | $\inst \baseTyp \args \var \stmts$ | $\qquad \text{instantiations (initialized)}$ | | | $\vert$ | $\instNoBlock \baseTyp \args \var$ | $\qquad \text{instantiations (uninitialized)}$ | -| | $\vert$ | $\parserDcl \var \typVars {\overline {\prmDef_1}} {\overline {\prmDef_2}} \dcls \states$ | $\qquad \text{parsers}$ | -| | $\vert$ | $\controlDcl \var \typVars {\overline {\prmDef_1}} {\overline {\prmDef_2}} \dcls \stmts$ | $\qquad \text{controls}$ | -| | $\vert$ | $\funcDcl \baseTyp \var \typVars \prmDefs \stmts$ | $\qquad \text{functions}$ | -| | $\vert$ | $\externFuncDcl \baseTyp \var \typVars \prmDefs$ | $\qquad \text{extern functions}$ | +| | $\vert$ | $\parserDcl \var \typVars {\overline { {\prmDef \baseTyp}}} {\overline {\VVal {\prmDef \baseTyp}}} \dcls \states$ | $\qquad \text{parsers}$ | +| | $\vert$ | $\controlDcl \var \typVars {\overline { {\prmDef \baseTyp}}} {\overline {\VVal {\prmDef \baseTyp}}} \dcls \stmts$ | $\qquad \text{controls}$ | +| | $\vert$ | $\funcDcl \baseTyp \var \typVars {\prmDefs \baseTyp} \stmts$ | $\qquad \text{functions}$ | +| | $\vert$ | $\externFuncDcl \baseTyp \var \typVars {\prmDefs \baseTyp}$ | $\qquad \text{extern functions}$ | | | $\vert$ | $\varDclInit \baseTyp \var \exp$ | $\qquad \text{local variables (initialized)}$ | | | $\vert$ | $\varDcl \baseTyp \var$ | $\qquad \text{local variables (uninitialized)}$ | | | $\vert$ | $\valSetDcl \baseTyp \exp \var$ | $\qquad \text{parser value sets}$ | -| | $\vert$ | $\actionDcl \var \prmDefs \stmts$ | $\qquad \text{actions}$ | +| | $\vert$ | $\actionDcl \var {\prmDefs \baseTyp} \stmts$ | $\qquad \text{actions}$ | | | $\vert$ | $\tableDcl \var \props$ | $\qquad \text{tables}$ | | | $\vert$ | $\headerDcl \typVar \fieldTyps$ | $\qquad \text{header types}$ | | | $\vert$ | $\headerUnionDcl \typVar \fieldTyps$ | $\qquad \text{header union types}$ | @@ -624,33 +638,38 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\typdefDcl \typVar \dcl$ | $\qquad \text{type definitions (declarations)}$ | | | $\vert$ | $\newtypeDcl \typVar \baseTyp$ | $\qquad \text{generative type definitions}$ | | | $\vert$ | $\newtypeDcl \typVar \dcl$ | $\qquad \text{generative type definitions (declarations)}$ | -| | $\vert$ | $\controlTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{control types}$ | -| | $\vert$ | $\parserTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{parser types}$ | -| | $\vert$ | $\packageTypDcl \typVar \typVars \prmDefs$ | $\qquad \text{package types}$ | +| | $\vert$ | $\controlTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{control types}$ | +| | $\vert$ | $\parserTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{parser types}$ | +| | $\vert$ | $\packageTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{package types}$ | +{ .booktable } **Programs:** | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\prog$ | $::=$ | $\dcls$ | $\qquad \text{programs}$ | +{ .booktable } ~ End P4Syntax - # Type Related Judgments { #sec-types-typing } -Types themselves are elements of a language and it is often needed to ensure the lack of specific errors in types, such a type is called _well-formed type_. -Additionally, it is sometimes required to check two types for equality. Petr4's type equality considers alpha equivalent[^alpha-equiv-wiki] types equal. +Three judgments are provided for types of P4 expressions: + +[alpha-equiv-wiki]: https://en.wikipedia.org/wiki/Lambda_calculus#Alpha_equivalence + +- [type well-formedness][#sec-type-well-formed]: ensures the lack of specific errors in types, that is, types are well-formed. +- [type equality][#sec-type-eq]: checks the [alpha equalency][alpha-equiv-wiki] of two types. +- [type unification][#sec-type-unify]: tries to unify two types by providing constraints of assignment of types to type variables. -[^alpha-equiv-wiki]: <> ## Type Well-Formed Judgment { #sec-type-well-formed } -This judgment checks if a type is well-formed. Note that this judgment is defined over the types defined in the IR and not the surface syntax. +This judgment checks if a type is well-formed. Note that this judgment is defined over the expression types and not P4's data types. It has the form $\typWellFormed \typ$ which states that the type $\typ$ -is well-formed under the environment $\env$, that is, the type is syntactically correct. +is well-formed under the type environment $\typEnv$ and extern environment $\externEnv$, that is, the type is syntactically correct. All typing rules first saturate all types, that is, it eliminates all type references in type @@ -669,52 +688,61 @@ The following base types are well-formed unconditionally since there is not any { \typWellFormed \boolTyp } \quad (\boolT) +\and + \inferrule { } { \typWellFormed \stringTyp } \quad (\stringT) +\and + \inferrule { } { \typWellFormed \integerTyp } \quad (\intT) +\and + \inferrule { } { \typWellFormed {\varBitTyp \width} } \quad (\varbitT) +\and + \inferrule { } { \typWellFormed \errTyp} \quad (\errT) +\and + \inferrule { } { \typWellFormed \voidTyp} \quad (\voidT) +\and + \inferrule { } { \typWellFormed \matchKindTyp} \quad (\matchKindT) -~ End InfRule - -``**DISCUSSION** -Petr4 doesn't check the length of a fixed-length integer, either signed or unsigned. However, P4 spec specifies that for signed integers the length must be more than 1 and for unsigned integers the length must be equal or more than zero.`` - -~ Begin InfRule +\and \inferrule - % { 1 < \width} % p4 spec has this - { } + { 1 < \width} % p4 spec has this + %% { } { \typWellFormed {\intWidthTyp \width} } \quad (\intWidthT) +\and + \inferrule - % { 0 \leq \width} % p4 spec has this - { } + { 0 \leq \width} % p4 spec has this + %% { } { \typWellFormed {\bitWidthTyp \width} } \quad (\bitWidthT) @@ -741,20 +769,20 @@ it checks if all the subtypes in the type $\typ$ can actually be inner types of ~ End InfRule -### Tuple Type { #sec-tuple-t } +### Tuple/List Type { #sec-tuple-t } -Each element of a tuple can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under +Each element of a tuple/list can have a distinct type so a tuple type is simply a list of types. Note that lists also have a tuple type. The rule $\tupleT$ states that under environment $\env$, a tuple type is well-formed if all its types are well-formed and it follows the nesting typing rules of P4. ~ Begin InfRule - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { \typWellFormed \typs \\ - % \forallcond \typ \typs \isValidNestedTyp {\tupleTyps \typs}} { \typWellFormed {\tupleTyps \typs} } - \quad (\tupleT) + \quad (\tupleT)} % \inferrule[List] % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ @@ -782,23 +810,21 @@ An enumeration type contains a number of constants of string type and its declar The rules below state that an enum type is well-formed if the underlying representation is well-formed, if it has one. -``**DISCREPANCY**`` -Petr4 doesn't allow for an enum to have default values for constants, however, P4 spec does. Here's an [example][enum-ex]. - -[enum-ex]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-enum-types - - ~ Begin InfRule - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { } { \typWellFormed \enumTypNoTypDef } - \quad (\enumOneT) + \quad (\enumOneT)} - \inferrule +\and + + \mprset {vskip=0.7ex} + {\inferrule { \typWellFormed \typ } { \typWellFormed \enumTypDef } - \quad (\enumTwoT) + \quad (\enumTwoT)} ~ End InfRule @@ -807,20 +833,19 @@ Petr4 doesn't allow for an enum to have default values for constants, however, P A record has zero or more fields, which each field has a name and a type. The rule $\recordT$ states that a record type is well-formed if all its fields have well-formed types, all fields have types that can be nested in a record, and fields have distinct names. -Note that headers, header unions, and struct also have a record type. +Note that headers, header unions, and struct also have the same type and their well-formedness is defined the same. -- $\noDup \names$ checks that there is no duplicate name in $\names$. +- $\noDup \names$ checks that there is no duplicate name in $\names$. Remember that fields are just names (strings). ~ Begin InfRule - \inferrule + + \mprset {vskip=0.7ex} + {\inferrule { \typWellFormed \typs \\ \isValidNestedTyp \recordTyps \\ \noDup \fields} - % 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \recordTypDef \\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} { \typWellFormed \recordTyps } - \quad (\recordT) + \quad (\recordT)} % \inferrule[HeaderUnion] % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ @@ -851,7 +876,7 @@ New type assigns a name to a type. So the $\newTypeT$ checks if the assignee typ \inferrule { \typWellFormed \typ } - { \typWellFormed {\newTypeTyp \typ \typVar} } + { \typWellFormed {\newTypeTyp \typVar \typ} } \quad (\newTypeT) ~ End InfRule @@ -862,88 +887,80 @@ An specialized type specifies the types of parameters in a generic type, the und The rule $\specializedExternT$ states that the specialization of an extern type is well-formed if the extern $\name$ exists in the environment $\env$ and the specialization specifies the type of all its type parameters. Similarly, the rule $\specializedRestT$ states that the specialization of a package/control/parser/function is well-formed if it specifies the type of all its type parameters. -- Looking up an extern in the environment (that is, $\lookupEnv \name$) returns its type parameters and methods. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. - - -- ```TODO: correct this explanation.```$\lookupExternEnv \name$ looks up a variable $\name$ in environment $\env$ and depending on what $\name$ represents returns what is assigned to the variable in the environments. In case of an extern, it returns the type parameters and methods of the extern. +- $\lookupExternEnv \name$ looks up a variable $\name$ in extern environment $\externEnv$ and it returns the type parameters and methods of the extern. Since the rule $\specializedExternT$ only cares about the parameters we do not care about the methods, thus, we don't assign a variable name to it and use an underscore instead of it. - $\getTypeParams \typ$ returns the type parameters from types that have type parameters including package, control, parser, and function. ~ Begin InfRule - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { \lookupExternEnv \name = ([\params], \_ ) \\ % 1 \leq i \leq n. \typWellFormed {\typ_i} \\ \typWellFormed \typs\\ |\typs| = |\params|} { \typWellFormed {\spcTyp {\externTyp \name} \typs} } - \quad (\specializedExternT) + \quad (\specializedExternT)} +\and - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { \getTypeParams \typ = \{\params\}\\ \typWellFormed {\typs} \\ |\params| = |\typs|} { \typWellFormed {\spcTyp \typ {\typs}} } - \quad (\specializedRestT) + \quad (\specializedRestT)} ~ End InfRule ### Package Type { #sec-package-t } A package type describes the signature of a package and it defines the type parameters and parameters of a package. It may also have wildcard parameters. -The rule $\packageT$ states that a package type is well-formed under the environment $\env$ extended with the package's type parameters if all its parameters are direction-less and their types are well-formed. +The rule $\packageT$ states that a package type is well-formed under the environment $\typEnv$ extended with the package's type parameters if all its parameters are direction-less and their types are well-formed. -- A parameter $\singleprm$ has direction $\dir$, type $\typ$, and name $\name$. - $\extendTypEnv \typVar$ extends the type environment $\typEnv$ with type variable $\typParam$. Note that the type inserted in the environment for a type variable is a type name. -- $\isDirectionless \dir$ checks that the direction $\dir$ is $\less$, that is, $\dir = \less$. +- $\isDirectionless \dir$ checks that the direction of parameter $\dir$ is $\less$ or not. ~ Begin InfRule - \inferrule - { \isDirectionless \dirs \\ - % 1 \leq i \leq n. \dir_i = \less \\ - \typWellFormedWithEnv {\extendTypEnv \typVars} \typs } - % 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i}} - { \typWellFormed {\packageTyp {\typParams} {\prms} {\wildcardParams}} } - \quad (\packageT) + \mprset {vskip=0.7ex} + {\inferrule + { \isDirectionless {\dir} \\ + \typWellFormedWithEnv {\extendTypsEnv \typVar} \typs } + { \typWellFormed {\packageTyp {\typParams} {\prms} {\wildcardParams}} } + \quad (\packageT)} ~ End InfRule -### Control Type { #sec-control-t } - -A control type is similar to a type signature of a function in that it defines the type parameters used in the control and its parameters, however, it does not have a return type. The rule $\controlT$ states that the control type is well-formed under the environment $\env$ extended with type variables $\typParams$ if all the types of its parameters are well-formed. +### Control and Parser Type { #sec-control-t } -Parsers also have a control type. +A control type is similar to a type signature of a function in that it defines the type parameters used in the control and its parameters, however, it does not have a return type. The rule $\controlT$ states that the control type is well-formed under the environment $\typEnv$ extended with type variables $\typParams$ if all the types of its parameters are well-formed. -``**DISCREPANCY** -P4 spec states that "The types parser, control, and package cannot be used as types of arguments for methods, parsers, controls, tables, actions. They can be used as types for the arguments passed to constructors." We could check this in the well-formedness of types or even when we're declaring a method, parser, control, table, or action, instead of when we're defining their type (make sure we're not checking it then).`` ([p4 spec ref][parser-type]) - -[parser-type]: https://p4.org/p4-spec/docs/P4-16-v1.2.0.html#sec-parser-control-types ~ Begin InfRule - \inferrule - {\typWellFormedWithEnv {\extendTypEnv \typParams} {\typs}} + \mprset {vskip=0.7ex} + {\inferrule + {\typWellFormedWithEnv {\extendTypsEnv \typParam} {\typs}} { \typWellFormed {\controlTyp {\typParams} {\prms} } } - \quad (\controlT) + \quad (\controlT)} - % \inferrule[Parser] - % { \prim \env = \insertTypVars {\typParam_1, \ldots, \typParam_m} \\ - % 1 \leq i \leq n. \typWellFormedWithEnv {\prim \env} {\typ_i}} - % { \typWellFormed {\parserTyp {\typParam_1, \ldots, \typParam_m} {\prm 1, \ldots, \prm n} } } +\and + + \mprset {vskip=0.7ex} + {\inferrule + {\typWellFormedWithEnv {\extendTypsEnv \typParam} {\typs}} + { \typWellFormed {\parserTyp {\typParams} {\prms} } } + \quad (\parserT)} ~ End InfRule ### Extern Type { #sec-extern-t } The rule $\externT$ states that an extern type is well-formed if it has no type parameter in the environment. -$\lookupEnv \name$ where $\name$ is an extern returns an externMethods type which includes a list of strings as +$\lookupExternEnv \name$ where $\name$ is an extern returns an externMethods type which includes a list of strings as type parameters which must be empty for it to be well-typed and a function type which doesn't care for function type. -``TODO: revise the definition of look up extern after breaking up env.`` - -```**DISCUSSION** -This seems way too simple and loose.``` ~ Begin InfRule @@ -956,17 +973,18 @@ This seems way too simple and loose.``` ### Function Type { #sec-func-t } -A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\env$, extended with function's type parameters. +A function type describes the return type of the function, its type parameters, and its parameters. The rule $\functionT$ states that the function type is well-formed if its return type is well-formed and the types of its parameters are well-formed under environment $\typEnv$, extended with function's type parameters. ~ Begin InfRule - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { \typWellFormed \typ \\ - \typWellFormedWithEnv {\extendTypEnv \typVars} \typs} + \typWellFormedWithEnv {\extendTypsEnv \typVar} \typs} % 1 \leq i \leq n. \typWellFormedWithEnv {\insertToEnvv {\overline {\typParam : \typNameTyp \typParam}}} {\typ_i} } % (x1,...,xn) {...} - { \typWellFormed {\funcTyp \typ {\typParams} {\prms}} } - \quad (\functionT) + { \typWellFormed {\funcType \kind {\typParams} {\prms} \typ} } + \quad (\functionT)} ~ End InfRule @@ -976,29 +994,31 @@ An action type defines data and control parameters and it is well-formed if the ~ Begin InfRule - \inferrule + \mprset {vskip=0.7ex} + {\inferrule { \typWellFormed {\typs} \\ \typWellFormed {\overline {\prim \typ}} \\ \isDirectionless \dirs \\ \isDirectionless {\overline {\prim \dir}}} { \typWellFormed {\actionTyp {\prms} {\prmss}} } - \quad (\actionT) + \quad (\actionT)} ~ End InfRule ### Constructor Type { #sec-constructor-t } -The rule $\constructorT$ states that a constructor type is well-formed if its return type $\typ$ is well formed and the types of its parameters are well-formed under the environment $\env$ extended with the constructor's type parameters. Note that \_ indicates the wildcard parameters. - +The rule $\constructorT$ states that a constructor type is well-formed if its return type $\typ$ is well formed and the types of its parameters are well-formed under the environment $\typEnv$ extended with the constructor's type parameters. Note that \_ indicates the wildcard parameters. + ~ Begin InfRule - \inferrule - { \typWellFormed {\typ_\ret} \\ + \mprset {vskip=0.7ex} + {\inferrule + { \typWellFormed {\typ} \\ % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ \typWellFormedWithEnv {\extendTypEnv \typVars} {\typs} \\ \isDirectionless {\dirs}} - { \typWellFormed {\constructorTyp \typParams \prms \wildcardParams {\typ_\ret}}} - \quad (\constructorT) + { \typWellFormed {\constructorTyp \typParams \prms \wildcardParams {\typ}}} + \quad (\constructorT)} ~ End InfRule @@ -1039,6 +1059,8 @@ the form $\typEqEnv {\overline {(\var, \prim \var)}} {\typ_1} {\typ_2} $ which s ## Type Unification { #sec-type-unify } +Type unification attempts to unify two expression types, that is, it attempts to come up with constraints that allow the two types to be equivalent. The constraints are just assignments of types to unknown type variables (given as $\typVars$). + - type unification for type produces by type checking, i.e., typed.type.t - both types are reduced first. for brevity we omit the reduction from rules. so type 1 and type 2 in rules are already reduced. @@ -1758,38 +1780,38 @@ P4 spec states during the cast between int and bit or int the compiler wou \quad (\rn{ArbitraryPrecisionIntToSignedInt}\rAE) \inferrule - { (\typEqEnv \emp {\prim \typ} {\newTypeTyp \name { \typ}})} - { \castenv \ {\newTypeTyp \name {\typ}} {\newTypeTyp \name {\prim \typ}}} + { (\typEqEnv \emp {\prim \typ} {\newTypeTyp \typVar { \typ}})} + { \castenv \ {\newTypeTyp \typVar {\typ}} {\newTypeTyp \typVar {\prim \typ}}} \quad (\rn{TypeDefs}\rAE\rSep\rn{1}) \inferrule - { (\typEqEnv \emp {\typ} {\newTypeTyp \name {\prim \typ}})} - { \castenv \ {\newTypeTyp \name {\typ}} {\newTypeTyp \name {\prim \typ}}} + { (\typEqEnv \emp {\typ} {\newTypeTyp \typVar {\prim \typ}})} + { \castenv \ {\newTypeTyp \typVar {\typ}} {\newTypeTyp \typVar {\prim \typ}}} \quad (\rn{TypeDefs}\rAE\rSep\rn{2}) \inferrule { \explCast {\typ} {\prim \typ}} - { \explCast {\newTypeTyp \name {\typ}} {\prim \typ}} + { \explCast {\newTypeTyp \typVar {\typ}} {\prim \typ}} \quad (\rn{TypeDefToType}\rSep\rn{Explicit}\rAE) \inferrule { \implCast {\typ} {\prim \typ}} - { \implCast {\newTypeTyp \name {\typ}} {\prim \typ}} + { \implCast {\newTypeTyp \typVar {\typ}} {\prim \typ}} \quad (\rn{TypeDefToType}\rSep\rn{Implicit}\rAE) \inferrule { \explCast {\typ} {\prim \typ}} - { \explCast {\typ} {\newTypeTyp \name {\prim \typ}}} + { \explCast {\typ} {\newTypeTyp \typVar {\prim \typ}}} \quad (\rn{TypeToTypeDef}\rSep\rn{Explicit}\rAE) \inferrule { \implCast {\typ} {\prim \typ}} - { \implCast {\typ} {\newTypeTyp \name {\prim \typ}}} + { \implCast {\typ} {\newTypeTyp \typVar {\prim \typ}}} \quad (\rn{TypeToTypeDef}\rSep\rn{Implicit}\rAE) \inferrule { \typEqEnv \emp {\typ} {\prim \typ}} - { \castenv \ {\enumTypDef} {\enumTyp {\prim \typ} {\prim \name} {\overline {\prim \name}}}} + { \castenv \ {\enumTypDef} {\enumTyp {\prim \typ} {\prim \field} {\overline {\prim \field}}}} \quad (\rn{Enums}\rAE) \inferrule @@ -1799,7 +1821,7 @@ P4 spec states during the cast between int and bit or int the compiler wou \inferrule { \typEqEnv \emp {\typ} {\prim \typ}} - { \castenv \ {\typ} {\enumTyp {\prim \typ} {\name} {\names}}} + { \castenv \ {\typ} {\enumTyp {\prim \typ} {\field} {\fields}}} \quad (\rn{TypeToEnumWithUndrlyingType}\rAE) \inferrule diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 550ee6d50..415d6e362 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -1,3 +1,7 @@ +\newcommand{\VVal}[1]{#1'} +%% \newcommand{\VVVal}[1]{#1''} + + %rule names: \newcommand{\rn}[1]{\TirName{#1}} \newcommand{\rSep}{\rn{-}} @@ -31,11 +35,12 @@ \newcommand*{\setT}{\rn{Set}\rT} \newcommand*{\enumTwoT}{\rn{SerializableEnum}\rT} \newcommand*{\recordT}{\rn{Record}\rT} -\newcommand*{\newTypeT}{\rn{NewType(typedef)}\rT} +\newcommand*{\newTypeT}{\rn{NewType}\rT} \newcommand*{\specializedExternT}{\rn{SpecializedType}\rSep\rn{ExternBase}\rT} \newcommand*{\specializedRestT}{\rn{SpecializedType}\rSep\rn{Rest}\rT} \newcommand*{\packageT}{\rn{Package}\rT} \newcommand*{\controlT}{\rn{Control}\rT} +\newcommand*{\parserT}{\rn{Parser}\rT} \newcommand*{\externT}{\rn{Extern}\rT} \newcommand*{\functionT}{\rn{Function}\rT} \newcommand*{\actionT}{\rn{Action}\rT} @@ -62,7 +67,7 @@ \newcommand*{\typeMemE}{\rn{TypeMember}\rE} \newcommand*{\errMemE}{\rn{ErrorMember}\rE} \newcommand*{\expMemE}{\rn{ExpressionMember}\rE} -\newcommand*{\ternaryE}{\rn{Ternary}\rE} +\newcommand*{\ternaryE}{\rn{Ternary}\rE} \newcommand*{\funcCallE}{\rn{FunctionCall}\rE\rSep\rn{1}} \newcommand*{\funcCallNoTypeArgE}{\rn{FunctionCall}\rE\rSep\rn{2}} \newcommand*{\instE}{\rn{Instantiation}\rE} @@ -146,6 +151,7 @@ \newcommand{\insertToEnv}[2]{\env[{#1} : {#2} ]} \newcommand{\insertToEnvv}[1]{\env[{#1}]} \newcommand{\extendTypEnv}[1]{\typEnv[{#1} \ \mathsf{var}]} +\newcommand{\extendTypsEnv}[1]{\typEnv[\overline{{#1} \ \mathsf{var}}]} \newcommand{\suchThat}[2]{{#1}\ . \ {#2}} \newcommand{\tr}{\mathsf{true}} \newcommand{\fl}{\mathsf{false}} @@ -246,8 +252,8 @@ %metavariables: -\newcommand{\prmDef}{\mathit{prm}} -\newcommand{\prmDefs}{\overline \prmDef} +\newcommand{\prmDef}[1]{\mathit{prm}_{#1}} +\newcommand{\prmDefs}[1]{\overline {\prmDef {#1}}} \newcommand{\constraint}{C} \newcommand{\optConstraint}{B} \newcommand{\nonoptConstraint}{N} @@ -264,6 +270,7 @@ \newcommand{\typs}{\overline \typ} \newcommand{\baseTyp}{\rho} \newcommand{\baseTyps}{\overline \baseTyp} +\newcommand{\typKind}{t} \newcommand{\ctxt}{c} \newcommand{\bool}{b} \newcommand{\str}{s} @@ -271,8 +278,8 @@ \newcommand{\val}{v} \newcommand{\bit}{b} \renewcommand{\int}{n} -\newcommand{\bitWidth}[2]{{#1}_{#2}} -\newcommand{\intWidth}[2]{{#1}_{#2}} +\newcommand{\bitWidth}[2]{{#2}\mathsf{b}{#1}} +\newcommand{\intWidth}[2]{{#2}\mathsf{w}{#1}} \newcommand{\name}{x} \newcommand{\var}{x} \newcommand{\typVar}{X} @@ -316,7 +323,7 @@ \newcommand{\argkvi}[1]{\var_{#1}=\exp_{#1}} \newcommand{\argkvs}{\overline \argkv} \newcommand{\argkvss}[2]{\argkvi {#1}, \ldots, \argkvi {#2}} -\newcommand{\missingarg}{\_\!\_\!\_\!\_} +\newcommand{\missingarg}{\mathsf{missing}} \newcommand{\names}{\overline \name} \newcommand{\methods}[2]{\overline {{#1}:{#2}}} @@ -335,7 +342,7 @@ \newcommand{\switch}[2]{\mathsf{switch}\ ({#1})\, \{{#2}\}} \newcommand{\lbl}{l} \newcommand{\actionCase}[1]{\lbl : \block {#1}} -\newcommand{\switchCase}{\mathit{switch}} +\newcommand{\switchCase}{\mathit{switch\_case}} \newcommand{\switchCases}{\overline \switchCase} \newcommand{\dirApp}[2]{{#1} \left({#2}\right)} \newcommand{\defLbl}{\mathsf{default}} @@ -344,7 +351,7 @@ \newcommand{\slctTran}[2]{({#1})\ \{{#2}\}} \newcommand{\expandCase}[2]{{#1} \ {#2}} \newcommand{\nxt}{\mathit{nxt}} -\newcommand{\dontcareMatch}{\_\!\_\!\_} +\newcommand{\dontcareMatch}{\mathsf{dont\_care}} \newcommand{\defMatch}{\mathsf{default}} \newcommand{\pmatch}{\mathit{mtch}} \newcommand{\pmatches}{\overline \pmatch} @@ -393,7 +400,7 @@ \newcommand{\varDcl}[2]{{#1}\, {#2}} %type. expression. name. \newcommand{\valSetDcl}[3]{{#1}\, {#3}:{#2}} -\newcommand{\actionDcl}[3]{\mathsf{action}\ {#1}\, (\prms)\, \{{#3}\}} +\newcommand{\actionDcl}[3]{\mathsf{action}\ {#1}\, ({#2})\, \{{#3}\}} \newcommand{\tableDcl}[2]{\mathsf{table}\ {#1}\, \{{#2}\}} \newcommand{\headerDcl}[2]{\mathsf{header}\ {#1}\, \{{#2}\}} \newcommand{\headerUnionDcl}[2]{\mathsf{header\_union}\ {#1}\, \{{#2}\}} @@ -405,9 +412,9 @@ \newcommand{\externObjDcl}[3]{\mathsf{extern}\ {#1}\, \langle{#2}\rangle\, \{{#3} \}} \newcommand{\newtypeDcl}[2]{{#1}={#2}} \newcommand{\typdefDcl}[2]{\mathsf{typedef}\ {#2}\, {#1}} -\newcommand{\controlTypDcl}[3]{\mathsf{ctrl}\ {#1}\, \langle{#2}\rangle\, ({#3})} -\newcommand{\parserTypDcl}[3]{\mathsf{prs}\ {#1}\, \langle{#2}\rangle\, ({#3})} -\newcommand{\packageTypDcl}[3]{\mathsf{pckg}\ {#1}\, \langle{#2}\rangle\, ({#3})} +\newcommand{\controlTypDcl}[3]{\mathsf{control}\ {#1}\, \langle{#2}\rangle\, ({#3})} +\newcommand{\parserTypDcl}[3]{\mathsf{parser}\ {#1}\, \langle{#2}\rangle\, ({#3})} +\newcommand{\packageTypDcl}[3]{\mathsf{package}\ {#1}\, \langle{#2}\rangle\, ({#3})} \newcommand{\prog}{\mathit{prog}} @@ -456,7 +463,7 @@ \newcommand{\sat}[1]{\mathit{saturate}({#1})_\typEnv} \newcommand{\trans}[2]{\mathit{translate}({#1})_{\env,{#2}}} \newcommand{\transMaybe}[1]{\mathit{optional\_translate}({#1})_{\env}} -\newcommand{\isValidNestedTyp}[1]{\mathit{is\_valid\_nested}({#1})_\env} +\newcommand{\isValidNestedTyp}[1]{\mathit{is\_valid\_nested}({#1})_\typEnv} %{#1} is outer, 2 is inner \newcommand{\noDup}[1]{\mathit{no\_duplicate}({#1})} \newcommand{\explicitCastOK}[2]{\explCast {#1} {#2}} @@ -530,9 +537,9 @@ \newcommand{\tupleTyps}[1]{\mathsf{tuple}\langle{#1}\rangle} \newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} \newcommand{\listTyps}[1]{\tupleTyps {#1}} -\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\typVar}\ \{\names\}} +\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\typVar}\ \{\fields\}} \newcommand{\enumTyp}[3]{\mathsf{enum}\ {#1}\ {#2}\ \{{#3}\}} -\newcommand{\enumTypNoTypDef}{\mathsf{enum} \ {\name}\ \{\names\}} +\newcommand{\enumTypNoTypDef}{\mathsf{enum} \ {\name}\ \{\fields\}} \newcommand{\enumTypNoTyp}[2]{\mathsf{enum} \ {#1}\ \{{#2}\}} \newcommand{\recordTypDef}{\recordTyp 1 n} \newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} From f0b0c05808c884ea88f163c43285e109c18a2dcd Mon Sep 17 00:00:00 2001 From: pataei Date: Wed, 5 Oct 2022 15:42:58 -0400 Subject: [PATCH 29/30] preping to break up type syntactic category --- docs/petr4spec/Petr4-spec.mdk | 160 +++++++++++++++++++--------------- docs/petr4spec/ops.tex | 49 +++++++---- lib/checker.ml | 2 + 3 files changed, 124 insertions(+), 87 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index f1fb20fff..8edaac6e5 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -392,7 +392,7 @@ function signature. judgment signature. environment signature. In the following we present P4 syntax. Note that we omitted annotations and meta-information since they are not required for type checking. Some notes about the syntax follows: - +- Type variables, denoted by $\typVar$, can also potentially be wildcards, denoted by \wildcard$. - Two types are provided. The first one is denoted by $\baseTyp$ which is the data types availabe in P4 language. The second one is denoted by $\typ$ and is the type generated by the type system which could be the result of a type declaration in a P4 program. - Parameters, denoted by $\prmDef \typKind$, are paremeterized by the type they have, that is, $\typKind$ represent a type where it can either be $\baseTyp$ or $\typ$. This is because they are used in different places and depending on where they are used they may have a different type. - For simplicity, we use the expanded format of parameter in most rules to have fine access to its direction and type. However, we often don't need its initializer so we omit that. Keep in mind that a parameter could or could not have an initializer. @@ -437,38 +437,6 @@ In the following we present P4 syntax. Note that we omitted annotations and meta { .booktable } -**Types of P4 expressions:** - -| | | | | -|~~~~:|:~~~~:|:~~~~|:~~~~| -| $\typ$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | -| | $\vert$ | $\errTyp$ | $\qquad \text{errors}$ | -| | $\vert$ | $\integerTyp$ | $\qquad \text{infinite-precision integers}$ | -| | $\vert$ | $\intWidthTyp \width$ | $\qquad \text{fixed-width signed integers}$ | -| | $\vert$ | $\bitWidthTyp \width$ | $\qquad \text{fixed-width unsigned integers}$ | -| | $\vert$ | $\varBitTyp \width$ | $\qquad \text{variable-width integers}$ | -| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | -| | $\vert$ | $\spcTyp \typ \typs$ | $\qquad \text{specialized type}$ | -| | $\vert$ | $\arrayTyp \typ \width$ | $\qquad \text{arrays}$ | -| | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples/lists}$ | -| | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | -| | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | -| | $\vert$ | $\recordTyps$ | $\qquad \text{records/headers/header unions/structs}$ | -| | $\vert$ | $\setTyp \typ$ | $\qquad \text{sets}$ | -| | $\vert$ | $\matchKindTyp$ | $\qquad \text{match kinds}$ | -| | $\vert$ | $\newTypeTyp \typVar \typ$ | $\qquad \text{reference}$ | -| | $\vert$ | $\enumTypDef$ | $\qquad \text{serializable enums}$ | -| | $\vert$ | $\enumTypNoTypDef$ | $\qquad \text{enums}$ | -| | $\vert$ | $\packageTyp \typParams {\prmDefs \typ} \wildcardParams$ | $\qquad \text{packages}$ | -| | $\vert$ | $\controlTyp \typParams {\prmDefs \typ}$ | $\qquad \text{controls}$ | -| | $\vert$ | $\parserTyp \typParams {\prmDefs \typ}$ | $\qquad \text{parsers}$ | -| | $\vert$ | $\externTyp \name$ | $\qquad \text{externs}$ | -| | $\vert$ | $\funcType \kind \typParams \params \typ$ | $\qquad \text{functions}$ | -| | $\vert$ | $\actionTyp {\overline { {\prmDef \typ}}} {\overline {\VVal {\prmDef \typ}}}$ | $\qquad \text{actions}$ | -| | $\vert$ | $\constructorTyp \typParams {\prmDefs \typ} \wildcardParams \typ$ | $\qquad \text{constructors}$ | -| | $\vert$ | $\tableTyp \name$ | $\qquad \text{tables}$ | -{ .booktable } - **Unary operations:** | | | | | @@ -663,10 +631,55 @@ Three judgments are provided for types of P4 expressions: - [type equality][#sec-type-eq]: checks the [alpha equalency][alpha-equiv-wiki] of two types. - [type unification][#sec-type-unify]: tries to unify two types by providing constraints of assignment of types to type variables. +``todo: type categories: +surface type +derived type +synthesized type`` +``todo: check what's the difference of base type and reftype in p4 spec`` +~ Begin P4Syntax +**Types produced by the type system:** + +| | | | | +|~~~~:|:~~~~:|:~~~~|:~~~~| +| $\typ$ | $::=$ | $\boolTyp$ | $\qquad \text{booleans}$ | +| | $\vert$ | $\errTyp$ | $\qquad \text{errors}$ | +| | $\vert$ | $\integerTyp$ | $\qquad \text{infinite-precision integers}$ | +| | $\vert$ | $\intWidthTyp \width$ | $\qquad \text{fixed-width signed integers}$ | +| | $\vert$ | $\bitWidthTyp \width$ | $\qquad \text{fixed-width unsigned integers}$ | +| | $\vert$ | $\varBitTyp \width$ | $\qquad \text{variable-width integers}$ | +| | $\vert$ | $\typVar$ | $\qquad \text{type variables}$ | +| | $\vert$ | $\spcTyp \typ \typs$ | $\qquad \text{specialized type}$ | +| | $\vert$ | $\arrayTyp \typ \width$ | $\qquad \text{arrays}$ | +| | $\vert$ | $\tupleTyps \typs$ | $\qquad \text{tuples/lists}$ | +| | $\vert$ | $\stringTyp$ | $\qquad \text{strings}$ | +| | $\vert$ | $\voidTyp$ | $\qquad \text{void}$ | +| | $\vert$ | $\recordTyps \field \typ$ | $\qquad \text{records}$ | +| | $\vert$ | $\headerTyps \field \typ$ | $\qquad \text{headers}$ | +| | $\vert$ | $\headerUnionTyps \field \typ$ | $\qquad \text{header unions}$ | +| | $\vert$ | $\structTyps \field \typ$ | $\qquad \text{structs}$ | +| | $\vert$ | $\setTyp \typ$ | $\qquad \text{sets}$ | +| | $\vert$ | $\matchKindTyp$ | $\qquad \text{match kinds}$ | +| | $\vert$ | $\newTypeTyp \typVar \typ$ | $\qquad \text{reference}$ | +| | $\vert$ | $\enumTypDef$ | $\qquad \text{serializable enums}$ | +| | $\vert$ | $\enumTypNoTypDef$ | $\qquad \text{enums}$ | +| | $\vert$ | $\packageTyp \typParams {\prmDefs \typ}$ | $\qquad \text{packages}$ | +| | $\vert$ | $\controlTyp \typParams {\prmDefs \typ}$ | $\qquad \text{controls}$ | +| | $\vert$ | $\parserTyp \typParams {\prmDefs \typ}$ | $\qquad \text{parsers}$ | +| | $\vert$ | $\externTyp \name$ | $\qquad \text{externs}$ | +| | $\vert$ | $\funcType \kind \typParams {\prmDefs \typ} \typ$ | $\qquad \text{functions}$ | +| | $\vert$ | $\actionTyp {\overline { {\prmDef \typ}}} {\overline {\VVal {\prmDef \typ}}}$ | $\qquad \text{actions}$ | +| | $\vert$ | $\constructorTyp \typParams {\prmDefs \typ} \typ$ | $\qquad \text{constructors}$ | +| | $\vert$ | $\tableTyp \name$ | $\qquad \text{tables}$ | +{ .booktable } + + +~ End P4Syntax ## Type Well-Formed Judgment { #sec-type-well-formed } +``todo: this must be defined on surface types.`` + This judgment checks if a type is well-formed. Note that this judgment is defined over the expression types and not P4's data types. It has the form $\typWellFormed \typ$ which states that the type $\typ$ is well-formed under the type environment $\typEnv$ and extern environment $\externEnv$, that is, the type is syntactically correct. @@ -842,29 +855,40 @@ Note that headers, header unions, and struct also have the same type and their w \mprset {vskip=0.7ex} {\inferrule { \typWellFormed \typs \\ - \isValidNestedTyp \recordTyps \\ + \isValidNestedTyp {\recordTyps \field \typ} \\ \noDup \fields} - { \typWellFormed \recordTyps } + { \typWellFormed {\recordTyps \field \typ} } \quad (\recordT)} - % \inferrule[HeaderUnion] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \headerUnionTyp {\typ_i} \\ - % % \noDup {\field_1, \ldots, \field_n}\\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \headerUnionTyp } +\and - % \inferrule[Struct] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \structTypDef {\typ_i} \\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \structTypDef } + \mprset {vskip=0.7ex} + {\inferrule + {\typWellFormed \typs \\ + \isValidNestedTyp {\headerUnionTyps \field \typ} \\\\ + \noDup \fields} + { \typWellFormed {\headerUnionTyps \field \typ} } + \quad (\headerUnionT)} - % \inferrule[Header] - % { 1 \leq i \leq n. \typWellFormed {\typ_i} \\ - % 1 \leq i \leq n. \isValidNestedTyp \headerTypDef {\typ_i} \\ - % 1 \leq i < j \leq n. \field_i \neq \field_j} - % { \typWellFormed \headerTypDef } +\and + + \mprset {vskip=0.7ex} + {\inferrule + {\typWellFormed \typs \\ + \isValidNestedTyp {\structTyps \field \typ} \\ + \noDup \fields} + { \typWellFormed {\structTyps \field \typ} } + \quad (\structT)} + +\and + + \mprset {vskip=0.7ex} + {\inferrule + {\typWellFormed \typs \\ + \isValidNestedTyp {\headerTyps \field \typ} \\ + \noDup \fields} + { \typWellFormed {\headerTyps \field \typ} } + \quad (\headerT)} ~ End InfRule @@ -927,7 +951,7 @@ The rule $\packageT$ states that a package type is well-formed under the environ {\inferrule { \isDirectionless {\dir} \\ \typWellFormedWithEnv {\extendTypsEnv \typVar} \typs } - { \typWellFormed {\packageTyp {\typParams} {\prms} {\wildcardParams}} } + { \typWellFormed {\packageTyp {\typParams} {\prms} } } \quad (\packageT)} ~ End InfRule @@ -1017,7 +1041,7 @@ The rule $\constructorT$ states that a constructor type is well-formed if its re % \prim \env = \insertTypVars {\param_1, \ldots, \param_n} \\ \typWellFormedWithEnv {\extendTypEnv \typVars} {\typs} \\ \isDirectionless {\dirs}} - { \typWellFormed {\constructorTyp \typParams \prms \wildcardParams {\typ}}} + { \typWellFormed {\constructorTyp \typParams \prms {\typ}}} \quad (\constructorT)} ~ End InfRule @@ -1447,7 +1471,7 @@ The rule $\recordE$ is similar to $\listE$ rule. \inferrule {\expenv {\exps} {\overline {\prim \exp}} {\typs} {\dirs}} - {\expenv {\records \exp} {\records {\prim \exp}} {\recordTyps} \less } + {\expenv {\records \exp} {\records {\prim \exp}} {\recordTyps \field \typ} \less } \quad (\recordE) ~ End InfRule @@ -1881,42 +1905,42 @@ P4 spec states during the cast between int and bit or int the compiler wou \inferrule {\explCast {\typs} {\overline {\prim \typ}}} - {\explCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + {\explCast {\recordTyps \field \typ} {\headerTyps \field {\prim \typ}}} \quad (\rn{RecordToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{1}) \inferrule - {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} - {\explCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + {\typEqEnv \emp {\recordTyps \field \typ} {\recordTyps \field {\prim \typ}}} + {\explCast {\recordTyps \field \typ} {\headerTyps \field {\prim \typ}}} \quad (\rn{RecordToHeader}\rSep\rn{Explicit}\rAE\rSep\rn{2}) \inferrule {\implCast {\typs} {\overline {\prim \typ}}} - {\implCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + {\implCast {\recordTyps \field \typ} {\headerTyps \field {\prim \typ}}} \quad (\rn{RecordToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{1}) \inferrule - {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} - {\implCast {\recordTyps} {\headerTyps \field {\prim \typ}}} + {\typEqEnv \emp {\recordTyps \field \typ} {\recordTyps \field {\prim \typ}}} + {\implCast {\recordTyps \field \typ} {\headerTyps \field {\prim \typ}}} \quad (\rn{RecordToHeader}\rSep\rn{Implicit}\rAE\rSep\rn{2}) \inferrule {\explCast {\typs} {\overline {\prim \typ}}} - {\explCast {\recordTyps } {\structTyps \field {\prim \typ}}} + {\explCast {\recordTyps \field \typ } {\structTyps \field {\prim \typ}}} \quad (\rn{RecordToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{1}) \inferrule - {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} - {\explCast {\recordTyps } {\structTyps \field {\prim \typ}}} + {\typEqEnv \emp {\recordTyps \field \typ} {\recordTyps \field {\prim \typ}}} + {\explCast {\recordTyps \field \typ } {\structTyps \field {\prim \typ}}} \quad (\rn{RecordToStruct}\rSep\rn{Explicit}\rAE\rSep\rn{2}) \inferrule {\implCast {\typs} {\overline {\prim \typ}}} - {\implCast {\recordTyps } {\structTyps \field {\prim \typ}}} + {\implCast {\recordTyps \field \typ } {\structTyps \field {\prim \typ}}} \quad (\rn{RecordToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{1}) \inferrule - {\typEqEnv \emp {\recordTyps} {\recordTypss \field {\prim \typ}}} - {\implCast {\recordTyps } {\structTyps \field {\prim \typ}}} + {\typEqEnv \emp {\recordTyps \field \typ} {\recordTyps \field {\prim \typ}}} + {\implCast {\recordTyps \field \typ } {\structTyps \field {\prim \typ}}} \quad (\rn{RecordToStruct}\rSep\rn{Implicit}\rAE\rSep\rn{2}) \inferrule @@ -2403,7 +2427,7 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. \mprset {vskip=0.5ex} { \inferrule { \lookupEnv \name = \overline {(\typ, \dir)} \\ - (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)}} + (\constructorTyp \typParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)}} { \resolveConstOver \name {\overline {\var = \exp}} \typParams \wildcardParams \prms \retTyp } \quad (blah) } @@ -2411,7 +2435,7 @@ For detailed rules of this judgment refer to Section [#sec-type-unify]. \mprset {vskip=0.5ex} { \inferrule { \lookupEnv \name = \overline {(\typ, \dir)} \\ - (\constructorTyp \typParams \wildcardParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)} \\ + (\constructorTyp \typParams \prms \retTyp, \dir) \in \overline {(\typ, \dir)} \\ |\removeOptionalPars \params| = |\argexps|} { \resolveConstOver \name \argexps \typParams \wildcardParams \prms \retTyp } \quad (blah) diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index 415d6e362..d2ec32b22 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -1,5 +1,5 @@ \newcommand{\VVal}[1]{#1'} -%% \newcommand{\VVVal}[1]{#1''} +\newcommand{\VVVal}[1]{#1''} %rule names: @@ -35,6 +35,9 @@ \newcommand*{\setT}{\rn{Set}\rT} \newcommand*{\enumTwoT}{\rn{SerializableEnum}\rT} \newcommand*{\recordT}{\rn{Record}\rT} +\newcommand*{\headerUnionT}{\rn{HeaderUnion}\rT} +\newcommand*{\headerT}{\rn{Header}\rT} +\newcommand*{\structT}{\rn{Struct}\rT} \newcommand*{\newTypeT}{\rn{NewType}\rT} \newcommand*{\specializedExternT}{\rn{SpecializedType}\rSep\rn{ExternBase}\rT} \newcommand*{\specializedRestT}{\rn{SpecializedType}\rSep\rn{Rest}\rT} @@ -278,11 +281,12 @@ \newcommand{\val}{v} \newcommand{\bit}{b} \renewcommand{\int}{n} -\newcommand{\bitWidth}[2]{{#2}\mathsf{b}{#1}} -\newcommand{\intWidth}[2]{{#2}\mathsf{w}{#1}} +\newcommand{\bitWidth}[2]{{#2}\mathsf{w}{#1}} +\newcommand{\intWidth}[2]{{#2}\mathsf{s}{#1}} \newcommand{\name}{x} \newcommand{\var}{x} \newcommand{\typVar}{X} +\newcommand{\typName}{x} \newcommand{\typVars}{\overline \typVar} %% \renewcommand{\array}{a} %% \renewcommand{\index}{i} @@ -308,6 +312,7 @@ \newcommand{\paris}[1]{\overline {\pari {#1}}} \newcommand{\pars}[2]{\pari {#1}, \ldots, \pari {#2}} % wildcard param for wild card type vars. +\newcommand{\wildcard}{\_\!\_} \newcommand{\wildcardParam}{W} \newcommand{\wildcardParams}{\overline \wildcardParam} \renewcommand{\arg}{\mathit{arg}} @@ -537,24 +542,26 @@ \newcommand{\tupleTyps}[1]{\mathsf{tuple}\langle{#1}\rangle} \newcommand{\listTyp}[2]{\tupleTyp {#1} {#2}} \newcommand{\listTyps}[1]{\tupleTyps {#1}} -\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\typVar}\ \{\fields\}} +\newcommand{\enumTypDef}{\mathsf{enum}\ {\typ}\ {\typName}\ \{\fields\}} \newcommand{\enumTyp}[3]{\mathsf{enum}\ {#1}\ {#2}\ \{{#3}\}} \newcommand{\enumTypNoTypDef}{\mathsf{enum} \ {\name}\ \{\fields\}} \newcommand{\enumTypNoTyp}[2]{\mathsf{enum} \ {#1}\ \{{#2}\}} \newcommand{\recordTypDef}{\recordTyp 1 n} -\newcommand{\recordTyp}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} -\newcommand{\recordTypp}[2]{\{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} -\newcommand{\recordTyps}{\{\overline {\field : \typ}\}} -\newcommand{\recordTypss}[2]{\{\overline {{#1} : {#2}}\}} -\newcommand{\headerUnionTyp}[2]{\recordTyp {#1} {#2}} -\newcommand{\headerUnionTyps}[2]{\recordTypss {#1} {#2}} -\newcommand{\headerTyp}[2]{\recordTyp {#1} {#2}} -\newcommand{\structTyp}[2]{\recordTyp {#1} {#2}} -\newcommand{\headerTyps}[2]{\recordTypss {#1} {#2}} -\newcommand{\headerTypp}[2]{\recordTypp {#1} {#2}} -\newcommand{\structTypp}[2]{\recordTypp {#1} {#2}} -\newcommand{\structTypDef}{\recordTypDef} -\newcommand{\structTyps}[2]{\recordTypss {#1} {#2}} +\newcommand{\recordTypStructureOpen}[2]{\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\recordTypStructureClose}[2]{\{\overline {{#1} : {#2}}\}} +\newcommand{\recordTyp}[2]{\mathsf{record} \{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} +\newcommand{\recordTypp}[2]{\mathsf{record} \{\prim {\field_{#1}}:\prim {\typ_{#1}};\ldots;\prim {\field_{#2}}:\prim {\typ_{#2}}\}} +%% \newcommand{\recordTyps}{\mathsf{record} \recordTypStructureClose \field \typ} +\newcommand{\recordTyps}[2]{\mathsf{record} \recordTypStructureClose {#1} {#2}} +\newcommand{\headerUnionTyp}[2]{\mathsf{header\_union} \recordTypStructureOpen {#1} {#2}} +\newcommand{\headerUnionTyps}[2]{\mathsf{header\_union} \recordTypStructureClose {#1} {#2}} +\newcommand{\headerTyp}[2]{\mathsf{header}\recordTypStructureOpen {#1} {#2}} +\newcommand{\structTyp}[2]{\mathsf{struct} \recordTypStructureOpen {#1} {#2}} +\newcommand{\headerTyps}[2]{\mathsf{header} \recordTypStructureClose {#1} {#2}} +%% \newcommand{\headerTypp}[2]{\mathsf{header} \recordTypp {#1} {#2}} +%% \newcommand{\structTypp}[2]{\mathsf{struct} \recordTypp {#1} {#2}} +\newcommand{\structTypDef}{\mathsf{struct} \recordTypStructureOpen 1 n} +\newcommand{\structTyps}[2]{\mathsf{struct} \recordTypStructureClose {#1} {#2}} %% \newcommand{\headerUnionTyp}{\mathit{header\_union}\{\field_1:\typ_1;\ldots;\field_n:\typ_n \}} %% \newcommand{\headerTypDef}{\headerTyp 1 n} %% \newcommand{\headerTyp}[2]{\mathit{header}\{\field_{#1}:\typ_{#1};\ldots;\field_{#2}:\typ_{#2}\}} @@ -568,12 +575,16 @@ %kind.type param. param. return type. \newcommand{\funcType}[4]{\mathsf{function}\ {#1}\ \langle{#2}\rangle ({#3})\rightarrow {#4}} % type params: list of name. wildcard param: list of name. params: list of type dir name. return: typed. -\newcommand{\constructorTyp}[4]{\mathsf{constructor}\langle{#1},{#2}\rangle\ ({#3}) \rightarrow {#4}} +%% second arg is wildcard which is omitted for now. +%% \newcommand{\constructorTyp}[4]{\mathsf{constructor}\langle{#1},{#2}\rangle\ ({#3}) \rightarrow {#4}} +\newcommand{\constructorTyp}[3]{\mathsf{constructor}\langle{#1},{#2}\rangle \rightarrow {#3}} \newcommand{\externTyp}[1]{\mathsf{extern} \ {#1}} \newcommand{\spcTyp}[2]{{#1}\langle{#2}\rangle} \newcommand{\parserTyp}[2]{\mathsf{parser}\langle{#1}\rangle({#2})} \newcommand{\controlTyp}[2]{\mathsf{control}\langle{#1}\rangle({#2})} -\newcommand{\packageTyp}[3]{\mathsf{package}\langle{#1}\rangle({#2},{#3})} +\newcommand{\packageTyp}[2]{\mathsf{package}\langle{#1}\rangle({#2})} +%% the third arg is wildcard which is omitted for now. +%% \newcommand{\packageTyp}[3]{\mathsf{package}\langle{#1}\rangle({#2},{#3})} \newcommand{\actionTyp}[2]{\mathsf{action}(\mathsf{data:}\ {#1},\mathsf{control:}\ {#2})} \newcommand{\tableTyp}[1]{\mathsf{table}\ {#1}} %% \newcommand{\typNameTyp}[1]{\mathsf{type\_name}\ {#1}} diff --git a/lib/checker.ml b/lib/checker.ml index 9b7ea119e..48b2609e4 100644 --- a/lib/checker.ml +++ b/lib/checker.ml @@ -662,6 +662,8 @@ and reduce_type : CheckerEnv.t -> Typed.Type.t -> Typed.Type.t = (* [type_equality env t1 t2] is true if and only if expression type t1 * is equivalent to expression type t2 under environment env. * Alpha equivalent types are equal. *) + +(* so type equality is solve type with cast set to false and an empty unknowns*) and solve_types ?(casts=true) (env: CheckerEnv.t) (equiv_vars: (string * string) list) From 73bfc0be1b3f08eb6dda92f62b2dde1d4c62518a Mon Sep 17 00:00:00 2001 From: pataei Date: Mon, 10 Oct 2022 11:41:54 -0400 Subject: [PATCH 30/30] applied pr comments --- docs/petr4spec/Petr4-spec.mdk | 48 ++++++++++++++++++----------------- docs/petr4spec/ops.tex | 21 ++++++++++----- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/docs/petr4spec/Petr4-spec.mdk b/docs/petr4spec/Petr4-spec.mdk index 8edaac6e5..16b02ded2 100644 --- a/docs/petr4spec/Petr4-spec.mdk +++ b/docs/petr4spec/Petr4-spec.mdk @@ -441,37 +441,37 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\unaryOp$ | $::=$ | $!$ | $\qquad \text{logical negation}$ | +| $\unaryOp$ | $::=$ | $\intoOp !$ | $\qquad \text{logical negation}$ | | | $\vert$ | $\bitComplement$ | $\qquad \text{bitwise complement}$ | -| | $\vert$ | $-$ | $\qquad \text{unary minus}$ | +| | $\vert$ | $\intoOp -$ | $\qquad \text{unary minus}$ | { .booktable } **Binary operations:** | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| -| $\binOp$ | $::=$ | $\&\&$ | $\qquad \text{logical and}$ | -| | $\vert$ | $\vert\vert$ | $\qquad \text{logical or}$ | -| | $\vert$ | $+$ | $\qquad \text{numerical addition}$ | -| | $\vert$ | $-$ | $\qquad \text{numerical subtraction}$ | -| | $\vert$ | $*$ | $\qquad \text{numerical multiplication}$ | -| | $\vert$ | $\div$ | $\qquad \text{numerical division}$ | -| | $\vert$ | $\mod$ | $\qquad \text{numerical modulo}$ | -| | $\vert$ | $==$ | $\qquad \text{equality check}$ | -| | $\vert$ | $!=$ | $\qquad \text{inequality check}$ | -| | $\vert$ | $\plusSat$ | $\qquad \text{saturating addition}$ | -| | $\vert$ | $\subSat$ | $\qquad \text{saturation subtraction}$ | -| | $\vert$ | $\bitAnd$ | $\qquad \text{bitwise and}$ | -| | $\vert$ | $\bitOr$ | $\qquad \text{bitwise or}$ | +| $\binOp$ | $::=$ | $\intoOp{\&\&}$ | $\qquad \text{logical and}$ | +| | $\vert$ | $\intoOp \logor $ | $\qquad \text{logical or}$ | +| | $\vert$ | $\intoOp +$ | $\qquad \text{numerical addition}$ | +| | $\vert$ | $\intoOp -$ | $\qquad \text{numerical subtraction}$ | +| | $\vert$ | $\intoOp *$ | $\qquad \text{numerical multiplication}$ | +| | $\vert$ | $\intoOp \div$ | $\qquad \text{numerical division}$ | +| | $\vert$ | $\intoOp \mod$ | $\qquad \text{numerical modulo}$ | +| | $\vert$ | $\intoOp{==}$ | $\qquad \text{equality check}$ | +| | $\vert$ | $\intoOp{!=}$ | $\qquad \text{inequality check}$ | +| | $\vert$ | $\intoOp \plusSat$ | $\qquad \text{saturating addition}$ | +| | $\vert$ | $\intoOp \subSat$ | $\qquad \text{saturation subtraction}$ | +| | $\vert$ | $\intoOp \bitAnd$ | $\qquad \text{bitwise and}$ | +| | $\vert$ | $\intoOp \bitOr$ | $\qquad \text{bitwise or}$ | | | $\vert$ | $\bitXor$ | $\qquad \text{bitwise xor}$ | | | $\vert$ | $\bitComplement$ | $\qquad \text{bitwise complement}$ | -| | $\vert$ | $\concat$ | $\qquad \text{bitwise concatenation}$ | +| | $\vert$ | $\intoOp \concat$ | $\qquad \text{bitwise concatenation}$ | | | $\vert$ | $\shiftL$ | $\qquad \text{shift left}$ | -| | $\vert$ | $\shiftR$ | $\qquad \text{shift right}$ | -| | $\vert$ | $<$ | $\qquad \text{less than}$ | -| | $\vert$ | $\leq$ | $\qquad \text{less than or equal}$ | -| | $\vert$ | $>$ | $\qquad \text{greater than}$ | -| | $\vert$ | $\geq$ | $\qquad \text{greater than or equal}$ | +| | $\vert$ | $ \shiftR$ | $\qquad \text{shift right}$ | +| | $\vert$ | $\intoOp <$ | $\qquad \text{less than}$ | +| | $\vert$ | $ \leq$ | $\qquad \text{less than or equal}$ | +| | $\vert$ | $\intoOp >$ | $\qquad \text{greater than}$ | +| | $\vert$ | $ \geq$ | $\qquad \text{greater than or equal}$ | { .booktable } **Arguments:** @@ -549,6 +549,8 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | | | | |~~~~:|:~~~~:|:~~~~|:~~~~| | $\nxt$ | $::=$ | $\str$ | $\qquad \text{next state}$ | +| | $\vert$ | $\accept$ | $\qquad \text{accept state}$| +| | $\vert$ | $\reject$ | $\qquad \text{reject state}$| | $\pmatch$ | $::=$ | $\defMatch$ | $\qquad \text{default match}$ | | | $\vert$ | $\dontcareMatch$ | $\qquad \text{don't care match}$ | | | $\vert$ | $\exp$ | $\qquad \text{expression match}$ | @@ -604,8 +606,8 @@ In the following we present P4 syntax. Note that we omitted annotations and meta | | $\vert$ | $\externObjDcl \var \typVars \extMethods$ | $\qquad \text{extern objects}$ | | | $\vert$ | $\typdefDcl \typVar \baseTyp$ | $\qquad \text{type definitions}$ | | | $\vert$ | $\typdefDcl \typVar \dcl$ | $\qquad \text{type definitions (declarations)}$ | -| | $\vert$ | $\newtypeDcl \typVar \baseTyp$ | $\qquad \text{generative type definitions}$ | -| | $\vert$ | $\newtypeDcl \typVar \dcl$ | $\qquad \text{generative type definitions (declarations)}$ | +| | $\vert$ | $\newtypeDcl \baseTyp \typVar$ | $\qquad \text{generative type definitions}$ | +| | $\vert$ | $\newtypeDcl \dcl \typVar$ | $\qquad \text{generative type definitions (declarations)}$ | | | $\vert$ | $\controlTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{control types}$ | | | $\vert$ | $\parserTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{parser types}$ | | | $\vert$ | $\packageTypDcl \typVar \typVars {\prmDefs \baseTyp}$ | $\qquad \text{package types}$ | diff --git a/docs/petr4spec/ops.tex b/docs/petr4spec/ops.tex index d2ec32b22..6dbcf3a14 100644 --- a/docs/petr4spec/ops.tex +++ b/docs/petr4spec/ops.tex @@ -233,10 +233,11 @@ \newcommand{\unaryOp}{\ominus} \newcommand{\binOp}{\oplus} \newcommand{\cast}[2]{({#1})\,{#2}} -\newcommand{\plusSat}{\vert+\vert} -\newcommand{\subSat}{\vert-\vert} +\newcommand{\plusSat}{|+|} +\newcommand{\subSat}{|-|} +\newcommand{\logor}{||} \newcommand{\bitAnd}{\&} -\newcommand{\bitOr}{\vert} +\newcommand{\bitOr}{|} \newcommand{\bitXor}{\hat{}} \newcommand{\bitComplement}{\sim\!} \renewcommand{\div}{/} @@ -254,6 +255,9 @@ \newcommand{\records}[1]{\{\overline {\field = {#1}} \}} +%operators: +\newcommand{\intoOp}[1]{\texttt{#1}} + %metavariables: \newcommand{\prmDef}[1]{\mathit{prm}_{#1}} \newcommand{\prmDefs}[1]{\overline {\prmDef {#1}}} @@ -356,7 +360,9 @@ \newcommand{\slctTran}[2]{({#1})\ \{{#2}\}} \newcommand{\expandCase}[2]{{#1} \ {#2}} \newcommand{\nxt}{\mathit{nxt}} -\newcommand{\dontcareMatch}{\mathsf{dont\_care}} +\newcommand{\accept}{\mathsf{accept}} +\newcommand{\reject}{\mathsf{reject}} +\newcommand{\dontcareMatch}{\mathsf{dontcare}} \newcommand{\defMatch}{\mathsf{default}} \newcommand{\pmatch}{\mathit{mtch}} \newcommand{\pmatches}{\overline \pmatch} @@ -413,9 +419,10 @@ \newcommand{\errDcl}[1]{\mathsf{error}\ \{ {#1} \}} \newcommand{\matchkindDcl}[1]{\mathsf{match\_kind}\ \{{#1}\}} \newcommand{\enumDcl}[2]{\mathsf{enum}\ {#1}\, \{{#2} \}} -\newcommand{\serEnumDcl}[4]{\mathsf{enum}\ {#1} \, {#2}\, \{\overline {{#3}:{#4}} \}} +\newcommand{\serEnumDcl}[4]{\mathsf{enum}\ {#1} \, {#2}\, \{\overline {{#3}={#4}} \}} \newcommand{\externObjDcl}[3]{\mathsf{extern}\ {#1}\, \langle{#2}\rangle\, \{{#3} \}} -\newcommand{\newtypeDcl}[2]{{#1}={#2}} +%type \rho \typename +\newcommand{\newtypeDcl}[2]{\mathsf{type} \ {#1}\ {#2}} \newcommand{\typdefDcl}[2]{\mathsf{typedef}\ {#2}\, {#1}} \newcommand{\controlTypDcl}[3]{\mathsf{control}\ {#1}\, \langle{#2}\rangle\, ({#3})} \newcommand{\parserTypDcl}[3]{\mathsf{parser}\ {#1}\, \langle{#2}\rangle\, ({#3})} @@ -525,7 +532,7 @@ \newcommand{\newtypKey}{\mathsf{newtype}} %types: -\newcommand{\dontcareTyp}{\mathsf{dont\_care}} +\newcommand{\dontcareTyp}{\mathsf{dontcare}} \newcommand{\bitWidthTyp}[1]{\mathsf{bit}\langle{#1}\rangle} \newcommand{\intWidthTyp}[1]{\mathsf{int}\langle{#1}\rangle} \newcommand{\boolTyp}{\mathsf{bool}}

?eN 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 diff --git a/docs/petr4spec/figs/p4prg.png b/docs/petr4spec/figs/p4prg.png deleted file mode 100644 index 5032bb61540fe558a0dc0e1b3ada6a9a44a29fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152857 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 diff --git a/docs/petr4spec/figs/p4transition.png b/docs/petr4spec/figs/p4transition.png deleted file mode 100644 index 2270fe9c88789bf2e6b0e96c48763d67f0b56de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89087 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%0DmR-u@U)^La{#-s?Bc<&<$Xz<`yp4Xd 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 diff --git a/docs/petr4spec/figs/packetfilter.png b/docs/petr4spec/figs/packetfilter.png deleted file mode 100644 index abcdc65bf7b5a281130e753ed25752a887dcedcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30888 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