Source code for piel.flows.digital_logic

from ..file_system import return_path
from ..project_structure import get_module_folder_type_location
from ..tools.amaranth import (
    construct_amaranth_module_from_truth_table,
    generate_verilog_from_amaranth_truth_table,
    verify_amaranth_truth_table,
)
from ..types import (
    ElectronicCircuitComponent,
    CircuitComponent,
    HDLSimulator,
    LogicSignalsList,
    PathTypes,
    TruthTable,
)
from piel.conversion import convert_dataframe_to_bits
from ..tools.cocotb import (
    configure_cocotb_simulation,
    run_cocotb_simulation,
    read_simulation_data,
    get_simulation_output_files_from_design,
)
from ..integration.amaranth_openlane import layout_truth_table_through_openlane
from ..integration.gdsfactory_openlane import create_gdsfactory_component_from_openlane


[docs] def generate_verilog_and_verification_from_truth_table( module: PathTypes, truth_table: TruthTable, target_file_name: str = "truth_table_module", ): """ Processes a truth table to generate an Amaranth module, converts it to Verilog, and creates a testbench for verification. Parameters: - truth_table (dict): The truth table defining the logic. It should be a dictionary where keys are port names and values are lists of binary strings representing the truth table entries. Example: {"detector_in": ["00", "01", "10", "11"], "phase_map_out": ["00", "10", "11", "11"]} - input_ports (list of str): A list of input port names that correspond to keys in the truth table. Example: ["detector_in"] - output_ports (list of str): A list of output port names that correspond to keys in the truth table. Example: ["phase_map_out"] - module (str): The name or path of the module within the design hierarchy where the generated files will be placed. This is used to determine the file structure and directory paths. Example: "full_flow_demo" - target_file_name (str): The verilog and vcd file name. Returns: - None Steps: 1. Combines the input and output connection into a single list. 2. Constructs an Amaranth module from the provided truth table. 3. Determines the appropriate directory and source folder for the design. 4. Generates a Verilog file from the Amaranth module. 5. Creates a testbench to verify the generated module logic and produces a VCD file. """ # Combine input and output connection into a single list for connection # Construct Amaranth module from the truth table amaranth_module = construct_amaranth_module_from_truth_table( truth_table=truth_table ) # Determine the design directory src_folder = get_module_folder_type_location( module=module, folder_type="digital_source" ) # Generate Verilog file from the Amaranth module generate_verilog_from_amaranth_truth_table( amaranth_module=amaranth_module, truth_table=truth_table, target_file_name=f"{target_file_name}.v", target_directory=src_folder, ) # Create a testbench to verify the logic and generate a VCD file verify_amaranth_truth_table( truth_table_amaranth_module=amaranth_module, truth_table=truth_table, vcd_file_name=f"{target_file_name}.vcd", target_directory=module, )
[docs] def layout_truth_table( truth_table: TruthTable, module: PathTypes, ) -> ElectronicCircuitComponent: """ Layout a truth table through the OpenLane flow and create a GDSFactory component. Parameters: - truth_table (TruthTable): The truth table object containing the input and output port files. - module (str): The name or path of the module within the design hierarchy where the generated files will be placed. This is used to determine the file structure and directory paths. Example: "full_flow_demo" Returns: - digital_component (gf.Component): The GDSFactory component representing the layout of the truth table as implemented by OpenLane """ layout_truth_table_through_openlane( truth_table=truth_table, parent_directory=module, openlane_version="v2", ) digital_component = create_gdsfactory_component_from_openlane( design_directory=module ) return digital_component
[docs] def read_simulation_data_to_truth_table( file_path: PathTypes, input_ports: LogicSignalsList, output_ports: LogicSignalsList, *args, **kwargs, ) -> TruthTable: """ The goal of this function is to read an existing simulation files output from cocotb and convert it into a valid Dataframe with proper type validation of bit signals into the corresponding byte formats. Args: - file_path (PathTypes): The path to the simulation files file. - input_ports (LogicSignalsList): The list of input port names. - output_ports (LogicSignalsList): The list of output port names. Returns: - truth_table (TruthTable): The truth table object containing the input and output port files. Examples: >>> read_simulation_data_to_truth_table("simulation_data.csv", ["input_port"], ["output_port"]) TruthTable(input_ports=["input_port"], output_ports=["output_port"], ...) """ # Combine input and output connection into a single list for connection ports_list = input_ports + output_ports # Read the simulation files from the file simulation_dataframe = read_simulation_data(file_path, *args, **kwargs) # Convert the integer columns to byte format simulation_dataframe = convert_dataframe_to_bits( dataframe=simulation_dataframe, ports_list=ports_list ) # Create a TruthTable object from the simulation files truth_table = TruthTable( input_ports=input_ports, output_ports=output_ports, **simulation_dataframe.to_dict(), ) return truth_table
[docs] def run_verification_simulation_for_design( module: PathTypes, top_level_verilog_module: str, test_python_module: str, simulator: HDLSimulator = "icarus", ): """ Configures and runs a Cocotb simulation for a given design module and retrieves the simulation files. TODO possibly in the future swap the methodology of running the simulation here. Parameters: - module (str): The name or path of the module within the design hierarchy where the generated files will be placed. This is used to determine the file structure and directory paths. Example: "full_flow_demo" - top_level_verilog_module (str): The name of the top-level Verilog module in the design. Example: "full_flow_demo_module" - test_python_module (str): The name of the Python test module for the design. Example: "test_full_flow_demo" - simulator (HDLSimulator): The simulator to use for the Cocotb simulation. Default is "icarus". Returns: - example_simulation_data: The simulation files read from the output files. """ # Determine the design directory and output directories design_directory = return_path(module) # Configure the Cocotb simulation configure_cocotb_simulation( design_directory=module, simulator=simulator, top_level_language="verilog", top_level_verilog_module=top_level_verilog_module, test_python_module=test_python_module, design_sources_list=list((design_directory / "src").iterdir()), ) # Run the Cocotb simulation run_cocotb_simulation(design_directory) # Retrieve the simulation output files cocotb_simulation_output_files = get_simulation_output_files_from_design(module) # Read the simulation files from the first output file simulation_data = read_simulation_data(cocotb_simulation_output_files[0]) return simulation_data
[docs] def get_latest_digital_run_component( module: PathTypes, *args, **kwargs ) -> CircuitComponent: component = create_gdsfactory_component_from_openlane( design_directory=module, *args, **kwargs ) return component