source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Random.cpp @ 72

Last change on this file since 72 was 72, checked in by rosiere, 16 years ago
  • SystemC de l'unite fonctionnelle.
  • gestion des groupes / instructions custom
File size: 3.3 KB
Line 
1/*
2 * $Id$
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Custom/include/Random.h"
9
10namespace morpheo {
11namespace behavioural {
12namespace custom {
13namespace random {
14
15  static uint32_t _num_group;
16
17  Random::Random (uint32_t num_group)
18  {
19    _num_group = num_group;
20  };
21
22  uint32_t Random::get_nb_register (void)
23  {
24    return 4;
25  };
26   
27  access_mode_t Random::get_access_mode (uint32_t reg)
28  {
29    // All reg is access by supervisor
30    if (reg == num_register_random)
31      return access_mode_t (SPR_ACCESS_MODE_READ_ONLY, SPR_ACCESS_MODE_READ_ONLY);
32
33    return access_mode_t (SPR_ACCESS_MODE_READ_ONLY_COND, SPR_ACCESS_MODE_READ_WRITE);
34  }
35
36  custom_decod_t * Random::get_custom_decod (Toperation_t operation)
37  {
38    // TODO !!!!!
39    return NULL;
40  }
41
42  custom_execute_genMoore_t * Random::get_custom_execute_genMoore (Toperation_t operation)
43  {
44    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
45  }
46
47  custom_execute_transition_t * Random::get_custom_execute_transition (void)
48  {
49    // No treatment a the end cycle
50    return &(function_transition);
51  }
52
53  custom_execute_transition_t * Random::get_custom_execute_reset (void)
54  {
55    // No treatment a the end cycle
56    return &(function_reset);
57  }
58
59  void Random::function_transition (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
60                                    morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
61  {
62    std::cout << "<Random::function_transition> Transition" << std::endl;
63
64    uint32_t num_group    = reg->_access_num_group;
65    uint32_t num_register = reg->_access_num_register;
66    if (num_group == _num_group)
67      {
68        // Test if have a read of num_register_random
69        if ((reg->_i_read_spr) and
70            (num_register == num_register_random))
71          {
72            Tgeneral_data_t random = reg->_spr[num_group][num_register_random];
73            Tgeneral_data_t cst1   = reg->_spr[num_group][num_register_cst1  ];
74            Tgeneral_data_t cst2   = reg->_spr[num_group][num_register_cst2  ];
75            Tgeneral_data_t max    = reg->_spr[num_group][num_register_max   ];
76
77            // make a new value
78            reg->_spr[num_group][num_register_random] = (cst1*random+cst2)%max;
79          }
80
81        // Test if write in register_max
82        if (reg->_i_write_spr and
83            (reg->_spr[num_group][num_register] == 0))
84          {
85            reg->_spr[num_group][num_register] = reg->_spr_old;
86          }
87      }
88  };
89 
90  void Random::function_reset  (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
91                                morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
92  {
93    std::cout << "<Random::function_reset> Reset" << std::endl;
94
95    reg->_spr[_num_group][num_register_random] = 0xbebe;
96    reg->_spr[_num_group][num_register_cst1  ] = 0xdeadbeef;
97    reg->_spr[_num_group][num_register_cst2  ] = 0x666;
98    reg->_spr[_num_group][num_register_max   ] = 0xffffffff;
99  };
100
101}; // end namespace random
102}; // end namespace custom
103}; // end namespace behavioural
104}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.