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
):
43 raise NotImplementedError()
47 raise NotImplementedError()
50 def size(self
, value
):
54 class PropertyMapping
:
55 def __init__(self
, object, prop
):
64 def object(self
, value
):
72 def prop(self
, value
):
81 self
._byte
_order
= None
83 self
._encoding
= Encoding
.NONE
84 self
._property
_mappings
= []
91 def signed(self
, value
):
96 return self
._byte
_order
99 def byte_order(self
, value
):
100 self
._byte
_order
= value
107 def base(self
, value
):
112 return self
._encoding
115 def encoding(self
, value
):
116 self
._encoding
= value
120 if self
._align
is None:
121 if self
._size
is None:
124 if self
._size
% 8 == 0:
132 def align(self
, value
):
140 def size(self
, value
):
144 def property_mappings(self
):
145 return self
._property
_mappings
148 class FloatingPoint(Type
):
150 self
._exp
_size
= None
151 self
._mant
_size
= None
153 self
._byte
_order
= None
157 return self
._exp
_size
160 def exp_size(self
, value
):
161 self
._exp
_size
= value
165 return self
._mant
_size
168 def mant_size(self
, value
):
169 self
._mant
_size
= value
173 return self
._exp
_size
+ self
._mant
_size
176 def byte_order(self
):
177 return self
._byte
_order
180 def byte_order(self
, value
):
181 self
._byte
_order
= value
188 def align(self
, value
):
194 self
._value
_type
= None
195 self
._members
= collections
.OrderedDict()
199 return self
._value
_type
.align
203 return self
._value
_type
.size
206 def value_type(self
):
207 return self
._value
_type
210 def value_type(self
, value
):
211 self
._value
_type
= value
217 def value_of(self
, label
):
218 return self
._members
[label
]
220 def label_of(self
, value
):
221 for label
, vrange
in self
._members
.items():
222 if value
>= vrange
[0] and value
<= vrange
[1]:
225 def __getitem__(self
, key
):
227 return self
.value_of(key
)
228 elif type(key
) is int:
229 return self
.label_of(key
)
231 raise TypeError('wrong subscript type')
236 self
._encoding
= Encoding
.UTF8
248 return self
._encoding
251 def encoding(self
, value
):
252 self
._encoding
= value
257 self
._element
_type
= None
262 return self
._element
_type
.align
265 def element_type(self
):
266 return self
._element
_type
269 def element_type(self
, value
):
270 self
._element
_type
= value
277 def length(self
, value
):
282 return type(self
._length
) is int
289 element_sz
= self
.element_type
.size
291 if element_sz
is None:
294 # TODO: compute static size here
301 self
._fields
= collections
.OrderedDict()
305 return self
._min
_align
308 def min_align(self
, value
):
309 self
._min
_align
= value
313 fields_max
= max([f
.align
for f
in self
.fields
.values()] + [1])
315 return max(fields_max
, self
._min
_align
)
319 # TODO: compute static size here (if available)
326 def __getitem__(self
, key
):
327 return self
.fields
[key
]
333 self
._types
= collections
.OrderedDict()
341 if len(self
.members
) == 1:
342 return list(self
.members
.values())[0].size
351 def tag(self
, value
):
358 def __getitem__(self
, key
):
359 return self
.types
[key
]
364 self
._byte
_order
= None
365 self
._packet
_header
_type
= None
373 def uuid(self
, value
):
377 def byte_order(self
):
378 return self
._byte
_order
381 def byte_order(self
, value
):
382 self
._byte
_order
= value
385 def packet_header_type(self
):
386 return self
._packet
_header
_type
388 @packet_header_type.setter
389 def packet_header_type(self
, value
):
390 self
._packet
_header
_type
= value
393 class Env(collections
.OrderedDict
):
401 self
._description
= None
402 self
._freq
= 1000000000
403 self
._error
_cycles
= 0
404 self
._offset
_seconds
= 0
405 self
._offset
_cycles
= 0
406 self
._absolute
= False
407 self
._return
_ctype
= 'uint32_t'
414 def name(self
, value
):
422 def uuid(self
, value
):
426 def description(self
):
427 return self
._description
430 def description(self
, value
):
431 self
._description
= value
434 def error_cycles(self
):
435 return self
._error
_cycles
438 def error_cycles(self
, value
):
439 self
._error
_cycles
= value
446 def freq(self
, value
):
450 def offset_seconds(self
):
451 return self
._offset
_seconds
453 @offset_seconds.setter
454 def offset_seconds(self
, value
):
455 self
._offset
_seconds
= value
458 def offset_cycles(self
):
459 return self
._offset
_cycles
461 @offset_cycles.setter
462 def offset_cycles(self
, value
):
463 self
._offset
_cycles
= value
467 return self
._absolute
470 def absolute(self
, value
):
471 self
._absolute
= value
478 self
._log
_level
= None
479 self
._context
_type
= None
480 self
._payload
_type
= None
495 def name(self
, value
):
500 return self
._log
_level
503 def log_level(self
, value
):
504 self
._log
_level
= value
507 def context_type(self
):
508 return self
._context
_type
511 def context_type(self
, value
):
512 self
._context
_type
= value
515 def payload_type(self
):
516 return self
._payload
_type
519 def payload_type(self
, value
):
520 self
._payload
_type
= value
522 def __getitem__(self
, key
):
523 if type(self
.payload_type
) in [Struct
, Variant
]:
524 return self
.payload_type
[key
]
526 raise TypeError('{} is not subscriptable')
533 self
._packet
_context
_type
= None
534 self
._event
_header
_type
= None
535 self
._event
_context
_type
= None
536 self
._events
= collections
.OrderedDict()
543 def name(self
, value
):
555 def packet_context_type(self
):
556 return self
._packet
_context
_type
558 @packet_context_type.setter
559 def packet_context_type(self
, value
):
560 self
._packet
_context
_type
= value
563 def event_header_type(self
):
564 return self
._event
_header
_type
566 @event_header_type.setter
567 def event_header_type(self
, value
):
568 self
._event
_header
_type
= value
571 def event_context_type(self
):
572 return self
._event
_context
_type
574 @event_context_type.setter
575 def event_context_type(self
, value
):
576 self
._event
_context
_type
= value
586 self
._env
= collections
.OrderedDict()
587 self
._clocks
= collections
.OrderedDict()
588 self
._streams
= collections
.OrderedDict()
595 def trace(self
, value
):
603 def env(self
, value
):
611 def clocks(self
, value
):
619 def streams(self
, value
):
620 self
._streams
= value
This page took 0.069782 seconds and 4 git commands to generate.