xref: /aosp_15_r20/external/emboss/testdata/virtual_field.emb (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid Rees# Copyright 2019 Google LLC
2*99e0aae7SDavid Rees#
3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License");
4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License.
5*99e0aae7SDavid Rees# You may obtain a copy of the License at
6*99e0aae7SDavid Rees#
7*99e0aae7SDavid Rees#     https://www.apache.org/licenses/LICENSE-2.0
8*99e0aae7SDavid Rees#
9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software
10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS,
11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and
13*99e0aae7SDavid Rees# limitations under the License.
14*99e0aae7SDavid Rees
15*99e0aae7SDavid Rees-- Tests for virtual fields:
16*99e0aae7SDavid Rees--
17*99e0aae7SDavid Rees-- *   `let` constructs
18*99e0aae7SDavid Rees-- *   TODO(bolms@): `transform` annotations
19*99e0aae7SDavid Rees-- *   TODO(bolms@): `read` and `write` annotations
20*99e0aae7SDavid Rees
21*99e0aae7SDavid Rees[$default byte_order: "LittleEndian"]
22*99e0aae7SDavid Rees[(cpp) namespace: "emboss::test"]
23*99e0aae7SDavid Rees
24*99e0aae7SDavid Rees
25*99e0aae7SDavid Reesstruct StructureWithConstants:
26*99e0aae7SDavid Rees  let ten = 10
27*99e0aae7SDavid Rees  let twenty = 20
28*99e0aae7SDavid Rees  let four_billion = 4_000_000_000
29*99e0aae7SDavid Rees  let ten_billion = 10_000_000_000
30*99e0aae7SDavid Rees  let minus_ten_billion = -10_000_000_000
31*99e0aae7SDavid Rees  0 [+4]  UInt  value
32*99e0aae7SDavid Rees  let alias_of_value = value
33*99e0aae7SDavid Rees  let alias_of_alias_of_value = alias_of_value
34*99e0aae7SDavid Rees  let alias_of_ten = ten
35*99e0aae7SDavid Rees  let alias_of_alias_of_ten = alias_of_ten
36*99e0aae7SDavid Rees
37*99e0aae7SDavid Rees
38*99e0aae7SDavid Reesstruct StructureWithComputedValues:
39*99e0aae7SDavid Rees  0 [+4]  UInt  value
40*99e0aae7SDavid Rees  let doubled  = value * 2
41*99e0aae7SDavid Rees  let plus_ten = value + 10
42*99e0aae7SDavid Rees  let signed_doubled  = value2 * 2
43*99e0aae7SDavid Rees  let signed_plus_ten = value2 + 10
44*99e0aae7SDavid Rees  let product = value * value2
45*99e0aae7SDavid Rees  4 [+4]  Int  value2
46*99e0aae7SDavid Rees
47*99e0aae7SDavid Rees
48*99e0aae7SDavid Reesstruct StructureWithConditionalValue:
49*99e0aae7SDavid Rees  0 [+4]  UInt  x
50*99e0aae7SDavid Rees  if x < 0x8000_0000:
51*99e0aae7SDavid Rees    let two_x = x * 2
52*99e0aae7SDavid Rees  let x_plus_one = x + 1
53*99e0aae7SDavid Rees
54*99e0aae7SDavid Rees
55*99e0aae7SDavid Reesstruct StructureWithValueInCondition:
56*99e0aae7SDavid Rees  let two_x = x * 2
57*99e0aae7SDavid Rees  0 [+4]    UInt  x
58*99e0aae7SDavid Rees  if two_x < 100:
59*99e0aae7SDavid Rees    4 [+4]  UInt  if_two_x_lt_100
60*99e0aae7SDavid Rees
61*99e0aae7SDavid Rees
62*99e0aae7SDavid Reesstruct StructureWithValuesInLocation:
63*99e0aae7SDavid Rees  let two_x = x * 2
64*99e0aae7SDavid Rees  0     [+4]      UInt     x
65*99e0aae7SDavid Rees  two_x [+4]      UInt     offset_two_x
66*99e0aae7SDavid Rees  4     [+two_x]  UInt:32  size_two_x
67*99e0aae7SDavid Rees
68*99e0aae7SDavid Rees
69*99e0aae7SDavid Reesstruct StructureWithBoolValue:
70*99e0aae7SDavid Rees  let x_is_ten = x == 10
71*99e0aae7SDavid Rees  0 [+4]  UInt  x
72*99e0aae7SDavid Rees
73*99e0aae7SDavid Rees
74*99e0aae7SDavid Reesstruct StructureWithEnumValue:
75*99e0aae7SDavid Rees  enum Category:
76*99e0aae7SDavid Rees    SMALL = 1
77*99e0aae7SDavid Rees    LARGE = 2
78*99e0aae7SDavid Rees  let x_size = x < 100 ? Category.SMALL : Category.LARGE
79*99e0aae7SDavid Rees  0 [+4]  UInt  x
80*99e0aae7SDavid Rees
81*99e0aae7SDavid Rees
82*99e0aae7SDavid Reesstruct StructureWithBitsWithValue:
83*99e0aae7SDavid Rees  0 [+4]  BitsWithValue  b
84*99e0aae7SDavid Rees  let alias_of_b_sum = b.sum
85*99e0aae7SDavid Rees  let alias_of_b_a = b.a
86*99e0aae7SDavid Rees
87*99e0aae7SDavid Rees
88*99e0aae7SDavid Reesbits BitsWithValue:
89*99e0aae7SDavid Rees  0  [+16]  UInt  a
90*99e0aae7SDavid Rees  16 [+16]  UInt  b
91*99e0aae7SDavid Rees  let sum = a + b
92*99e0aae7SDavid Rees
93*99e0aae7SDavid Rees
94*99e0aae7SDavid Reesstruct StructureUsingForeignConstants:
95*99e0aae7SDavid Rees  StructureWithConstants.ten [+4]  UInt  x
96*99e0aae7SDavid Rees  let one_hundred = StructureWithConstants.twenty * 5
97*99e0aae7SDavid Rees
98*99e0aae7SDavid Rees
99*99e0aae7SDavid Reesstruct SubfieldOfAlias:
100*99e0aae7SDavid Rees  0 [+4]    struct  header:
101*99e0aae7SDavid Rees    0 [+2]  UInt    size
102*99e0aae7SDavid Rees    2 [+2]  UInt    message_id
103*99e0aae7SDavid Rees  let h = header
104*99e0aae7SDavid Rees  let size = h.size
105*99e0aae7SDavid Rees
106*99e0aae7SDavid Rees
107*99e0aae7SDavid Reesstruct RestrictedAlias:
108*99e0aae7SDavid Rees  0 [+4]  BitsWithValue  a_b
109*99e0aae7SDavid Rees  4 [+1]  UInt  alias_switch
110*99e0aae7SDavid Rees  if alias_switch > 10:
111*99e0aae7SDavid Rees    let a_b_alias = a_b
112*99e0aae7SDavid Rees
113*99e0aae7SDavid Rees
114*99e0aae7SDavid Reesstruct HasField:
115*99e0aae7SDavid Rees  0 [+1]  UInt  z
116*99e0aae7SDavid Rees  if $present(x.y):
117*99e0aae7SDavid Rees    let y = x.y
118*99e0aae7SDavid Rees  if z > 10:
119*99e0aae7SDavid Rees    1 [+2]  struct  x:
120*99e0aae7SDavid Rees      0 [+1]  UInt  v
121*99e0aae7SDavid Rees      if v > 10:
122*99e0aae7SDavid Rees        1 [+1]  UInt  y
123*99e0aae7SDavid Rees  if $present(x):
124*99e0aae7SDavid Rees    let x_has_y = $present(x.y)
125*99e0aae7SDavid Rees
126*99e0aae7SDavid Rees
127*99e0aae7SDavid Reesstruct VirtualUnconditionallyUsesConditional:
128*99e0aae7SDavid Rees  0 [+1]  UInt  x
129*99e0aae7SDavid Rees  if x == 0:
130*99e0aae7SDavid Rees    1 [+1]  UInt  xc
131*99e0aae7SDavid Rees
132*99e0aae7SDavid Rees  let x_nor_xc = x == 0 && xc == 0
133*99e0aae7SDavid Rees
134*99e0aae7SDavid Rees
135*99e0aae7SDavid Reesstruct UsesSize:
136*99e0aae7SDavid Rees  0 [+1]  bits  r:
137*99e0aae7SDavid Rees    0 [+8]  UInt  q
138*99e0aae7SDavid Rees    let q_plus_bit_size = q + $size_in_bits
139*99e0aae7SDavid Rees  let r_q_plus_byte_size = r.q + $size_in_bytes
140*99e0aae7SDavid Rees
141*99e0aae7SDavid Rees
142*99e0aae7SDavid Reesstruct UsesExternalSize:
143*99e0aae7SDavid Rees  0                [+4]                                      StructureWithConstants  x
144*99e0aae7SDavid Rees  x.$size_in_bytes [+StructureWithConstants.$size_in_bytes]  StructureWithConstants  y
145*99e0aae7SDavid Rees
146*99e0aae7SDavid Rees
147*99e0aae7SDavid Reesstruct ImplicitWriteBack:
148*99e0aae7SDavid Rees  0 [+1]  UInt  x
149*99e0aae7SDavid Rees  let x_plus_ten = x + 10
150*99e0aae7SDavid Rees  let ten_plus_x = 10 + x
151*99e0aae7SDavid Rees  let x_minus_ten = x - 10
152*99e0aae7SDavid Rees  let ten_minus_x = 10 - x
153*99e0aae7SDavid Rees  let ten_minus_x_plus_ten = (10 - x) + 10
154