import shutil
from collections.abc import Callable
from pathlib import Path
from hlsfactory.framework import DesignDataset, DesignDatasetCollection
CURRENT_FP = Path(__file__).resolve()
CURRENT_DIR = CURRENT_FP.parent
HLS_DATASET_DIR = CURRENT_DIR / "hls_dataset_sources"
DIR_DATASET_POLYBENCH = HLS_DATASET_DIR / "polybench"
DIR_DATASET_MACHSUITE = HLS_DATASET_DIR / "machsuite"
DIR_DATASET_CHSTONE = HLS_DATASET_DIR / "chstone"
DIR_DATASET_PP4FPGAS = HLS_DATASET_DIR / "pp4fpgas"
DIR_DATASET_VITIS_EXAMPLES = HLS_DATASET_DIR / "vitis_examples"
DIR_DATASET_TEST_DESIGNS_CATAPULT = HLS_DATASET_DIR / "test_designs_catapult"
DIR_DATASET_TEST_DESIGNS_STRATUS = HLS_DATASET_DIR / "test_designs_stratus"
DIR_DATASET_TEST_DESIGNS_XLS = HLS_DATASET_DIR / "test_designs_xls"
DIR_DATASET_XLS_UPSTREAM = HLS_DATASET_DIR / "xls_upstream"
DIR_DATASET_ALTERA_EXAMPLES = HLS_DATASET_DIR / "altera_examples"
DIR_DATASET_TEST_DESIGNS_VITIS_MODERN = HLS_DATASET_DIR / "test_designs_vitis_modern"
DIR_DATASET_ACCELERATORS = HLS_DATASET_DIR / "accelerators"
DIR_DATASET_SODA = HLS_DATASET_DIR / "soda"
DIR_DATASET_HP_FFT = HLS_DATASET_DIR / "hp_fft_hls"
DIR_DATASET_STREAM_HLS = HLS_DATASET_DIR / "stream_hls"
DIR_DATASET_AUTO_NTT = HLS_DATASET_DIR / "auto_ntt"
DIR_DATASET_FORGEBENCH = HLS_DATASET_DIR / "forgebench"
DIR_DATASET_SPECTOR_HLS = HLS_DATASET_DIR / "spector_hls"
DIR_ALL = [
DIR_DATASET_POLYBENCH,
DIR_DATASET_MACHSUITE,
DIR_DATASET_CHSTONE,
DIR_DATASET_PP4FPGAS,
DIR_DATASET_VITIS_EXAMPLES,
DIR_DATASET_TEST_DESIGNS_CATAPULT,
DIR_DATASET_TEST_DESIGNS_STRATUS,
DIR_DATASET_TEST_DESIGNS_XLS,
DIR_DATASET_ALTERA_EXAMPLES,
DIR_DATASET_TEST_DESIGNS_VITIS_MODERN,
DIR_DATASET_ACCELERATORS,
DIR_DATASET_SODA,
DIR_DATASET_HP_FFT,
DIR_DATASET_STREAM_HLS,
DIR_DATASET_AUTO_NTT,
DIR_DATASET_FORGEBENCH,
]
[docs]
def check_dataset_dir_exists(dir_path: Path) -> None:
if not dir_path.exists():
msg = f"Dataset directory not found: {dir_path}"
raise FileNotFoundError(msg)
[docs]
def dataset_polybench_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_POLYBENCH)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_POLYBENCH, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_machsuite_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_MACHSUITE)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_MACHSUITE, new_dir)
return DesignDataset.from_dir(
name,
new_dir,
exclude_dir_filter=lambda dir_path: dir_path.name == "common",
)
[docs]
def dataset_chstone_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_CHSTONE)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_CHSTONE, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_pp4fpgas_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_PP4FPGAS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_PP4FPGAS, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_vitis_examples_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_VITIS_EXAMPLES)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_VITIS_EXAMPLES, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_test_designs_catapult_builder(
name: str,
work_dir: Path,
) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_TEST_DESIGNS_CATAPULT)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_TEST_DESIGNS_CATAPULT, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_test_designs_stratus_builder(
name: str,
work_dir: Path,
) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_TEST_DESIGNS_STRATUS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_TEST_DESIGNS_STRATUS, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_test_designs_xls_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_TEST_DESIGNS_XLS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_TEST_DESIGNS_XLS, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_xls_upstream_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_XLS_UPSTREAM)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_XLS_UPSTREAM, new_dir)
[docs]
def dataset_altera_examples_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_ALTERA_EXAMPLES)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_ALTERA_EXAMPLES, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_test_designs_vitis_modern_builder(
name: str,
work_dir: Path,
) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_TEST_DESIGNS_VITIS_MODERN)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_TEST_DESIGNS_VITIS_MODERN, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_accelerators_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_ACCELERATORS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_ACCELERATORS, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_soda_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_SODA)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_SODA, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_hp_fft_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_HP_FFT)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_HP_FFT, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_stream_hls_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_STREAM_HLS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_STREAM_HLS, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_auto_ntt_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_AUTO_NTT)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_AUTO_NTT, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_forgebench_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_FORGEBENCH)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_FORGEBENCH, new_dir)
return DesignDataset.from_dir(name, new_dir)
[docs]
def dataset_spector_hls_builder(name: str, work_dir: Path) -> DesignDataset:
check_dataset_dir_exists(DIR_DATASET_SPECTOR_HLS)
new_dir = work_dir / name
shutil.copytree(DIR_DATASET_SPECTOR_HLS, new_dir)
return DesignDataset.from_dir(name, new_dir)
T_dataset_builder = Callable[[str, Path], DesignDataset]
DATASET_STR_MAP: dict[str, T_dataset_builder] = {
"polybench": dataset_polybench_builder,
"machsuite": dataset_machsuite_builder,
"chstone": dataset_chstone_builder,
"pp4fpgas": dataset_pp4fpgas_builder,
"vitis_examples": dataset_vitis_examples_builder,
"test_designs_catapult": dataset_test_designs_catapult_builder,
"test_designs_stratus": dataset_test_designs_stratus_builder,
"test_designs_xls": dataset_test_designs_xls_builder,
"xls_upstream": dataset_xls_upstream_builder,
"altera_examples": dataset_altera_examples_builder,
"test_designs_vitis_modern": dataset_test_designs_vitis_modern_builder,
"accelerators": dataset_accelerators_builder,
"soda": dataset_soda_builder,
"hp_fft": dataset_hp_fft_builder,
"hpfft": dataset_hp_fft_builder,
"stream_hls": dataset_stream_hls_builder,
"streamhls": dataset_stream_hls_builder,
"auto_ntt": dataset_auto_ntt_builder,
"autontt": dataset_auto_ntt_builder,
"forgebench": dataset_forgebench_builder,
"spector_hls": dataset_spector_hls_builder,
}
[docs]
def datasets_builder(
work_dir: Path,
dataset_names: list[str],
dataset_labels: list[str] | None = None,
) -> DesignDatasetCollection:
datasets = {}
if dataset_labels is None:
dataset_labels = dataset_names
assert len(dataset_names) == len(dataset_labels)
for dataset_name, dataset_label in zip(
dataset_names,
dataset_labels,
strict=True,
):
dataset_normalized = dataset_name.strip().lower()
if dataset_normalized not in DATASET_STR_MAP:
raise ValueError(
f"Dataset name not recognized: {dataset_name} "
f"(normalized: {dataset_normalized})",
)
dataset_builder = DATASET_STR_MAP[dataset_normalized]
dataset = dataset_builder(dataset_label, work_dir)
datasets[dataset_label] = dataset
return datasets
[docs]
def datasets_all_builder(work_dir: Path) -> DesignDatasetCollection:
for dir_path in DIR_ALL:
check_dataset_dir_exists(dir_path)
dataset_polybench = dataset_polybench_builder("polybench", work_dir)
dataset_machsuite = dataset_machsuite_builder("machsuite", work_dir)
dataset_chstone = dataset_chstone_builder("chstone", work_dir)
dataset_pp4fpgas = dataset_pp4fpgas_builder("pp4fpgas", work_dir)
dataset_vitis_examples = dataset_vitis_examples_builder("vitis_examples", work_dir)
dataset_test_designs_catapult = dataset_test_designs_catapult_builder(
"test_designs_catapult",
work_dir,
)
dataset_test_designs_stratus = dataset_test_designs_stratus_builder(
"test_designs_stratus",
work_dir,
)
dataset_test_designs_xls = dataset_test_designs_xls_builder(
"test_designs_xls",
work_dir,
)
dataset_test_designs_vitis_modern = dataset_test_designs_vitis_modern_builder(
"test_designs_vitis_modern",
work_dir,
)
dataset_accelerators = dataset_accelerators_builder("accelerators", work_dir)
dataset_soda = dataset_soda_builder("soda", work_dir)
dataset_hp_fft = dataset_hp_fft_builder("hp_fft", work_dir)
dataset_stream_hls = dataset_stream_hls_builder("stream_hls", work_dir)
dataset_auto_ntt = dataset_auto_ntt_builder("auto_ntt", work_dir)
dataset_forgebench = dataset_forgebench_builder("forgebench", work_dir)
return {
dataset_polybench.name: dataset_polybench,
dataset_machsuite.name: dataset_machsuite,
dataset_chstone.name: dataset_chstone,
dataset_pp4fpgas.name: dataset_pp4fpgas,
dataset_vitis_examples.name: dataset_vitis_examples,
dataset_test_designs_catapult.name: dataset_test_designs_catapult,
dataset_test_designs_stratus.name: dataset_test_designs_stratus,
dataset_test_designs_xls.name: dataset_test_designs_xls,
dataset_test_designs_vitis_modern.name: dataset_test_designs_vitis_modern,
dataset_accelerators.name: dataset_accelerators,
dataset_soda.name: dataset_soda,
dataset_hp_fft.name: dataset_hp_fft,
dataset_stream_hls.name: dataset_stream_hls,
dataset_auto_ntt.name: dataset_auto_ntt,
dataset_forgebench.name: dataset_forgebench,
}