1 | #ifdef SYSTEMC |
---|
2 | /* |
---|
3 | * $Id: Comparator_genMealy.cpp 123 2009-06-08 20:43:30Z rosiere $ |
---|
4 | * |
---|
5 | * [ Description ] |
---|
6 | * |
---|
7 | */ |
---|
8 | |
---|
9 | #include "Behavioural/Generic/Comparator/include/Comparator.h" |
---|
10 | |
---|
11 | namespace morpheo { |
---|
12 | namespace behavioural { |
---|
13 | namespace generic { |
---|
14 | namespace comparator { |
---|
15 | |
---|
16 | |
---|
17 | #undef FUNCTION |
---|
18 | #define FUNCTION "Comparator::genMealy" |
---|
19 | void Comparator::genMealy (void) |
---|
20 | { |
---|
21 | log_begin(Comparator,FUNCTION); |
---|
22 | |
---|
23 | if (PORT_READ(in_NRESET)) |
---|
24 | { |
---|
25 | Tcontrol_t test; |
---|
26 | Tdata_t data_0 = PORT_READ(in_COMPARE_DATA_0); |
---|
27 | Tdata_t data_1 = PORT_READ(in_COMPARE_DATA_1); |
---|
28 | |
---|
29 | if (_param->_is_signed) |
---|
30 | { |
---|
31 | int64_t data0 = static_cast<int64_t>(data_0); |
---|
32 | int64_t data1 = static_cast<int64_t>(data_1); |
---|
33 | |
---|
34 | data0 = ((data0 & _param->_mask_sign) != 0)?(_param->_extends|data0):(~_param->_extends & data0); |
---|
35 | data1 = ((data1 & _param->_mask_sign) != 0)?(_param->_extends|data1):(~_param->_extends & data1); |
---|
36 | |
---|
37 | switch (_param->_type) |
---|
38 | { |
---|
39 | case COMPARATOR_EQUAL : test = (data0 == data1); break; |
---|
40 | case COMPARATOR_NOT_EQUAL : test = (data0 != data1); break; |
---|
41 | case COMPARATOR_GREATER : test = (data0 > data1); break; |
---|
42 | case COMPARATOR_GREATER_OR_EQUAL : test = (data0 >= data1); break; |
---|
43 | case COMPARATOR_LESS : test = (data0 < data1); break; |
---|
44 | case COMPARATOR_LESS_OR_EQUAL : test = (data0 <= data1); break; |
---|
45 | } |
---|
46 | } |
---|
47 | else |
---|
48 | { |
---|
49 | uint64_t data0 = ~_param->_extends & static_cast<uint64_t>(data_0); |
---|
50 | uint64_t data1 = ~_param->_extends & static_cast<uint64_t>(data_1); |
---|
51 | |
---|
52 | switch (_param->_type) |
---|
53 | { |
---|
54 | case COMPARATOR_EQUAL : test = (data0 == data1); break; |
---|
55 | case COMPARATOR_NOT_EQUAL : test = (data0 != data1); break; |
---|
56 | case COMPARATOR_GREATER : test = (data0 > data1); break; |
---|
57 | case COMPARATOR_GREATER_OR_EQUAL : test = (data0 >= data1); break; |
---|
58 | case COMPARATOR_LESS : test = (data0 < data1); break; |
---|
59 | case COMPARATOR_LESS_OR_EQUAL : test = (data0 <= data1); break; |
---|
60 | } |
---|
61 | } |
---|
62 | |
---|
63 | log_printf(TRACE,Comparator,FUNCTION," * size_data : %d",_param->_size_data); |
---|
64 | log_printf(TRACE,Comparator,FUNCTION," * extends : %llx",_param->_extends ); |
---|
65 | |
---|
66 | |
---|
67 | log_printf(TRACE,Comparator,FUNCTION," * %.x %s (%d) %x = %d" |
---|
68 | ,data_0 |
---|
69 | ,toString(_param->_type).c_str() |
---|
70 | ,_param->_is_signed |
---|
71 | ,data_1 |
---|
72 | ,test); |
---|
73 | |
---|
74 | PORT_WRITE(out_COMPARE_TEST,test); |
---|
75 | } |
---|
76 | |
---|
77 | log_end(Comparator,FUNCTION); |
---|
78 | }; |
---|
79 | |
---|
80 | }; // end namespace comparator |
---|
81 | }; // end namespace generic |
---|
82 | |
---|
83 | }; // end namespace behavioural |
---|
84 | }; // end namespace morpheo |
---|
85 | #endif |
---|