1 # The MIT License (MIT)
3 # Copyright (c) 2015 Philippe Proulx <pproulx@efficios.com>
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28 class ByteOrder(enum
.Enum
):
34 class Encoding(enum
.Enum
):
51 raise NotImplementedError()
54 class PropertyMapping
:
55 def __init__(self
, object, prop
):
64 def object(self
, value
):
72 def prop(self
, value
):
78 self
.set_default_size()
79 self
.set_default_align()
80 self
.set_default_signed()
81 self
.set_default_byte_order()
82 self
.set_default_base()
83 self
.set_default_encoding()
84 self
.set_default_property_mappings()
86 def set_default_size(self
):
89 def set_default_align(self
):
92 def set_default_signed(self
):
95 def set_default_byte_order(self
):
96 self
._byte
_order
= None
98 def set_default_base(self
):
101 def set_default_encoding(self
):
102 self
._encoding
= Encoding
.NONE
104 def set_default_property_mappings(self
):
105 self
._property
_mappings
= []
112 def signed(self
, value
):
116 def byte_order(self
):
117 return self
._byte
_order
120 def byte_order(self
, value
):
121 self
._byte
_order
= value
128 def base(self
, value
):
133 return self
._encoding
136 def encoding(self
, value
):
137 self
._encoding
= value
141 if self
._align
is None:
142 if self
._size
is None:
145 if self
._size
% 8 == 0:
153 def align(self
, value
):
161 def size(self
, value
):
165 def property_mappings(self
):
166 return self
._property
_mappings
169 def is_dynamic(self
):
173 class FloatingPoint(Type
):
175 self
.set_default_exp_size()
176 self
.set_default_mant_size()
177 self
.set_default_align()
178 self
.set_default_byte_order()
180 def set_default_exp_size(self
):
181 self
._exp
_size
= None
183 def set_default_mant_size(self
):
184 self
._mant
_size
= None
186 def set_default_align(self
):
189 def set_default_byte_order(self
):
190 self
._byte
_order
= None
194 return self
._exp
_size
197 def exp_size(self
, value
):
198 self
._exp
_size
= value
202 return self
._mant
_size
205 def mant_size(self
, value
):
206 self
._mant
_size
= value
210 if self
._exp
_size
is None or self
._mant
_size
is None:
213 return self
._exp
_size
+ self
._mant
_size
216 def byte_order(self
):
217 return self
._byte
_order
220 def byte_order(self
, value
):
221 self
._byte
_order
= value
228 def align(self
, value
):
232 def is_dynamic(self
):
238 self
.set_default_value_type()
239 self
.set_default_members()
241 def set_default_value_type(self
):
242 self
._value
_type
= None
244 def set_default_members(self
):
245 self
._members
= collections
.OrderedDict()
249 return self
._value
_type
.align
253 return self
._value
_type
.size
256 def value_type(self
):
257 return self
._value
_type
260 def value_type(self
, value
):
261 self
._value
_type
= value
268 def last_value(self
):
269 if not self
._members
:
272 return list(self
._members
.values())[-1][1]
274 def value_of(self
, label
):
275 return self
._members
[label
]
277 def label_of(self
, value
):
278 for label
, vrange
in self
._members
.items():
279 if value
>= vrange
[0] and value
<= vrange
[1]:
282 def __getitem__(self
, key
):
284 return self
.value_of(key
)
285 elif type(key
) is int:
286 return self
.label_of(key
)
288 raise TypeError('wrong subscript type')
291 def is_dynamic(self
):
297 self
.set_default_encoding()
299 def set_default_encoding(self
):
300 self
._encoding
= Encoding
.UTF8
308 return self
._encoding
311 def encoding(self
, value
):
312 self
._encoding
= value
315 def is_dynamic(self
):
321 self
.set_default_element_type()
322 self
.set_default_length()
324 def set_default_element_type(self
):
325 self
._default
_element
_type
= None
327 def set_default_length(self
):
328 self
._default
_length
= None
332 return self
._element
_type
.align
335 def element_type(self
):
336 return self
._element
_type
339 def element_type(self
, value
):
340 self
._element
_type
= value
347 def length(self
, value
):
351 def is_variable_length(self
):
352 return type(self
._length
) is not int
355 def is_dynamic(self
):
356 if self
.is_variable_length
:
359 return self
.element_type
.is_dynamic
364 self
.set_default_min_align()
365 self
.set_default_fields()
367 def set_default_min_align(self
):
370 def set_default_fields(self
):
371 self
._fields
= collections
.OrderedDict()
375 return self
._min
_align
378 def min_align(self
, value
):
379 self
._min
_align
= value
383 align
= self
.min_align
385 for field
in self
.fields
.values():
386 if field
.align
is None:
389 if field
.align
> align
:
395 def is_dynamic(self
):
396 for field
in self
.fields
.values():
406 def __getitem__(self
, key
):
407 return self
.fields
[key
]
412 self
.set_default_tag()
413 self
.set_default_types()
415 def set_default_tag(self
):
418 def set_default_types(self
):
419 self
._types
= collections
.OrderedDict()
423 single_type
= self
.get_single_type()
425 if single_type
is not None:
426 return single_type
.align
428 # if all the possible types have the same alignment, then
429 # there's only one possible alignment
432 for t
in self
.types
.values():
447 single_type
= self
.get_single_type()
449 if single_type
is not None:
450 return single_type
.size
457 def tag(self
, value
):
464 def __getitem__(self
, key
):
465 return self
.types
[key
]
467 def get_single_type(self
):
468 if len(self
.members
) == 1:
469 return list(self
.members
.values())[0]
472 def is_dynamic(self
):
473 single_type
= self
.get_single_type()
475 if single_type
is not None:
476 return single_type
.is_dynamic
483 self
._byte
_order
= None
484 self
._packet
_header
_type
= None
492 def uuid(self
, value
):
496 def byte_order(self
):
497 return self
._byte
_order
500 def byte_order(self
, value
):
501 self
._byte
_order
= value
504 def packet_header_type(self
):
505 return self
._packet
_header
_type
507 @packet_header_type.setter
508 def packet_header_type(self
, value
):
509 self
._packet
_header
_type
= value
512 class Env(collections
.OrderedDict
):
518 self
.set_default_name()
519 self
.set_default_uuid()
520 self
.set_default_description()
521 self
.set_default_freq()
522 self
.set_default_error_cycles()
523 self
.set_default_offset_seconds()
524 self
.set_default_offset_cycles()
525 self
.set_default_absolute()
526 self
.set_default_return_ctype()
528 def set_default_name(self
):
531 def set_default_uuid(self
):
534 def set_default_description(self
):
535 self
._description
= None
537 def set_default_freq(self
):
538 self
._freq
= 1000000000
540 def set_default_error_cycles(self
):
541 self
._error
_cycles
= 0
543 def set_default_offset_seconds(self
):
544 self
._offset
_seconds
= 0
546 def set_default_offset_cycles(self
):
547 self
._offset
_cycles
= 0
549 def set_default_absolute(self
):
550 self
._absolute
= False
552 def set_default_return_ctype(self
):
553 self
._return
_ctype
= 'uint32_t'
560 def name(self
, value
):
568 def uuid(self
, value
):
572 def description(self
):
573 return self
._description
576 def description(self
, value
):
577 self
._description
= value
580 def error_cycles(self
):
581 return self
._error
_cycles
584 def error_cycles(self
, value
):
585 self
._error
_cycles
= value
592 def freq(self
, value
):
596 def offset_seconds(self
):
597 return self
._offset
_seconds
599 @offset_seconds.setter
600 def offset_seconds(self
, value
):
601 self
._offset
_seconds
= value
604 def offset_cycles(self
):
605 return self
._offset
_cycles
607 @offset_cycles.setter
608 def offset_cycles(self
, value
):
609 self
._offset
_cycles
= value
613 return self
._absolute
616 def absolute(self
, value
):
617 self
._absolute
= value
620 def return_ctype(self
):
621 return self
._return
_ctype
624 def return_ctype(self
, value
):
625 self
._return
_ctype
= value
628 LogLevel
= collections
.namedtuple('LogLevel', ['name', 'value'])
635 self
._log
_level
= None
636 self
._context
_type
= None
637 self
._payload
_type
= None
652 def name(self
, value
):
657 return self
._log
_level
660 def log_level(self
, value
):
661 self
._log
_level
= value
664 def context_type(self
):
665 return self
._context
_type
668 def context_type(self
, value
):
669 self
._context
_type
= value
672 def payload_type(self
):
673 return self
._payload
_type
676 def payload_type(self
, value
):
677 self
._payload
_type
= value
679 def __getitem__(self
, key
):
680 if type(self
.payload_type
) in [Struct
, Variant
]:
681 return self
.payload_type
[key
]
683 raise TypeError('{} is not subscriptable')
690 self
._packet
_context
_type
= None
691 self
._event
_header
_type
= None
692 self
._event
_context
_type
= None
693 self
._events
= collections
.OrderedDict()
700 def name(self
, value
):
712 def packet_context_type(self
):
713 return self
._packet
_context
_type
715 @packet_context_type.setter
716 def packet_context_type(self
, value
):
717 self
._packet
_context
_type
= value
720 def event_header_type(self
):
721 return self
._event
_header
_type
723 @event_header_type.setter
724 def event_header_type(self
, value
):
725 self
._event
_header
_type
= value
728 def event_context_type(self
):
729 return self
._event
_context
_type
731 @event_context_type.setter
732 def event_context_type(self
, value
):
733 self
._event
_context
_type
= value
743 self
._env
= collections
.OrderedDict()
744 self
._clocks
= collections
.OrderedDict()
745 self
._streams
= collections
.OrderedDict()
752 def trace(self
, value
):
760 def env(self
, value
):
768 def clocks(self
, value
):
776 def streams(self
, value
):
777 self
._streams
= value
This page took 0.059685 seconds and 5 git commands to generate.