peakrdl-python 3.1.2__tar.gz → 4.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/.github/workflows/action.yaml +35 -26
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/.gitignore +1 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/PKG-INFO +21 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/README.md +19 -0
- peakrdl_python-4.0.0/docs/generated_package/callbacks.rst +113 -0
- peakrdl_python-4.0.0/docs/generated_package/output_structure.rst +132 -0
- peakrdl_python-4.0.0/docs/generated_package/using_ral.rst +458 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/index.rst +12 -4
- peakrdl_python-4.0.0/example/fifo_register_example/demo_fifo_register_example.py +83 -0
- peakrdl_python-4.0.0/example/fifo_register_example/fifo_register_example.rdl +13 -0
- peakrdl_python-4.0.0/example/write_only_registers/demo_write_only_registers.py +115 -0
- peakrdl_python-4.0.0/example/write_only_registers/write_only_registers.rdl +27 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/generate_and_test.py +2 -19
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/generate_testcases.py +2 -18
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/pyproject.toml +1 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/__about__.py +2 -2
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/__init__.py +3 -4
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/__peakrdl__.py +9 -20
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/_deploy_package.py +4 -3
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/_node_walkers.py +4 -3
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/class_names.py +4 -5
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/compiler_udp.py +8 -6
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/exporter.py +32 -113
- peakrdl_python-4.0.0/src/peakrdl_python/lib/__init__.py +64 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/async_memory.py +30 -320
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/async_register_and_field.py +385 -256
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/base.py +10 -9
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/base_field.py +40 -31
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/base_register.py +51 -7
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/callbacks.py +18 -166
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/field_encoding.py +3 -3
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/memory.py +25 -341
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/register_and_field.py +319 -218
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/sections.py +33 -41
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/utility_functions.py +1 -29
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/__init__.py +3 -5
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/_async_base_test_class.py +2 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/_base_test_class.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/_common_base_test_class.py +38 -54
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/async_field_test_class.py +14 -15
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/async_mem_test_class.py +36 -128
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/async_reg_test_class.py +78 -21
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/async_test_class.py +3 -2
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/field_test_class.py +14 -16
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/mem_test_class.py +28 -126
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/reg_test_class.py +89 -35
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/test_class.py +3 -2
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib_test/utilities.py +13 -14
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/safe_name_utility.py +6 -19
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/_callbacks.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/base.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/dummy_callbacks.py +1 -87
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/field.py +2 -5
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/memory.py +2 -2
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/register.py +7 -6
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/simulator.py +5 -106
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/systemrdl_node_hashes.py +20 -20
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/systemrdl_node_utility_functions.py +6 -12
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/__init__.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap.py.jinja +11 -13
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_field.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_memory.py.jinja +8 -9
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_register.py.jinja +35 -19
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_simulation.py.jinja +4 -4
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_simulation_tb.py.jinja +5 -20
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_system_rdl_name_mapping.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_tb.py.jinja +16 -175
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_udp_property.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/addrmap_universal_property.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/baseclass_simulation_tb.py.jinja +4 -5
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/baseclass_tb.py.jinja +15 -49
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/child_definitions.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/example.py.jinja +3 -3
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/field_enums.py.jinja +3 -9
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/header.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/header_tb.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/property_enums.py.jinja +3 -8
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/reg_definitions.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/templates/template_ultilities.py.jinja +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/unique_component_iterator.py +46 -18
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/PKG-INFO +21 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/SOURCES.txt +7 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_dynamic_toml/header_check.py +1 -2
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_toml/header_check.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/pathological_register_maps/pathological_rdl_builder.py +12 -10
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/basic.rdl +4 -4
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/name_clash.rdl +2 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/__init__.py +1 -1
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/simple_components.py +28 -35
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_array_indexing.py +5 -5
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_building_inner_addrmap.py +8 -14
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_export.py +11 -155
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_field.py +34 -39
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_name_desc_export.py +6 -13
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_optimised_reg_array.py +8 -6
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_reg.py +236 -58
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_sim.py +8 -10
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/unit_tests/test_system_rdl_enum.py +3 -1
- peakrdl_python-3.1.2/docs/generated_package.rst +0 -653
- peakrdl_python-3.1.2/src/peakrdl_python/lib/__init__.py +0 -121
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/.readthedocs.yaml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/LICENSE +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/MANIFEST.in +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/api.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/api_components.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/command_line.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/conf.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/customisation.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/design_decisions.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/design_tools.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/genindex.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/installation.rst +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/docs/requirements.txt +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/array_access/array_access.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/array_access/demo_array_access.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/enumerated_fields/demo_enumerated_fields.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/enumerated_fields/enumerated_fields.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/optimised_access/demo_optimised_access.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/optimised_access/demo_optimised_array_access.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/optimised_access/optimised_access.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/optimised_access/optimised_array_access.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/overridden_names/demo_over_ridden_names.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/overridden_names/overridden_names.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/simulating_callbacks/chip_with_a_GPIO.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/simulating_callbacks/flashing_the_LED.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/tranversing_address_map/chip_with_registers.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/tranversing_address_map/dumping_register_state_to_json_file.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/tranversing_address_map/reg_dump.json +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/tranversing_address_map/reseting_registers.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/tranversing_address_map/writing_register_state_from_json_file.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/user_defined_properties/demo_user_defined_properties.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/user_defined_properties/user_defined_properties.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/why_ral/__init__.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/why_ral/gpio.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/why_ral/with_hal.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/why_ral/with_ral.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/example/why_ral/without_ral.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/setup.cfg +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/.coveragerc +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/lib/py.typed +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/py.typed +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/__init__.py +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python/sim_lib/py.typed +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/dependency_links.txt +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/entry_points.txt +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/requires.txt +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/src/peakrdl_python.egg-info/top_level.txt +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates/header.py.jinja +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates/header_tb.py.jinja +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_dynamic/header.py.jinja +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_dynamic/header_tb.py.jinja +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_dynamic_toml/peakrdl.toml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/alternative_templates_toml/peakrdl.toml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/pathological_register_maps/templates/pathological_template.rdl.jinja +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/RDLFormatCode_example.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/addr_map.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/aliases.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/all_register_access_types.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/block_a.xml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/block_b.xml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/deduplicated_field.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/different_array_types.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/enum_example.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/example_issue_106.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/extended_memories.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/extended_sizes_registers_array.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/field_scope.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/field_with_overridden_reset.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/fields_with_HW_write.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/fields_with_reset_values.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/hidden_property.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/large_field_combinations.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/memories.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/memories_with_registers.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/msb0_and_lsb0.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/multi_block.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/multifile.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/name_desc_all_levels.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/name_desc_option_deduplicate.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/name_desc_stress_test.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/overlapping_registers_and_fields.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/overridden_python_name.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/parametrised_readonly_and_readwrite.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/parametrised_top.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/reg_name_stress.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/regfile_and_arrays.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/reserved_elements.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/same_but_different_enum.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/signals_definitions_at_various_levels.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/simple.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/simple.xml +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/simulator_test.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/sizes_registers.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/sizes_registers_array.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/sparse_enum_issue_200.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/udp_with_referencing.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/user_defined_properties.rdl +0 -0
- {peakrdl_python-3.1.2 → peakrdl_python-4.0.0}/tests/testcases/write_only_enum_with_undefined_reset.rdl +0 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# This is a basic workflow to help you get started with Actions
|
|
2
2
|
|
|
3
3
|
name: CI
|
|
4
|
-
permissions:
|
|
5
|
-
contents: read
|
|
6
4
|
|
|
7
5
|
# Controls when the action will run.
|
|
8
6
|
on:
|
|
@@ -22,6 +20,10 @@ on:
|
|
|
22
20
|
# Allows you to run this workflow manually from the Actions tab
|
|
23
21
|
workflow_dispatch:
|
|
24
22
|
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
id-token: write
|
|
26
|
+
|
|
25
27
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
26
28
|
jobs:
|
|
27
29
|
lint:
|
|
@@ -74,7 +76,7 @@ jobs:
|
|
|
74
76
|
runs-on: ubuntu-latest
|
|
75
77
|
strategy:
|
|
76
78
|
matrix:
|
|
77
|
-
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14" ]
|
|
79
|
+
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15" ]
|
|
78
80
|
|
|
79
81
|
steps:
|
|
80
82
|
- uses: actions/checkout@v5
|
|
@@ -104,7 +106,7 @@ jobs:
|
|
|
104
106
|
runs-on: ubuntu-latest
|
|
105
107
|
strategy:
|
|
106
108
|
matrix:
|
|
107
|
-
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14" ]
|
|
109
|
+
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15" ]
|
|
108
110
|
|
|
109
111
|
steps:
|
|
110
112
|
- uses: actions/checkout@v5
|
|
@@ -140,10 +142,6 @@ jobs:
|
|
|
140
142
|
|
|
141
143
|
python -m generate_and_test --RDL_source_file tests/testcases/accelera-generic_example.rdl --root_node some_register_map
|
|
142
144
|
sleep 10
|
|
143
|
-
python -m generate_and_test --RDL_source_file tests/testcases/accelera-generic_example.rdl --root_node some_register_map --legacy_block_access
|
|
144
|
-
sleep 10
|
|
145
|
-
python -m generate_and_test --RDL_source_file tests/testcases/accelera-generic_example.rdl --root_node some_register_map --legacy_enum_type
|
|
146
|
-
sleep 10
|
|
147
145
|
python -m generate_and_test --RDL_source_file tests/testcases/accelera-generic_example.rdl --root_node some_register_map --copy_libraries
|
|
148
146
|
sleep 10
|
|
149
147
|
python -m generate_and_test --RDL_source_file tests/testcases/accelera-generic_example.rdl --root_node some_register_map --hashing_mode PYTHONHASH
|
|
@@ -181,7 +179,7 @@ jobs:
|
|
|
181
179
|
runs-on: ubuntu-latest
|
|
182
180
|
strategy:
|
|
183
181
|
matrix:
|
|
184
|
-
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14" ]
|
|
182
|
+
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15" ]
|
|
185
183
|
|
|
186
184
|
steps:
|
|
187
185
|
- uses: actions/checkout@v5
|
|
@@ -214,16 +212,11 @@ jobs:
|
|
|
214
212
|
peakrdl python tests/testcases/hidden_property.rdl -o peakrdl_out/raw_async/ --async
|
|
215
213
|
peakrdl python tests/testcases/hidden_property.rdl -o peakrdl_out/raw_async/show_hidden/ --show_hidden --async
|
|
216
214
|
python -m unittest discover -s peakrdl_out/raw_async
|
|
217
|
-
|
|
218
|
-
python -m unittest discover -s peakrdl_out/raw_legacy_block
|
|
219
|
-
|
|
215
|
+
|
|
220
216
|
peakrdl python tests/testcases/basic.rdl -o peakrdl_out/no_test/ --skip_test_case_generation
|
|
221
217
|
|
|
222
218
|
peakrdl python tests/testcases/basic.rdl -o peakrdl_out/no_lib/ --skip_library_copy
|
|
223
219
|
python -m unittest discover -s peakrdl_out/no_lib
|
|
224
|
-
|
|
225
|
-
peakrdl python tests/testcases/enum_example.rdl -o peakrdl_out/raw_legacy_enum/ --legacy_enum_type
|
|
226
|
-
python -m unittest discover -s peakrdl_out/raw_legacy_enum
|
|
227
220
|
|
|
228
221
|
# test a TOMl file that passes in overridden templates
|
|
229
222
|
peakrdl python tests/testcases/basic.rdl -o peakrdl_out/simple_user_template/ --peakrdl-cfg tests/alternative_templates_toml/peakrdl.toml
|
|
@@ -295,6 +288,18 @@ jobs:
|
|
|
295
288
|
|
|
296
289
|
cd ../..
|
|
297
290
|
|
|
291
|
+
cd example/write_only_registers/
|
|
292
|
+
peakrdl python write_only_registers.rdl -o .
|
|
293
|
+
python -m demo_write_only_registers
|
|
294
|
+
|
|
295
|
+
cd ../..
|
|
296
|
+
|
|
297
|
+
cd example/fifo_register_example/
|
|
298
|
+
peakrdl python fifo_register_example.rdl -o .
|
|
299
|
+
python -m demo_fifo_register_example
|
|
300
|
+
|
|
301
|
+
cd ../..
|
|
302
|
+
|
|
298
303
|
identical_code:
|
|
299
304
|
needs:
|
|
300
305
|
- mypy
|
|
@@ -304,7 +309,7 @@ jobs:
|
|
|
304
309
|
runs-on: ubuntu-latest
|
|
305
310
|
strategy:
|
|
306
311
|
matrix:
|
|
307
|
-
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14" ]
|
|
312
|
+
python-version: [ 3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15" ]
|
|
308
313
|
|
|
309
314
|
steps:
|
|
310
315
|
- uses: actions/checkout@v5
|
|
@@ -338,7 +343,7 @@ jobs:
|
|
|
338
343
|
runs-on: ubuntu-latest
|
|
339
344
|
strategy:
|
|
340
345
|
matrix:
|
|
341
|
-
python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
346
|
+
python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
|
|
342
347
|
lib_copy: [true, false]
|
|
343
348
|
|
|
344
349
|
steps:
|
|
@@ -388,7 +393,7 @@ jobs:
|
|
|
388
393
|
runs-on: ubuntu-latest
|
|
389
394
|
strategy:
|
|
390
395
|
matrix:
|
|
391
|
-
python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
396
|
+
python-version: [3.9, "3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
|
|
392
397
|
|
|
393
398
|
steps:
|
|
394
399
|
- uses: actions/checkout@v5
|
|
@@ -480,16 +485,16 @@ jobs:
|
|
|
480
485
|
|
|
481
486
|
- name: Install dependencies
|
|
482
487
|
run: |
|
|
483
|
-
python -m pip install
|
|
488
|
+
python -m pip install --upgrade pip build
|
|
484
489
|
|
|
485
490
|
- name: Build
|
|
486
|
-
run: python -m build
|
|
491
|
+
run: python -m build --sdist --wheel --outdir dist
|
|
487
492
|
|
|
488
493
|
- uses: actions/upload-artifact@v4
|
|
489
494
|
with:
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
495
|
+
name: python-package
|
|
496
|
+
path: dist/*
|
|
497
|
+
if-no-files-found: error
|
|
493
498
|
|
|
494
499
|
#-------------------------------------------------------------------------------
|
|
495
500
|
deploy:
|
|
@@ -498,15 +503,19 @@ jobs:
|
|
|
498
503
|
|
|
499
504
|
runs-on: ubuntu-latest
|
|
500
505
|
|
|
506
|
+
permissions:
|
|
507
|
+
contents: read
|
|
508
|
+
id-token: write
|
|
509
|
+
|
|
501
510
|
# Only publish when a GitHub Release is created.
|
|
502
511
|
if: github.event_name == 'release'
|
|
503
512
|
steps:
|
|
504
513
|
- uses: actions/download-artifact@v4
|
|
505
514
|
with:
|
|
506
|
-
name:
|
|
515
|
+
name: python-package
|
|
507
516
|
path: dist
|
|
508
517
|
|
|
509
518
|
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
510
519
|
with:
|
|
511
|
-
|
|
512
|
-
|
|
520
|
+
packages-dir: dist/
|
|
521
|
+
skip-existing: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: peakrdl-python
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.0
|
|
4
4
|
Summary: Generate Python Register Access Layer (RAL) from SystemRDL
|
|
5
5
|
Author: Keith Brady
|
|
6
6
|
License: GNU LESSER GENERAL PUBLIC LICENSE
|
|
@@ -182,6 +182,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
182
182
|
Classifier: Programming Language :: Python :: 3.12
|
|
183
183
|
Classifier: Programming Language :: Python :: 3.13
|
|
184
184
|
Classifier: Programming Language :: Python :: 3.14
|
|
185
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
185
186
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
186
187
|
Classifier: Intended Audience :: Developers
|
|
187
188
|
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
|
|
@@ -341,4 +342,23 @@ the following options were changed:
|
|
|
341
342
|
This had some restrictions, so the a new methodology based on the `list` type was introduced in version 0.9.
|
|
342
343
|
The old array based behaviour is no longer the default but can be turned on using the `legacy_block_access`
|
|
343
344
|
|
|
345
|
+
## 4.0.0
|
|
346
|
+
|
|
347
|
+
some legacy features from the early versions were removed in release 4.0.0, the following options were changed:
|
|
348
|
+
- Version 1.2 introduced a new custom enumeration type (rather than using `IntEnum`) in order to allow
|
|
349
|
+
the content to `name` and `desc` systemRDL properties in be accessible. Version 4.0.0 removed the option to use `IntEnum`
|
|
350
|
+
- The first versions of PeakRDL Python used the built-in `Array` type for accessing blocks of data efficiently.
|
|
351
|
+
This had some restrictions, so a new methodology based on the `list` type was introduced in version 0.9.
|
|
352
|
+
The old array based behaviour was removed in this version
|
|
353
|
+
|
|
354
|
+
This release also improved the features for write-only register:
|
|
355
|
+
- field write operations no longer have a hard-code base value of `0` in the register, the base register value is configurable via the `write_initial_state` property
|
|
356
|
+
- the `write_fields` methods also uses the `write_initial_state` property to allow other bits in the register to be set if needed, rather than a hardcoded `0`
|
|
357
|
+
- A new `single_write` context manager can be used to set multiple field values in a single write with a configurable initial register state
|
|
358
|
+
|
|
359
|
+
The read/write register class has similar feature:
|
|
360
|
+
- A new `single_write` context manager that does not use a read before the write to set multiple field values in a single write with a configurable initial register state
|
|
361
|
+
- A new `write_all_fields_without_read` method tht will write all the writable fields with the `write_initial_state` property to allow other bits in the register to be set if needed
|
|
362
|
+
|
|
363
|
+
|
|
344
364
|
|
|
@@ -130,4 +130,23 @@ the following options were changed:
|
|
|
130
130
|
This had some restrictions, so the a new methodology based on the `list` type was introduced in version 0.9.
|
|
131
131
|
The old array based behaviour is no longer the default but can be turned on using the `legacy_block_access`
|
|
132
132
|
|
|
133
|
+
## 4.0.0
|
|
134
|
+
|
|
135
|
+
some legacy features from the early versions were removed in release 4.0.0, the following options were changed:
|
|
136
|
+
- Version 1.2 introduced a new custom enumeration type (rather than using `IntEnum`) in order to allow
|
|
137
|
+
the content to `name` and `desc` systemRDL properties in be accessible. Version 4.0.0 removed the option to use `IntEnum`
|
|
138
|
+
- The first versions of PeakRDL Python used the built-in `Array` type for accessing blocks of data efficiently.
|
|
139
|
+
This had some restrictions, so a new methodology based on the `list` type was introduced in version 0.9.
|
|
140
|
+
The old array based behaviour was removed in this version
|
|
141
|
+
|
|
142
|
+
This release also improved the features for write-only register:
|
|
143
|
+
- field write operations no longer have a hard-code base value of `0` in the register, the base register value is configurable via the `write_initial_state` property
|
|
144
|
+
- the `write_fields` methods also uses the `write_initial_state` property to allow other bits in the register to be set if needed, rather than a hardcoded `0`
|
|
145
|
+
- A new `single_write` context manager can be used to set multiple field values in a single write with a configurable initial register state
|
|
146
|
+
|
|
147
|
+
The read/write register class has similar feature:
|
|
148
|
+
- A new `single_write` context manager that does not use a read before the write to set multiple field values in a single write with a configurable initial register state
|
|
149
|
+
- A new `write_all_fields_without_read` method tht will write all the writable fields with the `write_initial_state` property to allow other bits in the register to be set if needed
|
|
150
|
+
|
|
151
|
+
|
|
133
152
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
Callbacks
|
|
2
|
+
*********
|
|
3
|
+
|
|
4
|
+
The Register Access Layer will typically interfaced to a driver that
|
|
5
|
+
allows accesses the chip.
|
|
6
|
+
|
|
7
|
+
.. tip:: The simulator generated with the register model can be used as an alternative to
|
|
8
|
+
a hardware connection
|
|
9
|
+
|
|
10
|
+
In order to operate the register access layer typically requires the following:
|
|
11
|
+
|
|
12
|
+
- A callback for a single register write, this not required if there is no writable register in
|
|
13
|
+
the register access layer
|
|
14
|
+
- A callback for a single register read, this not required if there is no writable register in
|
|
15
|
+
the register access layer
|
|
16
|
+
|
|
17
|
+
In addition the register access layer can make use of block operations where a block of the
|
|
18
|
+
address space is read in a single transaction. Not all drivers support these
|
|
19
|
+
|
|
20
|
+
The examples of these two methods are included within the generated register
|
|
21
|
+
access layer package so that it can be used from the console:
|
|
22
|
+
|
|
23
|
+
.. code-block:: python
|
|
24
|
+
|
|
25
|
+
def read_addr_space(addr: int, width: int, accesswidth: int) -> int:
|
|
26
|
+
"""
|
|
27
|
+
Callback to simulate the operation of the package, everytime the read is called, it will
|
|
28
|
+
request the user input the value to be read back.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
addr: Address to write to
|
|
32
|
+
width: Width of the register in bits
|
|
33
|
+
accesswidth: Minimum access width of the register in bits
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
value inputted by the used
|
|
37
|
+
"""
|
|
38
|
+
assert isinstance(addr, int)
|
|
39
|
+
assert isinstance(width, int)
|
|
40
|
+
assert isinstance(accesswidth, int)
|
|
41
|
+
return input('value to read from address:0x%X' % addr)
|
|
42
|
+
|
|
43
|
+
def write_addr_space(addr: int, width: int, accesswidth: int, data: int) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Callback to simulate the operation of the package, everytime the write is called, it will
|
|
46
|
+
print out the result.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
addr: Address to write to
|
|
50
|
+
width: Width of the register in bits
|
|
51
|
+
accesswidth: Minimum access width of the register in bits
|
|
52
|
+
data: value to be written to the register
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
None
|
|
56
|
+
"""
|
|
57
|
+
assert isinstance(addr, int)
|
|
58
|
+
assert isinstance(width, int)
|
|
59
|
+
assert isinstance(accesswidth, int)
|
|
60
|
+
assert isinstance(data, int)
|
|
61
|
+
print('write data:0x%X to address:0x%X' % (data, addr))
|
|
62
|
+
|
|
63
|
+
In a real system these call backs will be connected to a driver.
|
|
64
|
+
|
|
65
|
+
In addition there is also an option to use ``async`` callbacks if the package is built
|
|
66
|
+
``asyncoutput`` set to True.
|
|
67
|
+
|
|
68
|
+
Callback Set
|
|
69
|
+
============
|
|
70
|
+
|
|
71
|
+
The callbacks are passed into the register access layer using either:
|
|
72
|
+
|
|
73
|
+
* ``NormalCallbackSet`` for standard python function callbacks
|
|
74
|
+
* ``AsyncCallbackSet`` for async python function callbacks, these are called from the library using
|
|
75
|
+
``await``
|
|
76
|
+
|
|
77
|
+
Legacy Block Callback and Block Access
|
|
78
|
+
======================================
|
|
79
|
+
|
|
80
|
+
.. versionchanged:: 0.9.0
|
|
81
|
+
|
|
82
|
+
Previous versions of PeakRDL Python used the python ``array.array`` for efficiently moving blocks
|
|
83
|
+
of data. This was changed in version 0.9.0 in order to accommodate memories which were larger
|
|
84
|
+
than 64 bit wide which could not be supported as the array type only support entries of up to
|
|
85
|
+
64 bit.
|
|
86
|
+
|
|
87
|
+
.. warning::
|
|
88
|
+
The developers apologise for making a breaking change, however, not being able to fully the
|
|
89
|
+
systemRDL specification was determined to be a major limitation that needed to be addressed.
|
|
90
|
+
|
|
91
|
+
It could have left this as a future compatibility mode before making a breaking change but
|
|
92
|
+
that would just delay the pain it was felt to be better to get as many users onto the new
|
|
93
|
+
API as soon as possible whilst PeakRDL Python is in beta.
|
|
94
|
+
|
|
95
|
+
If you really want to just keep on with the array based interface and make only minimal changes
|
|
96
|
+
to existing code, there are two simple steps:
|
|
97
|
+
|
|
98
|
+
1. The northbound interfaces that are provided by the generated package expect lists of integers
|
|
99
|
+
rather than array. The old interfaces can be retained by using the ``legacy_block_access``
|
|
100
|
+
build option.
|
|
101
|
+
2. The southbound interfaces into the callbacks again need to use lists for the
|
|
102
|
+
``read_block_callback`` and ``write_block_callback`` methods. If you want to continue to use
|
|
103
|
+
the old scheme use the following callback classes which are part of the callbacks:
|
|
104
|
+
* ``NormalCallbackSetLegacy`` for standard python function callbacks
|
|
105
|
+
* ``AsyncCallbackSetLegacy`` for async python function callbacks, these are called from the library using ``await``
|
|
106
|
+
|
|
107
|
+
.. versionchanged:: 3.0.0
|
|
108
|
+
|
|
109
|
+
The ``legacy_block_access`` will now default to ``False``
|
|
110
|
+
|
|
111
|
+
.. versionchanged:: 4.0.0
|
|
112
|
+
|
|
113
|
+
The ``legacy_block_access`` was removed, the ``NormalCallbackSetLegacy`` and ``AsyncCallbackSetLegacy`` are no longer supported
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
Output Structure
|
|
2
|
+
****************
|
|
3
|
+
|
|
4
|
+
PeakRDL Python generates a python Register Access Layer (RAL) from a System RDL design. The
|
|
5
|
+
generated python code is contained in a package, structured as shown below. The ``root_name``
|
|
6
|
+
will be based on the top level address map name with the package was generated
|
|
7
|
+
|
|
8
|
+
| ``<root_name>``
|
|
9
|
+
| ├── ``lib``
|
|
10
|
+
| ├── ``lib_test``
|
|
11
|
+
| ├── ``sim_lib``
|
|
12
|
+
| ├── ``reg_model``
|
|
13
|
+
| │ └── ``<root_name>.py``
|
|
14
|
+
| ├── ``sim``
|
|
15
|
+
| │ └── ``<root_name>.py``
|
|
16
|
+
| └── ``tests``
|
|
17
|
+
| └── ``test_<root_name>.py``
|
|
18
|
+
|
|
19
|
+
In the folder structure above:
|
|
20
|
+
|
|
21
|
+
- ``<root_name>.py`` - This is the register access layer code for the design
|
|
22
|
+
- ``test_<root_name>.py`` - This is a set of autogenerated unittests to verify the register access layer (The unit test generation can be skipped, see ``skip_test_case_generation``)
|
|
23
|
+
- ``lib`` - This is a package of base classes used by the register access layer (The copy of this can be skipped, see :ref:`skipping-lib-copy`)
|
|
24
|
+
- ``lib_test`` - This is a package of base classes autogenerated unit tests (The copy of this can be skipped, see :ref:`skipping-lib-copy`)
|
|
25
|
+
- ``sim_lib`` - This is a package of base classes used by the register access layer simulator (The copy of this can be skipped, see :ref:`skipping-lib-copy`)
|
|
26
|
+
|
|
27
|
+
.. versionchanged:: 2.0.0
|
|
28
|
+
|
|
29
|
+
The ``reg_model`` was changed in version 2.0.0 to split it out into multiple modules rather
|
|
30
|
+
than building the whole register model in a single python module. This helps avoid
|
|
31
|
+
excessively large files which helps speed up the generation and loading time.
|
|
32
|
+
|
|
33
|
+
.. versionchanged:: 3.0.0
|
|
34
|
+
|
|
35
|
+
The auto-generated unit tests were changed in version 3.0.0 to split to make use
|
|
36
|
+
of a test library, which significantly reduced the size of the generated code.
|
|
37
|
+
|
|
38
|
+
Top Level Classes
|
|
39
|
+
=================
|
|
40
|
+
|
|
41
|
+
In order to use the generated packages, the Top Level Class needs to be imported.
|
|
42
|
+
|
|
43
|
+
.. versionchanged:: 2.0.0
|
|
44
|
+
|
|
45
|
+
A new class aliases were added to the ``reg_model`` and ``sim`` packages to allow the register
|
|
46
|
+
model and simulator to be imported more easily. See the example below using ``RegModel`` and
|
|
47
|
+
``Simulator``.
|
|
48
|
+
|
|
49
|
+
.. warning:: It is not recommended to import the child classes. If a sub-section of the register
|
|
50
|
+
model is all that is needed, it is better to only build the section needed.
|
|
51
|
+
|
|
52
|
+
Class Names
|
|
53
|
+
===========
|
|
54
|
+
|
|
55
|
+
PeakRDL Python generates python classes to model the parts of the register model. These can not
|
|
56
|
+
always map to the names in the code, especially if attributes are overridden. Therefore PeakRDL
|
|
57
|
+
Python generates new names.
|
|
58
|
+
|
|
59
|
+
.. versionchanged:: 2.0.0
|
|
60
|
+
|
|
61
|
+
In order to reduce duplication within the generated model a hashing algortihm is applied to the
|
|
62
|
+
nodes in the design to determine which nodes are unique. This hash is appended to the name
|
|
63
|
+
of all the python classes in the register model
|
|
64
|
+
|
|
65
|
+
.. versionadded:: 2.1.0
|
|
66
|
+
|
|
67
|
+
There are two possible algorithms for the hashing, this is selectable by the user:
|
|
68
|
+
|
|
69
|
+
* The builtin python ``hash`` function, this is fast but is a salted hash so changes hashes export to
|
|
70
|
+
export
|
|
71
|
+
* Use the ``SHA256`` hash from the python ``hashlib`` standard library, this may slow down the export
|
|
72
|
+
of large register models but will be consistent, therefore is useful if the resultant code is being
|
|
73
|
+
checked into a version control system (such as GIT) and the differences are being reviewed
|
|
74
|
+
|
|
75
|
+
.. tip::
|
|
76
|
+
|
|
77
|
+
Use the default builtin ``hash`` option unless you need to use the alternative
|
|
78
|
+
|
|
79
|
+
Unit Tests
|
|
80
|
+
==========
|
|
81
|
+
|
|
82
|
+
In addition to the Register Model a set od unit tests are made that test that the register model has been
|
|
83
|
+
built correctly
|
|
84
|
+
|
|
85
|
+
Running the Unit Tests
|
|
86
|
+
----------------------
|
|
87
|
+
|
|
88
|
+
There are many ways to run Python Unit tests. A good place to start is the ``unittest`` module
|
|
89
|
+
included in the Python standard installation.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
Simulator
|
|
93
|
+
=========
|
|
94
|
+
|
|
95
|
+
PeakRDL Python also generates an simulator, this can be used to test and develop using the
|
|
96
|
+
generated package. The simulator is used in a the examples shown earlier in this section. The
|
|
97
|
+
simulator has the option to attach a callback to the read and write operations of either a
|
|
98
|
+
register or field. In addition there is a ``value`` property that allows access to the register
|
|
99
|
+
or field content, this allows the contents to be accessed or updated without activating the
|
|
100
|
+
callbacks, this is intended to allow the simulator to be extended with behaviour that is not
|
|
101
|
+
fully described by the systemRDL.
|
|
102
|
+
|
|
103
|
+
.. warning:: The PeakRDL Python simulator is not intended to replace an RTL simulation of the
|
|
104
|
+
design. It does not simulate the hardware, it is intended as a simple tool for
|
|
105
|
+
development and testing of the python wrappers or code that uses them.
|
|
106
|
+
|
|
107
|
+
.. _skipping-lib-copy:
|
|
108
|
+
|
|
109
|
+
Skipping the Library Copy
|
|
110
|
+
=========================
|
|
111
|
+
|
|
112
|
+
In some cases it may be desirable to skip the copy of the library from the generated pacakge.
|
|
113
|
+
This may be useful in development of PeakRDL-python. It can also be used to avoid distributing
|
|
114
|
+
licensed code.
|
|
115
|
+
|
|
116
|
+
.. warning:: If the libraries are not distributed with the package, it is very important to
|
|
117
|
+
ensure users download the matching version of the PeakRDL-python package to use it
|
|
118
|
+
|
|
119
|
+
Autoformatting
|
|
120
|
+
==============
|
|
121
|
+
|
|
122
|
+
The generated code is not perfect it often has lots of spare black lines, over time this will
|
|
123
|
+
improve but the quickest way to resolve these issue is to include an autoformatter
|
|
124
|
+
post-generation. Previous versions of peakrdl-python included the option to run an autoformatter
|
|
125
|
+
to clean up the generated code. This had two issues:
|
|
126
|
+
|
|
127
|
+
* It created maintenance issues when the autoformatter changed
|
|
128
|
+
* The choice of autoformatter is an individual one, rather than force an autoformatter on people
|
|
129
|
+
it is better to let people choose their own.
|
|
130
|
+
|
|
131
|
+
peakrdl-python uses the Black `Black <https://pypi.org/project/black/L>`_ in the CI tests to check
|
|
132
|
+
that the generated code is compatible with an autoformatter.
|