diff --git a/tools/oneclick/prestudy/YAML/bf/bf.peripheral.yaml b/tools/oneclick/prestudy/YAML/bf/bf.peripheral.yaml index 1fc41a01c9b3b1b04a3e8f9149fa08e5527c21db..aef117fe8e2f0e82af692acb55ea75e7e4c577dd 100644 --- a/tools/oneclick/prestudy/YAML/bf/bf.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/bf/bf.peripheral.yaml @@ -2,11 +2,11 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : bf -library_description: " This is the description for the bf package " +hdl_library_name : bf +hdl_library_description: " This is the description for the bf package " peripherals: - - peripheral_component_name: bf_unit + - peripheral_name: bf_unit parameters: - { name: g_bf.in_weights_w , value: 16 } @@ -18,8 +18,9 @@ peripherals: slave_ports: - + # ram_bf_weights slave_prefix : BF - slave_name : WEIGHTS # ram_bf_weights + slave_name : WEIGHTS slave_postfix: RAM number_of_slaves: g_bf.nof_weights slave_type: RAM @@ -27,47 +28,51 @@ peripherals: - field_name : bf_weights width : g_bf.in_weights_w * c_nof_complex - address_length: g_bf.nof_signal_paths + + number_of_fields: g_bf.nof_signal_paths field_description: | "Contains the weights. The real and the imaginary parts are concatenated: W_real in Lower part. W_imag in Higher part." slave_discription: | " " - - slave_prefix : # BF - slave_name : ram_ss_ss_wide # SS_SS_WIDE - slave_postfix: # RAM + # ram_ss_ss_wide + slave_prefix : BF + slave_name : SS_SS_WIDE + slave_postfix: RAM number_of_slaves: g_bf.nof_weights slave_type: RAM fields: - field_name: ss_ss_wide width: ceil_log2(g_bf.nof_subbands * c_nof_signal_paths_per_stream) - address_length: g_bf.nof_input_streams * c_nof_signal_paths_per_stream # 16*4=64, nof_input_streams*nof_signal_paths_per_stream + number_of_fields: g_bf.nof_input_streams * c_nof_signal_paths_per_stream # 16*4=64, nof_input_streams*nof_signal_paths_per_stream field_description: | "Contains the addresses to select from the stored subbands." slave_discription: | " " - - slave_prefix : # BF - slave_name : ram_st_sst_bf # ST_SST - slave_postfix: # RAM + # ram_st_sst_bf + slave_prefix : BF + slave_name : ST_SST + slave_postfix: RAM number_of_slaves: g_bf.nof_weights slave_type: RAM fields: - field_name: st_sst_bf width: 56 - address_length: c_nof_complex # 2 + number_of_fields: 512 access_mode : RO field_description: | "Contains the weights. The real and the imaginary parts are concatenated: W_real in Lower part. W_imag in Higher part." slave_discription: | - - slave_prefix : # BF - slave_name : reg_st_sst_bf # ST_SST - slave_postfix: # REG + # reg_st_sst_bf + slave_prefix : BF + slave_name : ST_SST + slave_postfix: REG number_of_slaves: 1 slave_type: REG fields: diff --git a/tools/oneclick/prestudy/YAML/demo.system.yaml b/tools/oneclick/prestudy/YAML/demo.system.yaml index 37a7772d3944dcbbd20835006a1992464576ccb0..49760239355fcad9ed94696660ccac46a9092520 100644 --- a/tools/oneclick/prestudy/YAML/demo.system.yaml +++ b/tools/oneclick/prestudy/YAML/demo.system.yaml @@ -2,7 +2,9 @@ protocol_name : args protocol_version: 1.0 protocol_type : system -library_name : demo +hdl_library_name: demo + +system_name : demo system_description: | "DEMO system for testing mm tools Now with extra line ??" @@ -16,36 +18,65 @@ parameters: - { name : nof_streams, value: 12 } peripherals: - - peripheral_component_name: rom_system_info - peripheral_prefix : '' + - peripheral_name: rom_system_info + subsystem_name : '' + slave_port_names: + - rom_system_info - - peripheral_component_name: reg_system_info - peripheral_prefix : '' - - - peripheral_component_name: fringe_stop_unit - peripheral_prefix : '' - number_of_peripherals : nof_fringe_stop_units + - peripheral_name: reg_system_info + subsystem_name : '' + slave_port_names: + - reg_system_info + + - peripheral_name: fringe_stop_unit + subsystem_name : '' + number_of_peripherals: nof_fringe_stop_units + slave_port_names: + - ram_fringe_stop_step + - fringe_stop_offset - - peripheral_component_name: diag_block_gen - peripheral_prefix : input + - peripheral_name: diag_block_gen + subsystem_name : input + slave_port_names: + - reg_diag_bg_input + - ram_diag_bg_input parameters: - { name : g_nof_streams, value: nof_streams } - { name : g_buf_addr_w, value: 7 } - - peripheral_component_name: diag_block_gen - peripheral_prefix : mesh + - peripheral_name: diag_block_gen + subsystem_name : output + slave_port_names: + - reg_diag_bg_output + - ram_diag_bg_output + parameters: + - { name : g_nof_streams, value: 2 } + + - peripheral_name: diag_block_gen + subsystem_name : mesh + slave_port_names: + - reg_diag_bg_mesh + - ram_diag_bg_mesh parameters: - { name : g_nof_streams, value: 8 } - { name : g_buf_addr_w, value: 8 } - - peripheral_component_name: diag_block_gen - peripheral_prefix : proc + - peripheral_name: diag_block_gen + subsystem_name : proc + slave_port_names: + - reg_diag_bg_proc + - ram_diag_bg_proc parameters: - { name : g_nof_streams, value: nof_streams } - { name : g_buf_addr_w, value: 7 } - - peripheral_component_name: bf_unit - peripheral_prefix : '' + - peripheral_name: bf_unit + subsystem_name : '' + slave_port_names: + - ram_bf_weights + - ram_ss_ss_wide + - ram_st_sst_bf + - reg_st_sst_bf parameters: - { name : g_bf.in_weights_w, value: 3 } - { name : g_bf.nof_weights, value: 128 } @@ -53,46 +84,57 @@ peripherals: - { name : g_bf.nof_subbands, value: 12 } - { name : g_bf.nof_input_streams, value: 8 } - - peripheral_component_name: diag_block_gen - peripheral_prefix : output - parameters: - - { name : g_nof_streams, value: 2 } - - - peripheral_component_name: diag_data_buffer - peripheral_prefix : input_pre + - peripheral_name: diag_data_buffer + subsystem_name : input_pre + slave_port_names: + - reg_diag_data_buffer_input_pre + - ram_diag_data_buffer_input_pre parameters: - { name : g_nof_streams, value: nof_streams } - { name : g_data_w, value: 16 } - { name : g_buf_nof_data, value: 8192 } - - peripheral_component_name: diag_data_buffer - peripheral_prefix : input_post + - peripheral_name: diag_data_buffer + subsystem_name : input_post + slave_port_names: + - reg_diag_data_buffer_input_post + - ram_diag_data_buffer_input_post parameters: - { name : g_nof_streams, value: nof_streams } - { name : g_data_w, value: 16 } - { name : g_buf_nof_data, value: 8192 } - - peripheral_component_name: diag_data_buffer - peripheral_prefix : mesh + - peripheral_name: diag_data_buffer + subsystem_name : mesh + slave_port_names: + - reg_diag_data_buffer_mesh + - ram_diag_data_buffer_mesh parameters: - { name : g_nof_streams, value: 8 } - { name : g_data_w, value: 16 } - { name : g_buf_nof_data, value: 8 } - - peripheral_component_name: diag_data_buffer - peripheral_prefix : proc + - peripheral_name: diag_data_buffer + subsystem_name : proc + slave_port_names: + - reg_diag_data_buffer_proc + - ram_diag_data_buffer_proc parameters: - { name : g_nof_streams, value: nof_streams } - { name : g_data_w, value: 16 } - { name : g_buf_nof_data, value: 128 } - - peripheral_component_name: dp_bsn_align - peripheral_prefix : input + - peripheral_name: dp_bsn_align + subsystem_name : input + slave_port_names: + - reg_dp_bsn_align_input parameters: - { name : g_nof_input, value: 3 } - - peripheral_component_name: dp_fifo_fill - peripheral_prefix : '' + - peripheral_name: dp_fifo_fill + subsystem_name : '' + slave_port_names: + - reg_dp_fifo_fill parameters: - { name : g_nof_streams, value: 3 } diff --git a/tools/oneclick/prestudy/YAML/diag/diag.peripheral.yaml b/tools/oneclick/prestudy/YAML/diag/diag.peripheral.yaml index fcaa4cf6ca1dc3a2e0b4aaad39a307403b19f7cc..aa186adb5794a16f8575d1764a750fe4d5e4ccf8 100644 --- a/tools/oneclick/prestudy/YAML/diag/diag.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/diag/diag.peripheral.yaml @@ -2,12 +2,12 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : diag -library_description: " This is the description for the bf package " +hdl_library_name : diag +hdl_library_description: " This is the description for the bf package " peripherals: - - peripheral_component_name: diag_block_gen + peripheral_name: diag_block_gen parameters: - { name: g_nof_streams, value: 1 } @@ -16,8 +16,9 @@ peripherals: slave_ports: - + # actual hdl name: reg_diag_bg slave_prefix : DIAG - slave_name : BG # reg_diag_bg + slave_name : BG slave_postfix: REG slave_type : REG fields: @@ -31,21 +32,21 @@ peripherals: field_name : Samples_per_packet width : 16 address_offset: 0x1 - default_value : 256 + reset_value : 256 field_description: | "This REG specifies the number samples in a packet" - field_name : Blocks_per_sync width : 16 address_offset: 0x2 - default_value : 781250 + reset_value : 781250 field_description: | "This REG specifies the number of packets in a sync period" - field_name : Gapsize width : 16 address_offset: 0x3 - default_value : 80 + reset_value : 80 field_description: | "This REG specifies the gap in number of clock cycles between two consecutive packets" - @@ -71,8 +72,9 @@ peripherals: field_description: | "This REG specifies the higher(MSB) 32 bits [63:32] of the initialization BSN" - + # actual hdl name: ram_diag_bg slave_prefix : DIAG - slave_name : BG # ram_diag_bg + slave_name : BG slave_postfix: RAM number_of_slaves: g_nof_streams slave_type : RAM @@ -80,13 +82,13 @@ peripherals: - field_name: diag_bg width: g_buf_dat_w - depth: 2**g_buf_addr_w + number_of_fields: 2**g_buf_addr_w field_description : | "Contains the Waveform data for the data-streams to be send" peripheral_description: | "Block generator" - - peripheral_component_name: diag_data_buffer + peripheral_name: diag_data_buffer parameters: - { name: g_nof_streams , value: 1 } @@ -95,8 +97,9 @@ peripherals: slave_ports: - + # actual hdl name: reg_diag_data_buffer slave_prefix : DIAG - slave_name : DATA_BUFFER # reg_diag_data_buffer + slave_name : DATA_BUFFER slave_postfix: REG slave_type : REG fields: @@ -134,8 +137,9 @@ peripherals: "Version contains the version number of the databuffer peripheral." slave_description: "" - + # actual hdl name: ram_diag_data_buffer slave_prefix : DIAG - slave_name : DATA_BUFFER # ram_diag_data_buffer + slave_name : DATA_BUFFER slave_postfix: RAM number_of_slaves: g_nof_streams slave_type : RAM @@ -143,7 +147,7 @@ peripherals: - field_name : ram width : g_data_w - address_length: 2**ceil_log2(g_buf_nof_data) + number_of_fields: 2**ceil_log2(g_buf_nof_data) field_description: | "Contains the data that is being captured." slave_description: "" diff --git a/tools/oneclick/prestudy/YAML/dp/dp.peripheral.yaml b/tools/oneclick/prestudy/YAML/dp/dp.peripheral.yaml index 95d308c29fd6448afd53fd0307bfaada1197a908..1391b45129769ac82406e3d66ac2e092d77c3e87 100644 --- a/tools/oneclick/prestudy/YAML/dp/dp.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/dp/dp.peripheral.yaml @@ -2,20 +2,21 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : dp -library_description: " This is the description for the dp package " +hdl_library_name : dp +hdl_library_description: " This is the description for the dp package " peripherals: - - peripheral_component_name: dp_bsn_align + peripheral_name: dp_bsn_align parameters: - { name: g_nof_input, value : 2 } slave_ports: - + # actual hdl name: reg_dp_bsn_align slave_prefix : DP - slave_name : BSN_ALIGN # reg_dp_bsn_align + slave_name : BSN_ALIGN slave_postfix: REG number_of_slaves: g_nof_input slave_type : REG @@ -31,14 +32,15 @@ peripherals: peripheral_description: "This is the BSN aligner" - - peripheral_component_name: mms_dp_fifo_fill + peripheral_name: dp_fifo_fill parameters: - { name : g_nof_streams, value: 3 } slave_ports: - + # actual hdl name: reg_dp_fifo_fill slave_prefix : DP - slave_name : FIFO_FILL # reg_dp_fifo_fill + slave_name : FIFO_FILL slave_postfix: REG number_of_slaves: g_nof_streams slave_type : REG diff --git a/tools/oneclick/prestudy/YAML/eth/eth.peripheral.yaml b/tools/oneclick/prestudy/YAML/eth/eth.peripheral.yaml index 88e35b711b6c056fd17d6d837de4141b535243e8..64ed1c7da70b9dc03ec3d22173703821405e93ac 100644 --- a/tools/oneclick/prestudy/YAML/eth/eth.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/eth/eth.peripheral.yaml @@ -2,12 +2,12 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : eth -library_description: " This is the description for the eth package " +hdl_library_name : eth +hdl_library_description: " This is the description for the eth package " peripherals: - - peripheral_component_name: eth1g + peripheral_name: eth1g parameters: - { name: c_eth_ram_nof_words, value: 1024 } @@ -16,8 +16,9 @@ peripherals: slave_ports: - + # actual hdl name: reg_tse slave_prefix : ETH - slave_name : TSE # reg_tse + slave_name : TSE slave_postfix: REG slave_type : REG fields: @@ -29,8 +30,9 @@ peripherals: " reg tse " slave_description: "" - + # actual hdl name: reg slave_prefix : ETH - slave_name : REG # reg + slave_name : REG slave_postfix: REG slave_type : REG fields: @@ -41,14 +43,15 @@ peripherals: field_description : " reg registers " slave_description: " " - + # actual hdl name: ram slave_prefix : ETH - slave_name : RAM # ram + slave_name : RAM slave_postfix: RAM slave_type : RAM fields: - field_name: ram - address_length: c_eth_ram_nof_words + number_of_fields: c_eth_ram_nof_words field_description: | "Contains the Waveform data for the data-streams to be send" slave_description: " " diff --git a/tools/oneclick/prestudy/YAML/fringe_stop/fringe_stop.peripheral.yaml b/tools/oneclick/prestudy/YAML/fringe_stop/fringe_stop.peripheral.yaml index a565e02b3bfd3a771d58812565a693ee2d0169e1..c2929af2f4ad9dccfa41d4d0bd588ebbb359ec17 100644 --- a/tools/oneclick/prestudy/YAML/fringe_stop/fringe_stop.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/fringe_stop/fringe_stop.peripheral.yaml @@ -2,12 +2,12 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : fringe_stop -library_description: " This is the description for the finge_stop library " +hdl_library_name : fringe_stop +hdl_library_description: " This is the description for the finge_stop library " peripherals: - - peripheral_component_name: fringe_stop_unit + peripheral_name: fringe_stop_unit parameters: - { name: g_nof_channels, value: 256 } @@ -16,29 +16,31 @@ peripherals: slave_ports: - + # actual hdl name: ram_fringe_stop_step slave_prefix : FRINGE_STOP - slave_name : STEP # ram_fringe_stop_step + slave_name : STEP slave_postfix: RAM slave_type : RAM fields: - field_name : fringe_stop_step width: g_fs_step_w - address_length: g_nof_channels + number_of_fields: g_nof_channels field_description: | "Contains the step size for all nof_channels channels." slave_discription: " " - + # actual hdl name: fringe_stop_offset slave_prefix : FRINGE_STOP - slave_name : OFFSET # fringe_stop_offset + slave_name : OFFSET slave_postfix: RAM slave_type : RAM fields: - field_name: fringe_stop_offset width: g_fs_offset_w - address_length: g_nof_channels + number_of_fields: g_nof_channels field_description: | "Contains the offset for all nof_channels channels." slave_discription: " " @@ -85,7 +87,7 @@ peripherals: synchronization with the sync-pulse can be done, using one of the BSN Monitors in the system. In the Apertif system the BSN Monitor at the input of the beamformer can be used. - The address_length of both RAMs is determined by the number of unique channels that ought to be processed. + The number_of_fields of both RAMs is determined by the number of unique channels that ought to be processed. RAM_FRINGE_STOP_OFFSET This RAM contains the offset values for all channels, ranging from Channel 0 to Channel Max-1. The width of the RAM is diff --git a/tools/oneclick/prestudy/YAML/ppsh/ppsh.peripheral.yaml b/tools/oneclick/prestudy/YAML/ppsh/ppsh.peripheral.yaml index 7fdac5ad95ed641df36c6669bc81cbe2308b132d..340e0e154f3ab6090d35f5af032e148c617383b9 100644 --- a/tools/oneclick/prestudy/YAML/ppsh/ppsh.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/ppsh/ppsh.peripheral.yaml @@ -2,20 +2,21 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : ppsh -library_description: " This is the description for the finppshge_stop library " +hdl_library_name : ppsh +hdl_library_description: " This is the description for the finppshge_stop library " peripherals: - - peripheral_component_name: ppsh + peripheral_name: ppsh parameters: - { name: g_cross_clock_domain, value: TRUE } - { name: g_st_clk_freq, value: 200 * 10**6 } slave_ports: - + # actual hdl name: reg_ppsh slave_prefix : PPSH - slave_name : PPSH # reg_ppsh + slave_name : PPSH slave_postfix: REG slave_type : REG fields: diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py index dbdde7624268f51a9c780573a19ba0fc758d03af..4409dcc785f1dd29f7eb88f9bfe23a1a5ea69f19 100755 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py @@ -65,7 +65,7 @@ class Peripheral(BaseObject): self.registers = {} # all used registers self.rams = {} # all used rams self.fifos = {} # all used fifos - self._component_name = library_config['peripheral_component_name'] + self._component_name = library_config['peripheral_name'] self.name(self._component_name) self._valid_keys = ['number_of_peripherals'] @@ -75,6 +75,18 @@ class Peripheral(BaseObject): logger.debug("extract config for %s", self.component_name()) self.extract_config() + def get_slave(self, name): + for reg in self.registers.values(): + if name == reg.name() or reg.user_defined_name(): + return reg + for ram in self.rams.values(): + if name == ram.name() or ram.user_defined_name(): + return ram + for fifo in self.fifos.values(): + if name == fifo.name() or fifo.user_defined_name(): + return fifo + return None + def component_name(self): """ get component_name """ return self._component_name @@ -113,6 +125,17 @@ class Peripheral(BaseObject): return return self._parameters[key] + def set_user_defined_slavename(self, slave_nr, name): + """ set user defined slave name """ + slave_key = 'slave_{}'.format(slave_nr) + if slave_key in self.registers: + self.registers[slave_key].user_defined_name(name) + elif slave_key in self.rams: + self.rams[slave_key].user_defined_name(name) + elif slave_key in self.fifos: + self.fifos[slave_key].user_defined_name(name) + else: + logger.error("Unknown slave number") def extract_config(self): """ extract all kv pairs from the config (yaml file) @@ -162,6 +185,8 @@ class Peripheral(BaseObject): name = parameter_set['name'] value = parameter_set['value'] logger.debug("eval of name=%s and value=%s not posible", name, value) + + logger.info("used parameters=%s", str(self._parameters)) if 'slave_ports' in self._config: @@ -170,7 +195,7 @@ class Peripheral(BaseObject): if not isinstance(slave_ports, list): logger.error("slave_ports not a list") - for slave_info in slave_ports: + for slave_nr, slave_info in enumerate(slave_ports): logger.debug("slave_prefix=%s, slave_name=%s, slave_postfix=%s", slave_info['slave_prefix'], slave_info['slave_name'], slave_info['slave_postfix']) @@ -184,7 +209,7 @@ class Peripheral(BaseObject): slave_name = '.'.join(slave_name) if slave_info['slave_type'] in ('REG', 'RAM'): - number_of_slaves = self._eval(slave_info.get('number_of_slaves', DEFAULT_NUMBER_OF_SLAVES)) + number_of_slaves = slave_info.get('number_of_slaves', DEFAULT_NUMBER_OF_SLAVES) fields = {} if 'fields' in slave_info: for field_info in slave_info['fields']: @@ -205,16 +230,14 @@ class Peripheral(BaseObject): field.side_effect(val) elif key == 'address_offset': field.address_offset(val) - elif key == 'address_length': - field.address_length(val) + elif key == 'number_of_fields': + field.number_of_fields(val) elif key == 'reset_value': field.reset_value(val) elif key == 'software_value': field.software_value(val) elif key == 'radix': field.radix(val) - elif key == 'number_of_fields': - field.number_of_fields(self._eval(val)) elif key == 'field_description': field.field_description(val) else: @@ -225,9 +248,9 @@ class Peripheral(BaseObject): logger.error("field '%s' not succesfull added to fields", field_name) if slave_info['slave_type'] == 'RAM': - self.add_ram(slave_name, fields, number_of_slaves) + self.add_ram(slave_nr, slave_name, fields, number_of_slaves) else: - self.add_register(slave_name, fields, number_of_slaves) + self.add_register(slave_nr, slave_name, fields, number_of_slaves) if 'slave_description' in slave_info: self.update_args({'slave_description': slave_info['slave_description']}) @@ -248,18 +271,23 @@ class Peripheral(BaseObject): _val = str(val) # first replace all knowns parameter names with its assigned value for key1, val1 in self._parameters.items(): - logger.debug("key1={}, val1={}".format(key1, val1)) + #logger.debug("key1={}, val1={}".format(key1, val1)) # if val is a dict, in vhdl it's a struct if isinstance(val1, dict): for key2, val2 in val1.items(): key = "{}.{}".format(key1, key2) - logger.debug("replace %s with %s", key, str(val2)) + #logger.debug("replace %s with %s", key, str(val2)) _val = _val.replace(key, str(val2)) else: - logger.debug("replace %s with %s", key1, str(val1)) + #logger.debug("replace %s with %s", key1, str(val1)) _val = _val.replace(key1, str(val1)) #logger.debug("_val={}".format(_val)) - result = eval(_val) + try: + result = eval(_val) + if isinstance(result, float): + result = int(result) + except NameError: + result = _val logger.debug("_eval(%s) returns eval(%s) = %s", str(val), _val, str(result)) return result @@ -268,19 +296,43 @@ class Peripheral(BaseObject): """ self._parameters[name] = value - def add_register(self, name, fields, number_of_slaves): + def add_register(self, slave_nr, name, fields, number_of_slaves): """ add register to peripheral """ register = Register(name, fields) register.number_of_slaves(number_of_slaves) - self.registers[name] = register + self.registers['slave_{}'.format(slave_nr)] = register - def add_ram(self, name, fields, number_of_slaves): + def add_ram(self, slave_nr, name, fields, number_of_slaves): """ add RAM to peripheral """ ram = RAM(name, fields) ram.number_of_slaves(number_of_slaves) - self.rams[name] = ram + self.rams['slave_{}'.format(slave_nr)] = ram + + def add_fifo(self, slave_nr, name, fields, number_of_slaves): + """ add FIFO to peripheral + """ + fifo = FIFO(name, fields) + fifo.number_of_slaves(number_of_slaves) + self.fifo['slave_{}'.format(slave_nr)] = fifo + + + def eval_fields(self, fields): + # Evaluate the fields. + # ['number_of_fields', 'width', 'bit_offset', 'access_mode', 'side_effect', + # 'address_offset', 'reset_value', 'software_value', 'radix', 'field_description'] + + for field in fields.values(): + field.width(val=self._eval(field.width())) + field.bit_offset(val=self._eval(field.bit_offset())) + field.access_mode(val=self._eval(field.access_mode())) + field.side_effect(val=self._eval(field.side_effect())) + field.address_offset(val=self._eval(field.address_offset())) + field.number_of_fields(val=self._eval(field.number_of_fields())) + field.reset_value(val=self._eval(field.reset_value())) + field.software_value(val=self._eval(field.software_value())) + field.radix(val=self._eval(field.radix())) def eval_ram(self): """Evaluate the parameters and the nof_inst of the peripheral in order to define the @@ -290,9 +342,10 @@ class Peripheral(BaseObject): for ram in self.rams.values(): # Evaluate the fields and see if there are field that have to be repeated. - for field in ram.fields.values(): - field.address_length(val=ceil_pow2(self._eval(field.address_length()))) - field.width(val=self._eval(field.width())) + + self.eval_fields(ram.fields) + + ram.number_of_slaves(val=self._eval(ram.number_of_slaves())) ram_name = [] if self.prefix() not in (None, ''): @@ -302,7 +355,7 @@ class Peripheral(BaseObject): fields_eval = {} for peri_nr in range(self.number_of_peripherals()): - _field_name = ['', '', '', '', ''] + _field_name = ['', '', '', ''] if self.number_of_peripherals() > 1: _field_name[1] = ".{}".format(peri_nr) for ram_nr in range(ram.number_of_slaves()): @@ -310,13 +363,12 @@ class Peripheral(BaseObject): _field_name[2] = ".{}".format(ram_nr) for field_name, field in ram.fields.items(): _field_name[0] = field_name - for field_nr in range(field.number_of_fields()): - if field.number_of_fields() > 1: - _field_name[3] = ".{}".format(field_nr) - _field = deepcopy(field) - _field.name("{}{}{}{}{}".format(*_field_name).strip()) - fields_eval[_field.name()] = _field + _field = deepcopy(field) + _field.name("{}{}{}{}".format(*_field_name).strip()) + fields_eval[_field.name()] = _field ram.fields = fields_eval # Update the fields with evaluated fields + ram.update_address_length() # Estimate the new address_length after evaluation of the fields and nof_inst + logger.debug(" %s address_length: %d", ram.name(), ram.address_length()) def eval_register(self): @@ -329,9 +381,9 @@ class Peripheral(BaseObject): for register in self.registers.values(): register.number_of_slaves(val=self._eval(register.number_of_slaves())) # Evaluate the fields and see if there are field that have to be repeated. - for field in register.fields.values(): - field.address_length(val=ceil_pow2(self._eval(field.address_length()))) - field.width(val=self._eval(field.width())) + self.eval_fields(register.fields) + + register.number_of_slaves(val=self._eval(register.number_of_slaves())) register_name = [] if self.prefix() not in (None, ''): @@ -342,7 +394,7 @@ class Peripheral(BaseObject): fields_eval = {} offset = 0 for peri_nr in range(self.number_of_peripherals()): - _field_name = ['', '', '', '', ''] + _field_name = ['', '', '', ''] if self.number_of_peripherals() > 1: _field_name[1] = ".{}".format(peri_nr) for reg_nr in range(register.number_of_slaves()): @@ -350,14 +402,11 @@ class Peripheral(BaseObject): _field_name[2] = ".{}".format(reg_nr) for field_name, field in register.fields.items(): _field_name[0] = field_name - for field_nr in range(field.number_of_fields()): - if field.number_of_fields() > 1: - _field_name[3] = ".{}".format(field_nr) - _field = deepcopy(field) - _field.name("{}{}{}{}{}".format(*_field_name).strip()) - _field.address_offset(offset) - offset += 1 - fields_eval[_field.name()] = _field + _field = deepcopy(field) + _field.name("{}{}{}{}".format(*_field_name).strip()) + _field.address_offset(offset) + offset += 1 + fields_eval[_field.name()] = _field register.fields = fields_eval # Update the fields with evaluated fields @@ -403,9 +452,9 @@ class Peripheral(BaseObject): logger.info(" %-20s:", _name) #if field.number_of_fields() > 1: # logger.info(" number_of_fields=%s", str(field.number_of_fields())) - logger.info(" width=%-2s address_length=%s", + logger.info(" width=%-2s number_of_fields=%s", str(field.width()), - str(field.address_length())) + str(field.number_of_fields())) for reg in self.registers.values(): #logger.debug("reg_fields=%s", str(reg.fields)) @@ -432,8 +481,8 @@ class Peripheral(BaseObject): str(field.width()), field.address_offset(), field.access_mode(), str(field.reset_value()), field.radix()) - logger.info(" bit_offset=%-2s address_length=%-4s side_effect=%-4s software_value=%-4s", - str(field.bit_offset()), str(field.address_length()), + logger.info(" bit_offset=%-2s number_of_fields=%-4s side_effect=%-4s software_value=%-4s", + str(field.bit_offset()), str(field.number_of_fields()), field.side_effect(), str(field.software_value())) logger.info(" parameters:") diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py index b51708d570b39a00fe7b9beb123f58d15d557b33..cafaf7a4e50024c51b3b69a0693cbc298838236f 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py @@ -29,9 +29,10 @@ logger = logging.getLogger('main.peripheral') class BaseObject(object): def __init__(self): - self.success = True - self._name = "" - self._prefix = "" + self.success = True + self._name = "" + self._user_defined_name = None + self._prefix = "" self._args = {} def update_args(self, args): @@ -87,6 +88,13 @@ class BaseObject(object): return return self._name + def user_defined_name(self, val=None): + """ set/get user_defined_name """ + if val is not None: + self._user_defined_name = val + return + return self._user_defined_name + def prefix(self, val=None): """ set/get prefix """ if val is not None: diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py index 6e58158e3ec1254a44adebbfd11b067169255646..dc279e6d6cda20ee1d48a81776400842f0d96691 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py @@ -1,4 +1,5 @@ -""" +"""P1eter;) + Constants used by peripheral.py and system.py this constants can be used in the yaml files """ @@ -13,16 +14,17 @@ VALID_RADIXS = ['UNSIGNED', 'SIGNED', 'HEXADECIMAL'] DEFAULT_NUMBER_OF_PERIPHERALS = 1 DEFAULT_NUMBER_OF_SLAVES = 1 -DEFAULT_NUMBER_OF_FIELDS = 1 - -DEFAULT_WIDTH = c_word_w -DEFAULT_BIT_OFFSET = 0 -DEFAULT_ACCESS_MODE = 'RW' -DEFAULT_SIDE_EFFECT = None -DEFAULT_ADDRESS_OFFSET = 0 -DEFAULT_ADDRESS_LENGTH = 1 -RESET_VALUE = 0 -DEFAULT_SOFTWARE_VALUE = 0 -DEFAULT_RADIX = 'signed' -DEFAULT_DESCRIPTION = 'none' + +DEFAULT_WIDTH = c_word_w +DEFAULT_BIT_OFFSET = 0 +DEFAULT_ACCESS_MODE = 'RW' +DEFAULT_SIDE_EFFECT = None +DEFAULT_ADDRESS_OFFSET = 0 +DEFAULT_NUMBER_OF_FIELDS = 1 +RESET_VALUE = 0 +DEFAULT_SOFTWARE_VALUE = 0 +DEFAULT_RADIX = 'signed' +DEFAULT_DESCRIPTION = 'none' + +DEFAULT_ADDRESS_LENGTH = 1 diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py index 35291a0a0a56f040174dec32f47e70f33369b914..7d8b5f013efd64d99c47f92bae6397ffd153e266 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py @@ -39,7 +39,7 @@ class Field(BaseObject): super().__init__() self.name(name) self._valid_keys = ['number_of_fields', 'width', 'bit_offset', 'access_mode', 'side_effect', 'address_offset', - 'address_length', 'reset_value', 'software_value', 'radix', 'field_description'] + 'reset_value', 'software_value', 'radix', 'field_description'] self._args.update({'number_of_fields' : DEFAULT_NUMBER_OF_FIELDS, 'width' : DEFAULT_WIDTH, @@ -47,7 +47,6 @@ class Field(BaseObject): 'access_mode' : DEFAULT_ACCESS_MODE, 'side_effect' : DEFAULT_SIDE_EFFECT, 'address_offset' : DEFAULT_ADDRESS_OFFSET, - 'address_length' : DEFAULT_ADDRESS_LENGTH, 'reset_value' : RESET_VALUE, 'software_value' : DEFAULT_SOFTWARE_VALUE, 'radix' : DEFAULT_RADIX, @@ -109,12 +108,13 @@ class Field(BaseObject): val: if not None and a valid side_effect set side_effect of field return: actual side_effect of field """ if val is not None: - if val.upper() in VALID_SIDE_EFFECTS: - return self.set_kv('side_effect', val.upper()) - else: - logger.error("unknown side_effect '%s'", val) - self.success = False - return False + if val.upper() != 'NONE': + if val.upper() in VALID_SIDE_EFFECTS: + return self.set_kv('side_effect', val.upper()) + else: + logger.error("unknown side_effect '%s'", val) + self.success = False + return False return self._as_str('side_effect').upper() def address_offset(self, val=None): @@ -125,14 +125,6 @@ class Field(BaseObject): return self.set_kv('address_offset', val) return self._as_int('address_offset') - def address_length(self, val=None): - """ set/get address length of field - val: if not None set address length of field - return: active address_length of field """ - if val is not None: - return self.set_kv('address_length', val) - return self._as_int('address_length') - def reset_value(self, val=None): """ set/get default hardware reset value of field val: if not None set default value of field @@ -168,4 +160,15 @@ class Field(BaseObject): return: description of field """ if val is not None: return self.set_kv('field_description', val) - return self._as_str('field_discription') \ No newline at end of file + return self._as_str('field_discription') + + # TODO: calc size in bytes + # def get_byte_size(self): + + #def address_length(self, val=None): + # """ set/get address length of field + # val: if not None set address length of field + # return: active address_length of field """ + # if val is not None: + # return self.set_kv('address_length', val) + # return self._as_int('address_length') \ No newline at end of file diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py index 05366354d21cbe763d40bd36a006b13cee1d9728..07b17b5755597b0136de701283e10c8a166fa8dd 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py @@ -39,7 +39,7 @@ class FIFO(object): """ A FIFO is a specific set of Fields """ def __init__(self, name, settings): - self.number_offifos = 1 + self.number_of_fifos = 1 fifo_fields = {} fifo_fields["fifo_status"] = Field(name="fifo_status", settings={ diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py index def44030d0fad20e56663ac0070391eccbc25a79..67f4f45e5c1a476ccf0951ad07c7139f60bd05f0 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py @@ -58,7 +58,7 @@ class RAM(BaseObject): field = Field(name, settings) if field.success: self.fields[name] = Field(name, settings) - self.update_address_length() + #self.update_address_length() return True return False @@ -69,6 +69,14 @@ class RAM(BaseObject): return n_words = 0 for field in self.fields.values(): - n_words += int(ceil(float(field.width()) / c_word_w)) + n_words += int(ceil(float(field.width()) / c_word_w)) * field.number_of_fields() self.set_kv('address_length', n_words) + + def address_length(self, val=None): + """ set/get address_length of register + val: if not None set address_length of register + return: address_length of register """ + if val is not None: + return self.set_kv('address_length', val) + return self._as_int('address_length', default=1) \ No newline at end of file diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py index 9d29d9cc4186b9cfe35633fe057f549a0ede7c3f..e197bfbfb834fbf14987e98d8887944951972478 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py @@ -38,6 +38,7 @@ class Register(BaseObject): """ def __init__(self, name, fields=None, settings=None): super().__init__() + self.name(name) self.fields = {} if fields is None else fields @@ -48,7 +49,8 @@ class Register(BaseObject): 'address_length' : DEFAULT_ADDRESS_LENGTH, 'slave_discription': DEFAULT_DESCRIPTION}) - self.update_address_length() + #self.update_address_length() + def number_of_slaves(self, val=None): """ set/get number of slaves """ @@ -63,7 +65,7 @@ class Register(BaseObject): field = Field(name, settings) if field.success: self.fields[name] = field - self.update_address_length() + #self.update_address_length() return True return False @@ -74,7 +76,7 @@ class Register(BaseObject): return n_words = 0 for field in self.fields.values(): - n_words += int(ceil(float(field.width()) / c_word_w)) + n_words += int(ceil(float(field.width()) / c_word_w)) * field.number_of_fields() self.set_kv('address_length', n_words) # ceil_pow2(n_words)) diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/rom_system.py b/tools/oneclick/prestudy/YAML/py_mm_lib/rom_system.py index 4c3eb35cd2f4ce5666cb5ac18ee07c2b4bb3eea3..bad79ce2773ccffd62e1783f92fcaeded761dae5 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/rom_system.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/rom_system.py @@ -164,25 +164,29 @@ class RomSystem(object): peripheral = peripherals['reg_system_info'] #print(peripheral.registers) base_address = int(peripheral.parameter('lock_base_address')) - size = int(peripheral.registers['.REG_SYSTEM_INFO.'].fields['field_reg_info'].get_kv('address_length')) # TODO: if not available calculate real size + size = int(peripheral.get_slave('reg_system_info').fields['field_reg_info'].number_of_fields()) # TODO: if not available calculate real size memory_mapper.add(name="REG_SYSTEM_INFO", size=size, nof_instances=1, base_address=base_address) peripheral = peripherals['rom_system_info'] base_address = int(peripheral.parameter('lock_base_address')) - size = int(peripheral.registers['.ROM_SYSTEM_INFO.'].fields['field_rom_info'].get_kv('address_length')) # TODO: if not available calculate real size + size = int(peripheral.get_slave('rom_system_info').fields['field_rom_info'].number_of_fields()) # TODO: if not available calculate real size memory_mapper.add(name="ROM_SYSTEM_INFO", size=size, nof_instances=1, base_address=base_address) size_info = [] for peripheral in peripherals.values(): nof_peri_inst = peripheral.number_of_peripherals() for rkey, rval in peripheral.rams.items(): + #n_addresses = rval.get_kv('address_length') n_addresses = 0 for fkey, fval in rval.fields.items(): # n_words = width in bits rounded up to wordt_size bits n_words = int(ceil(float(fval.width()) / self.word_size)) - n_addresses += n_words * fval.address_length() + n_addresses += n_words * fval.number_of_fields() nof_inst = rval.number_of_slaves() * peripheral.number_of_peripherals() - _name = rval.name() + if rval.user_defined_name() is not None: + _name = rval.user_defined_name() + else: + _name = rval.name() #print("%s %s" % (str(rkey), str(n_addresses))) size_info.append([n_addresses, nof_inst, _name]) @@ -190,12 +194,15 @@ class RomSystem(object): n_addresses = 0 n_words = 0 for fkey, fval in rval.fields.items(): - n_words = max(n_words, int(ceil(float(fval.width()) / self.word_size))) + n_words = max(n_words, int(ceil(float(fval.width()) / float(self.word_size)))) n_addresses = max(n_addresses, fval.address_offset()) n_addresses += 1 nof_inst = rval.number_of_slaves() * peripheral.number_of_peripherals() - _name = rval.name() + if rval.user_defined_name() is not None: + _name = rval.user_defined_name() + else: + _name = rval.name() if _name.upper() in ('.REG_SYSTEM_INFO.', '.ROM_SYSTEM_INFO.', 'REG_SYSTEM_INFO', 'ROM_SYSTEM_INFO'): continue #print("%s %s" % (str(rkey), str(n_addresses * n_words))) diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/system.py b/tools/oneclick/prestudy/YAML/py_mm_lib/system.py index 227a01ca493bebb7f271cc8b9ff211aca0826556..00849993d4023b001323911801361eb5609eb576 100755 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/system.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/system.py @@ -76,7 +76,7 @@ class System(object): """ Create a system object based on the information in the system_config """ logger.debug("Creating system") logger.debug("Instantiating the peripherals from the peripheral Library") - self.system_name = self.system_config['library_name'] + self.system_name = self.system_config['hdl_library_name'] config = self.system_config if "system_description" in config: @@ -120,8 +120,8 @@ class System(object): for peripheral_config in config['peripherals']: # (Deep)Copy the peripheral from the library in order to avoid creating a reference - component_name = peripheral_config['peripheral_component_name'] - component_prefix = peripheral_config['peripheral_prefix'] + component_name = peripheral_config['peripheral_name'] + component_prefix = peripheral_config['subsystem_name'] number_of_peripherals = int(self._eval(peripheral_config.get('number_of_peripherals', 1))) peripheral_from_lib = copy.deepcopy(self.peri_lib.find_peripheral(component_name)) @@ -129,7 +129,7 @@ class System(object): logger.warning("component_name '%s' not found in library", component_name) continue - logger.debug(" Finding %s", peripheral_from_lib.name) + logger.debug(" Finding %s", peripheral_from_lib.name()) if 'parameters' in peripheral_config: logger.debug("parameters={}".format(peripheral_config['parameters'])) @@ -138,11 +138,12 @@ class System(object): value = parameter_set['value'] peripheral_from_lib.parameter(key=name, val=self._eval(value)) - #peripheral_from_lib.set_nof_instances(nof_instances) - #for i in range(nof_instances): - # _system_name = system_name - # if nof_instances > 1: - # _system_name = "{}{}".format(system_name,i) + + if 'slave_port_names' in peripheral_config: + logger.debug("slave_port_names={}".format(peripheral_config['slave_port_names'])) + for slave_nr, slave_port_name in enumerate(peripheral_config['slave_port_names']): + peripheral_from_lib.set_user_defined_slavename(slave_nr, slave_port_name) + peripheral_from_lib.number_of_peripherals(number_of_peripherals) peripheral_from_lib.prefix(component_prefix) peripheral_name = [] diff --git a/tools/oneclick/prestudy/YAML/work/system_info.peripheral.yaml b/tools/oneclick/prestudy/YAML/work/system_info.peripheral.yaml index 9d08ba685ad624a573cfc1efd7ed13647763ce39..dc30116ca3bc74b18bcd9266e538e46eb02a14d8 100644 --- a/tools/oneclick/prestudy/YAML/work/system_info.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/work/system_info.peripheral.yaml @@ -2,27 +2,28 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : system_info -library_description: " This is the description for the system_info library " +hdl_library_name : system_info +hdl_library_description: " This is the description for the system_info library " peripherals: - - peripheral_component_name: rom_system_info + peripheral_name: rom_system_info parameters: - { name: lock_base_address, value: 0x1000 } slave_ports: - - slave_prefix : - slave_name : ROM_SYSTEM_INFO # rom_system_info - slave_postfix: + # rom_system_info + slave_prefix : WORK + slave_name : ROM_SYSTEM_INFO + slave_postfix: REG slave_type : REG fields: - field_name : field_rom_info access_mode : RO address_offset: 0x0 - address_length: 4096 + number_of_fields: 4096 field_description: | "address place for rom_system_info" slave_description: " rom_info " @@ -30,22 +31,23 @@ peripherals: peripheral_description: | " settings for rom_system_info register " - - peripheral_component_name: reg_system_info + peripheral_name: reg_system_info parameters: - { name: lock_base_address, value: 0x0 } slave_ports: - - slave_prefix : - slave_name : REG_SYSTEM_INFO # reg_system_info - slave_postfix: + # reg_system_info + slave_prefix : WORK + slave_name : REG_SYSTEM_INFO + slave_postfix: REG slave_type : REG fields: - field_name : field_reg_info access_mode : RO address_offset: 0x0 - address_length: 128 + number_of_fields: 128 field_description: | "address place for reg_system_info" slave_description: " reg_info " diff --git a/tools/oneclick/prestudy/YAML/work/work.peripheral.yaml b/tools/oneclick/prestudy/YAML/work/work.peripheral.yaml index ecc081aa1678c9d33d58690ae6fc5bed65563219..610bb3516dbb0bcf9e252f67e22f11162dedabdf 100644 --- a/tools/oneclick/prestudy/YAML/work/work.peripheral.yaml +++ b/tools/oneclick/prestudy/YAML/work/work.peripheral.yaml @@ -2,29 +2,30 @@ protocol_name : args protocol_version: 1.0 protocol_type : peripheral -library_name : work -library_description: " This is the description for the work package " +hdl_library_name : work +hdl_library_description: " This is the description for the work package " peripherals: - - peripheral_component_name: unb1_board_sens + peripheral_name: unb1_board_sens parameters: - { name: g_temp_high, value: 85 } slave_ports: - + # actual hdl name: reg_unb1_sens slave_prefix : WORK - slave_name : UNB1_SENS # reg_unb1_sens + slave_name : UNB1_SENS slave_postfix: REG slave_type : REG fields: - field_name : sens_data width : 8 - access_mode : R + access_mode : RO address_offset: 0x0 - address_length: 4 + number_of_fields: 4 field_description: | " data array with sens data 0x0 = fpga temperature in degrees (two's complement) @@ -34,7 +35,7 @@ peripherals: - field_name : sens_err width : 1 - access_mode : R + access_mode : RO address_offset: 0x4 radix : unsigned field_description: | @@ -43,7 +44,8 @@ peripherals: field_name : temp_high width : 7 address_offset: 0x5 - default_value : g_temp_high + reset_value : g_temp_high + software_value: g_temp_high field_description: | "" slave_description: " "