Source code for corsair.config

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Module to operate with Corsair configuration files
"""

from . import utils
import configparser


[docs]def default_globcfg(): """Create a global configuration with parameters by default.""" return { "base_address": 0, "data_width": 32, "address_width": 16, "register_reset": "sync_pos", "address_increment": "none", "address_alignment": "data_width", "force_name_case": "none", }
[docs]def read_csrconfig(cfgpath): """Parse Corsair configuration file. Return two dictionaries: global configuration and targets.""" # open config file cfg = configparser.ConfigParser() cfg.read_file(open(cfgpath, 'r')) # parse global config globcfg = default_globcfg() if 'globcfg' in cfg.sections(): globcfg.update(dict(cfg['globcfg'])) globcfg["base_address"] = utils.str2int(globcfg["base_address"]) globcfg["data_width"] = utils.str2int(globcfg["data_width"]) globcfg["address_width"] = utils.str2int(globcfg["address_width"]) try: globcfg["address_increment"] = utils.str2int(globcfg["address_increment"]) except ValueError: pass try: globcfg["address_alignment"] = utils.str2int(globcfg["address_alignment"]) except ValueError: pass validate_globcfg(globcfg) # parse targets targets = {} for target_name in [name for name in cfg.sections() if name != 'globcfg']: if 'generator' in dict(cfg[target_name]).keys(): targets[target_name] = dict(cfg[target_name]) return globcfg, targets
[docs]def write_csrconfig(cfgpath, globcfg, targets): """Save Corsair configuration file.""" cfg = configparser.ConfigParser() data = {'globcfg': globcfg} data.update(targets) cfg.read_dict(data) cfg.write(open(cfgpath, 'w'))
[docs]def validate_globcfg(globcfg): """Validate a dictionary with global configuration.""" # base_address assert utils.is_non_neg_int(globcfg["base_address"]), \ "Wrong value for 'base_address'='%s'. Must be a non negative integer." % globcfg["base_address"] # data_width assert utils.is_non_neg_int(globcfg["data_width"]), \ "Wrong value for 'data_width'='%s'. Must be a non negative integer." % globcfg["data_width"] # address_width assert utils.is_non_neg_int(globcfg["address_width"]), \ "Wrong value for 'address_width'='%s'. Must be a non negative integer." % globcfg["address_width"] # register_reset register_reset_allowed = ['sync_pos', 'sync_neg', 'async_pos', 'async_neg'] assert globcfg["register_reset"] in register_reset_allowed, \ "Wrong value for 'register_reset'='%s'. Must be one of this: %s." % (globcfg["address_width"], register_reset_allowed) # address_increment address_increment_alowed = ['none', 'data_width'] try: is_valid = (globcfg["address_increment"] in address_increment_alowed or utils.is_non_neg_int(globcfg["address_increment"])) except ValueError: is_valid = False assert is_valid, \ "Wrong value for 'address_increment'='%s'. Must be one of this: %s or a non negative integer." % ( globcfg["address_increment"], address_increment_alowed) # address_alignment address_alignment_alowed = ['none', 'data_width'] try: is_valid = (globcfg["address_alignment"] in address_alignment_alowed or utils.is_non_neg_int(globcfg["address_alignment"])) except ValueError: is_valid = False assert is_valid, \ "Wrong value for 'address_alignment'='%s'. Must be one of this: %s or a non negative integer." % ( globcfg["address_alignment"], address_alignment_alowed) # force_name_case force_name_case_allowed = ['lower', 'upper', 'none'] assert globcfg["force_name_case"] in force_name_case_allowed, \ "Wrong value for 'force_name_case'='%s'. Must be one of this: %s." % (globcfg["force_name_case"], force_name_case_allowed)
globcfg = default_globcfg()
[docs]def set_globcfg(globcfg_): """Use specified global configuration for all operations""" global globcfg validate_globcfg(globcfg_) globcfg = globcfg_