source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Encryption.cpp @ 86

Last change on this file since 86 was 86, checked in by rosiere, 16 years ago

Decod :

  • Correct selftest
  • Set Instruction address on (32/64)-2 bits,
  • Decod Custom Instruction : valid and tested. (add an test to verify the decod information)
  • Property svn:keywords set to Id
File size: 6.6 KB
Line 
1/*
2 * $Id: Encryption.cpp 86 2008-05-14 17:08:56Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Custom/include/Encryption.h"
9
10namespace morpheo {
11namespace behavioural {
12namespace custom {
13namespace encryption {
14
15  static uint32_t _num_group;
16
17  Encryption::Encryption (uint32_t     num_group,
18                          Toperation_t operation_encrypt,
19                          Toperation_t operation_decrypt) :
20    _operation_encrypt (operation_encrypt),
21    _operation_decrypt (operation_decrypt)
22  {
23    _num_group = num_group;
24  };
25
26  uint32_t Encryption::get_nb_register (void)
27  {
28    return 3;
29  };
30   
31  access_mode_t Encryption::get_access_mode (uint32_t reg)
32  {
33    // All reg is access by supervisor
34    return access_mode_t (SPR_ACCESS_MODE_NONE, SPR_ACCESS_MODE_READ_WRITE);
35  }
36
37  custom_decod_t * Encryption::get_custom_decod (Toperation_t operation)
38  {
39    if (operation == _operation_encrypt)
40      return &(morpheo::behavioural::custom::encryption::Encryption::decod_encrypt);
41    if (operation == _operation_decrypt)
42      return &(morpheo::behavioural::custom::encryption::Encryption::decod_decrypt);
43
44    return &(morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::instruction_illegal); // unimplemented function
45  }
46
47  custom_execute_genMoore_t * Encryption::get_custom_execute_genMoore (Toperation_t operation)
48  {
49    if (operation == _operation_encrypt)
50      return &(morpheo::behavioural::custom::encryption::Encryption::function_encrypt);
51    if (operation == _operation_decrypt)
52      return &(morpheo::behavioural::custom::encryption::Encryption::function_decrypt);
53
54    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
55  }
56
57  custom_execute_transition_t * Encryption::get_custom_execute_transition (void)
58  {
59    // No treatment a the end cycle
60    return NULL;
61  }
62
63  custom_execute_transition_t * Encryption::get_custom_execute_reset (void)
64  {
65    // No treatment a the end cycle
66    return NULL;
67  }
68
69  void Encryption::function_encrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
70                                     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
71                                     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
72  {
73    std::cout << "<Encryption::function_decrypt> Operation : encrypt" << std::endl;
74
75    Tgeneral_data_t data = unsigned(op->_data_ra);
76   
77    Tgeneral_data_t key   = reg->_spr[_num_group][num_register_key  ];
78    Tgeneral_data_t shift = reg->_spr[_num_group][num_register_shift];
79    Tgeneral_data_t rool  = reg->_spr[_num_group][num_register_role ];
80
81    for (Tgeneral_data_t i=0 ; i<rool; i++)
82      {
83        data ^= key;
84        data  = rotate_right<Tgeneral_data_t>(param->_size_data,data,shift);
85      }
86   
87    // Result
88    op->_timing       = morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_timing_t(rool, rool);
89    op->_data_rd      = data;
90  //op->_data_re      = 0;
91    op->_exception    = EXCEPTION_ALU_NONE;
92    op->_no_sequence  = 0;
93  //op->_address      = 0;
94  };
95 
96  void Encryption::function_decrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
97                                     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
98                                     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
99  {
100    std::cout << "<Encryption::function_decrypt> Operation : decrypt" << std::endl;
101
102    Tgeneral_data_t data = unsigned(op->_data_ra);
103   
104    Tgeneral_data_t key   = reg->_spr[_num_group][num_register_key  ];
105    Tgeneral_data_t shift = reg->_spr[_num_group][num_register_shift];
106    Tgeneral_data_t rool  = reg->_spr[_num_group][num_register_role ];
107
108    for (Tgeneral_data_t i=0 ; i<rool; i++)
109      {
110        data  = rotate_left<Tgeneral_data_t>(param->_size_data,data,shift);
111        data ^= key;
112      }
113   
114    // Result
115    op->_timing       = morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_timing_t(rool, rool);
116    op->_data_rd      = data;
117  //op->_data_re      = 0;
118    op->_exception    = EXCEPTION_ALU_NONE;
119    op->_no_sequence  = 0;
120  //op->_address      = 0;
121  };
122
123  void Encryption::decod_encrypt (morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::decod_instruction_t * inst, 
124                                  morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::decod_param_t       * param)
125  {
126    log_printf(TRACE,Decod,"decod_encrypt","  * instruction   : encrypt");
127
128    inst->_has_immediat       = 0;
129//  inst->_immediat           = ;
130    inst->_read_ra            = 1;
131    inst->_num_reg_ra         = range<Tgeneral_address_t>(inst->_instruction,20,16);
132    inst->_read_rb            = 0;
133//  inst->_num_reg_rb         = ;
134    inst->_read_rc            = 0;
135//  inst->_num_reg_rc         = ;
136    inst->_write_rd           = 1;
137    inst->_num_reg_rd         = range<Tgeneral_address_t>(inst->_instruction,25,21);
138    inst->_write_re           = 0;
139//  inst->_num_reg_re         = ;
140    inst->_exception_use      = EXCEPTION_USE_NONE;
141    inst->_event_type         = EVENT_TYPE_NONE;
142  }
143
144  void Encryption::decod_decrypt (morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::decod_instruction_t * inst, 
145                                  morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::decod_param_t       * param)
146  {
147    log_printf(TRACE,Decod,"decod_decrypt","  * instruction   : decrypt");
148
149    inst->_has_immediat       = 0;
150//  inst->_immediat           = ;
151    inst->_read_ra            = 1;
152    inst->_num_reg_ra         = range<Tgeneral_address_t>(inst->_instruction,20,16);
153    inst->_read_rb            = 0;
154//  inst->_num_reg_rb         = ;
155    inst->_read_rc            = 0;
156//  inst->_num_reg_rc         = ;
157    inst->_write_rd           = 1;
158    inst->_num_reg_rd         = range<Tgeneral_address_t>(inst->_instruction,25,21);
159    inst->_write_re           = 0;
160//  inst->_num_reg_re         = ;
161    inst->_exception_use      = EXCEPTION_USE_NONE;
162    inst->_event_type         = EVENT_TYPE_NONE;
163  }
164
165}; // end namespace encryption
166}; // end namespace custom
167}; // end namespace behavioural
168}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.