/****************************************************************************
    +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+ +-+-+-+-+-+-+-+-+
    |F|u|n|c|t|i|o|n|a|l| |V|e|r|i|f|i|c|a|t|i|o|n| |o|f| |H|a|r|d|w|a|r|e|
    +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+ +-+-+-+-+-+-+-+-+

    FILE            i2c_config.sv

    DESCRIPTION     contains main and default configurations

 ****************************************************************************/

`ifndef I2C_CONFIG_SV
`define I2C_CONFIG_SV

/**
 * Class: i2c_config
 */
class i2c_config extends uvm_object;
    
    // master/slave agents
    bit has_master;
    bit has_slave;

    // configurations for every agent
    i2c_slave_config  slave_cfg;
    i2c_master_config master_cfg;

    // control
    bit has_checks = 1;
    bit has_coverage = 1;

    // UVM factory registration
    `uvm_object_utils_begin(i2c_config)
        `uvm_field_int(has_master, UVM_DEFAULT)
        `uvm_field_int(has_slave, UVM_DEFAULT)
        `uvm_field_object(slave_cfg, UVM_DEFAULT)
        `uvm_field_object(master_cfg, UVM_DEFAULT)
        `uvm_field_int(has_checks, UVM_DEFAULT)
        `uvm_field_int(has_coverage, UVM_DEFAULT)
    `uvm_object_utils_end

    // new - constructor
    function new(string name = "i2c_config");
        super.new(name);
    endfunction : new

    // additional class methods
    extern function void add_slave(uvm_active_passive_enum is_active = UVM_ACTIVE);
    extern function void add_master(uvm_active_passive_enum is_active = UVM_ACTIVE);

endclass : i2c_config

// creates and configures a slave agent config and adds to a queue
function void i2c_config::add_slave(uvm_active_passive_enum is_active = UVM_ACTIVE);
    slave_cfg = i2c_slave_config::type_id::create("slave_cfg");
    has_slave = 1;
    slave_cfg.is_active = is_active;
    slave_cfg.has_checks = has_checks;
    slave_cfg.has_coverage = has_coverage;
endfunction : add_slave

// creates and configures a master agent configuration
function void i2c_config::add_master(uvm_active_passive_enum is_active = UVM_ACTIVE);
    master_cfg = i2c_master_config::type_id::create("master_cfg");
    has_master = 1;
    master_cfg.is_active = is_active;
    master_cfg.has_checks = has_checks;
    master_cfg.has_coverage = has_coverage;
endfunction : add_master

/**
 * Class: default_i2c_config
 * 
 * Description: default configuration - one master, no slaves
 */
class default_i2c_config extends i2c_config;

    `uvm_object_utils(default_i2c_config)

    function new(string name = "default_i2c_config");
        super.new(name);
        add_master(UVM_ACTIVE);
        add_slave(UVM_ACTIVE); // TODO : remove after debug
    endfunction : new

endclass : default_i2c_config

`endif
