Source code for piel.tools.cocotb.data
"""
This file contains a range of functions used to read, plot and analyse cocotb simulations in a data-flow standard as suggested
"""
import functools
import pandas as pd
from piel.types import PathTypes
from piel.file_system import return_path, get_files_recursively_in_directory
__all__ = [
"get_simulation_output_files",
"get_simulation_output_files_from_design",
"read_simulation_data",
"simple_plot_simulation_data",
]
get_simulation_output_files = functools.partial(
get_files_recursively_in_directory, path="./tb/out/", extension="csv"
)
[docs]def get_simulation_output_files_from_design(
design_directory: PathTypes,
extension: str = "csv",
):
"""
This function returns a list of all the simulation output files in the design directory.
Args:
design_directory (PathTypes): The path to the design directory.
Returns:
output_files (list): List of all the simulation output files in the design directory.
"""
design_directory = return_path(design_directory)
output_files = get_files_recursively_in_directory(
path=design_directory / "tb" / "out", extension=extension
)
return output_files
[docs]def read_simulation_data(file_path: PathTypes):
"""
This function returns a Pandas dataframe that contains all the simulation data outputted from the simulation run.
Args:
file_path (PathTypes): The path to the simulation data file.
Returns:
simulation_data (pd.DataFrame): The simulation data in a Pandas dataframe.
"""
file_path = return_path(file_path)
simulation_data = pd.read_csv(file_path)
return simulation_data
[docs]def simple_plot_simulation_data(simulation_data: pd.DataFrame):
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show
from bokeh.layouts import column
source = ColumnDataSource(
data=dict(time=simulation_data.t, signal=simulation_data.x)
)
p = figure(
height=300,
width=800,
tools="xpan",
toolbar_location=None,
# x_axis_type="datetime",
x_axis_location="above",
background_fill_color="#efefef",
)
p.line("time", "signal", source=source)
# p.yaxis.axis_label = "Price"
select = figure(
title="Drag the middle and edges of the selection box to change the range above",
height=130,
width=800,
y_range=p.y_range,
# x_axis_type="datetime",
y_axis_type=None,
tools="",
toolbar_location=None,
background_fill_color="#efefef",
)
# range_tool = RangeTool(x_range=p.x_range)
# range_tool.overlay.fill_color = "navy"
# range_tool.overlay.fill_alpha = 0.2
select.line("time", "signal", source=source)
select.ygrid.grid_line_color = None
# select.add_tools(range_tool)
return show(column(p, select))