blob: 6c68c7bb3cc23a84ad658002ed6f9ae1fd2343fa [file] [log] [blame]
/*
* Copyright (c) 2011 Massachusetts Institute of Technology
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Konstantinos Aisopos
*/
/*
* Official Tool Website: www.mit.edu/~kaisopos/FaultModel
*
* If you use our tool for academic research, we request that you cite:
* Konstantinos Aisopos, Chia-Hsin Owen Chen, and Li-Shiuan Peh. Enabling
* System-Level Modeling of Variation-Induced Faults in Networks-on-Chip.
* Proceedings of the 48th Design Automation Conference (DAC'11)
*/
#ifndef __MEM_RUBY_NETWORK_FAULT_MODEL_FAULTMODEL_HH__
#define __MEM_RUBY_NETWORK_FAULT_MODEL_FAULTMODEL_HH__
// tool limitations and fixed inputs
#define MAX_VCs 40
#define MAX_BUFFERS_per_VC 5
#define BASELINE_TEMPERATURE_CELCIUS 71
// C++ includes
#include <string>
// GEM5 includes
#include "params/FaultModel.hh"
#include "sim/sim_object.hh"
class FaultModel : public SimObject
{
public:
typedef FaultModelParams Params;
FaultModel(const Params *p);
const Params *params() const { return (const Params *)_params; }
/************************************************************************/
/********** THE FAULT TYPES SUPPORTED BY THE FAULT MODEL ***************/
/************************************************************************/
enum fault_type
{
data_corruption__few_bits,
data_corruption__all_bits,
flit_conservation__flit_duplication,
flit_conservation__flit_loss_or_split,
misrouting,
credit_conservation__credit_generation,
credit_conservation__credit_loss,
erroneous_allocation__VC,
erroneous_allocation__switch,
unfair_arbitration,
number_of_fault_types
};
/************************************************************************/
/******************** INTERFACE OF THE FAULT MODEL *********************/
/************************************************************************/
enum conf_record_format
{
conf_record_buff_per_vc,
conf_record_vcs,
conf_record_first_fault_type,
conf_record_last_fault_type = conf_record_first_fault_type + number_of_fault_types - 1,
fields_per_conf_record
};
enum temperature_record_format
{
temperature_record_temp,
temperature_record_weight,
fields_per_temperature_record
};
struct system_conf
{
int vcs;
int buff_per_vc;
float fault_type[number_of_fault_types];
};
int declare_router(int number_of_inputs,
int number_of_outputs,
int number_of_vcs_per_vnet,
int number_of_buff_per_data_vc,
int number_of_buff_per_ctrl_vc);
std::string fault_type_to_string(int fault_type_index);
// the following 2 functions are called at runtime, to get the probability
// of each fault type (fault_vector) or the aggregate fault probability
// (fault_prob). Note: the probability values are provided by reference
// (in the variables fault_vector[] & aggregate_fault_prob respectively).
// Both functions also return a success flag (which is always true if
// temperature ranges from 0C to 125C)
bool fault_vector(int routerID,
int temperature,
float fault_vector[]);
bool fault_prob(int routerID,
int temperature,
float *aggregate_fault_prob);
// for debugging purposes
void print(void);
private:
std::vector <system_conf> configurations;
std::vector <system_conf> routers;
std::vector <int> temperature_weights;
};
#endif //__MEM_RUBY_NETWORK_FAULT_MODEL_FAULTMODEL_HH__