• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright © 2024 Imagination Technologies Ltd.
2# SPDX-License-Identifier: MIT
3
4from mako.template import Template, exceptions
5from pco_isa import *
6
7template = """/*
8 * Copyright © 2024 Imagination Technologies Ltd.
9 *
10 * SPDX-License-Identifier: MIT
11 */
12
13#ifndef PCO_ISA_H
14#define PCO_ISA_H
15
16/**
17 * \\file pco_isa.h
18 *
19 * \\brief PCO ISA definitions.
20 */
21
22#include "pco_common.h"
23#include "util/macros.h"
24
25#include <stdbool.h>
26
27% for _bit_set_name, bit_set in bit_sets.items():
28/** ${_bit_set_name} */
29enum ${bit_set.name}_field {
30   % for field in bit_set.fields.values():
31   ${field.cname},
32   % endfor
33};
34
35static unsigned ${bit_set.name}_bytes(enum ${bit_set.name}_variant variant)
36{
37   switch (variant) {
38   case ${bit_set.name.upper()}_NONE: return 0;
39   % for variant in bit_set.variants:
40   case ${variant.cname}: return ${variant.bytes};
41   % endfor
42   default: break;
43   }
44
45   unreachable();
46}
47
48static unsigned ${bit_set.name}_encode_field(uint8_t *bin, enum ${bit_set.name}_field field, uint64_t val)
49{
50   uint64_t enc_val;
51
52   switch (field) {
53   % for field in bit_set.fields.values():
54   case ${field.cname}:
55      % if field.field_type.check is not None:
56      assert(${field.field_type.check.format('val')});
57      % endif
58      % if field.reserved is not None:
59      assert(val == ${field.reserved});
60      % endif
61      enc_val = ${field.field_type.encode.format('val') if field.field_type.encode is not None else 'val'};
62      assert(${field.validate.format('enc_val')});
63         % for encoding in field.encoding:
64      ${encoding.clear.format('bin')};
65      ${encoding.set.format('bin', 'enc_val')};
66         % endfor
67      return ${field.encoded_bits};
68
69   % endfor
70   default:
71      break;
72   }
73
74   unreachable();
75}
76
77   % for bit_struct in bit_set.bit_structs.values():
78      % if len(bit_struct.struct_fields) > 0:
79struct ${bit_struct.name} {
80         % for struct_field in bit_struct.struct_fields.values():
81   ${struct_field.type.name} ${struct_field.field} : ${struct_field.bits};
82         % endfor
83};
84      % endif
85
86   % if len(bit_struct.struct_fields) > 0:
87#define ${bit_struct.name}_encode(bin, ...) _${bit_struct.name}_encode(bin, (const struct ${bit_struct.name}){0, ##__VA_ARGS__})
88static unsigned _${bit_struct.name}_encode(uint8_t *bin, const struct ${bit_struct.name} s)
89   % else:
90static unsigned ${bit_struct.name}_encode(uint8_t *bin)
91   % endif
92{
93   unsigned bits_encoded = 0;
94
95      % for encode_field in bit_struct.encode_fields:
96   bits_encoded += ${bit_set.name}_encode_field(bin, ${encode_field.name}, ${encode_field.value});
97      % endfor
98
99   assert(!(bits_encoded % 8));
100   return bits_encoded / 8;
101}
102
103   % endfor
104% endfor
105#endif /* PCO_ISA_H */"""
106
107def main():
108   try:
109      print(Template(template).render(bit_sets=bit_sets))
110   except:
111       raise Exception(exceptions.text_error_template().render())
112
113if __name__ == '__main__':
114   main()
115