diff --git a/lambdalib/lambdalib.py b/lambdalib/lambdalib.py index d17a94b..18edf38 100644 --- a/lambdalib/lambdalib.py +++ b/lambdalib/lambdalib.py @@ -2,31 +2,234 @@ from siliconcompiler import Library +def __iolib_files(): + return [f"lambdalib/iolib/rtl/{f}" + for f in ( + "la_ioanalog.v", + "la_iobidir.v", + "la_ioclamp.v", + "la_iocorner.v", + "la_iocut.v", + "la_ioinput.v", + "la_iopoc.v", + "la_ioshort.v", + "la_iovdd.v", + "la_iovdda.v", + "la_iovddio.v", + "la_iovss.v", + "la_iovssa.v", + "la_iovssio.v", + "la_ioxtal.v", + "la_pt.v", + )] + + +def __stdlib_files(): + return [f"lambdalib/stdlib/rtl/{f}" + for f in ( + "la_and2.v", + "la_and3.v", + "la_and4.v", + "la_antenna.v", + "la_ao21.v", + "la_ao211.v", + "la_ao22.v", + "la_ao221.v", + "la_ao222.v", + "la_ao31.v", + "la_ao311.v", + "la_ao32.v", + "la_ao33.v", + "la_aoi21.v", + "la_aoi211.v", + "la_aoi22.v", + "la_aoi221.v", + "la_aoi222.v", + "la_aoi31.v", + "la_aoi311.v", + "la_aoi32.v", + "la_aoi33.v", + "la_buf.v", + "la_clkand2.v", + "la_clkbuf.v", + "la_clkicgand.v", + "la_clkicgor.v", + "la_clkinv.v", + "la_clkmux2.v", + "la_clkmux4.v", + "la_clknand2.v", + "la_clknor2.v", + "la_clkor2.v", + "la_clkor4.v", + "la_clkxor2.v", + "la_csa32.v", + "la_csa42.v", + "la_decap.v", + "la_delay.v", + "la_dffnq.v", + "la_dffq.v", + "la_dffqn.v", + "la_dffrq.v", + "la_dffrqn.v", + "la_dffsq.v", + "la_dffsqn.v", + "la_dmux2.v", + "la_dmux3.v", + "la_dmux4.v", + "la_dmux5.v", + "la_dmux6.v", + "la_dmux7.v", + "la_dmux8.v", + "la_drsync.v", + "la_dsync.v", + "la_footer.v", + "la_header.v", + "la_iddr.v", + "la_inv.v", + "la_isohi.v", + "la_isolo.v", + "la_keeper.v", + "la_latnq.v", + "la_latq.v", + "la_mux2.v", + "la_mux3.v", + "la_mux4.v", + "la_muxi2.v", + "la_muxi3.v", + "la_muxi4.v", + "la_nand2.v", + "la_nand3.v", + "la_nand4.v", + "la_nor2.v", + "la_nor3.v", + "la_nor4.v", + "la_oa21.v", + "la_oa211.v", + "la_oa22.v", + "la_oa221.v", + "la_oa222.v", + "la_oa31.v", + "la_oa311.v", + "la_oa32.v", + "la_oa33.v", + "la_oai21.v", + "la_oai22.v", + "la_oai221.v", + "la_oai222.v", + "la_oai31.v", + "la_oai311.v", + "la_oai32.v", + "la_oai33.v", + "la_oddr.v", + "la_or2.v", + "la_or3.v", + "la_or4.v", + "la_pwrbuf.v", + "la_rsync.v", + "la_sdffq.v", + "la_sdffqn.v", + "la_sdffrq.v", + "la_sdffrqn.v", + "la_sdffsq.v", + "la_sdffsqn.v", + "la_tbuf.v", + "la_tiehi.v", + "la_tielo.v", + "la_xnor2.v", + "la_xnor3.v", + "la_xnor4.v", + "la_xor2.v", + "la_xor3.v", + "la_xor4.v" + )] + + +def __ramlib_files(): + return [f"lambdalib/ramlib/rtl/{f}" + for f in ( + "la_asyncfifo.v", + "la_dpram.v", + "la_spram.v", + "la_spregfile.v", + "la_syncfifo.v" + )] + + +def __syslib_files(): + return [f"lambdalib/syslib/rtl/{f}" + for f in ( + "la_eth.v", + "la_gpio.v", + "la_i2c.v", + "la_jtag.v", + "la_qspi.v", + "la_sd.v", + "la_spi.v", + "la_uart.v", + "la_usb.v" + )] + + +def __padring_files(): + return [f"lambdalib/padring/rtl/{f}" + for f in ( + "la_iopadring.v", + "la_ioside.v" + )] + + +def __vectorlib_files(): + return [f"lambdalib/vectorlib/rtl/{f}" + for f in ( + "la_vbuf.v", + "la_vinv.v", + "la_visohi.v", + "la_visolo.v", + "la_vmux.v", + "la_vmux2.v", + "la_vmux3.v", + "la_vmux4.v", + "la_vmux5.v", + "la_vmux6.v", + "la_vmux7.v", + "la_vmux8.v" + )] + + +def _dependencies(): + return { + 'iolib': (['stdlib'], __iolib_files), + 'stdlib': ([], __stdlib_files), + 'ramlib': (['stdlib'], __ramlib_files), + 'padring': (['stdlib'], __padring_files), + 'syslib': (['stdlib'],__syslib_files), + 'vectorlib': (['stdlib'], __vectorlib_files) + } + + ######################## # SiliconCompiler Setup ######################## def setup(chip): '''Lambdalib library setup script''' - dependencies = { - 'iolib': ['stdlib'], - 'stdlib': [], - 'ramlib': ['stdlib'], - 'padring': ['stdlib'], - 'syslib': ['stdlib'], - 'vectorlib': ['stdlib'] - } - libs = [] # Iterate over all libs - for name, dep in dependencies.items(): + for name, data in _dependencies().items(): + dep, _ = data + lib = Library(chip, f'la_{name}', package='lambdalib') register_data_source(lib) + # Add idirs for path in [name, *dep]: - lib.add('option', 'ydir', f"lambdalib/{path}/rtl") lib.add('option', 'idir', f"lambdalib/{path}/rtl") + for path in [name, *dep]: + files = _dependencies()[name][1] + for f in files(): + lib.output(f) + libs.append(lib) return libs diff --git a/tests/test_paths.py b/tests/test_paths.py index 03eb55d..007f014 100644 --- a/tests/test_paths.py +++ b/tests/test_paths.py @@ -1,9 +1,34 @@ +import glob +import os +import pytest from siliconcompiler import Chip from lambdalib import lambdalib -def test_pdk_paths(): +def test_paths_valid(): chip = Chip('') chip.use(lambdalib) assert chip.check_filepaths() + + +@pytest.mark.parametrize('lib', lambdalib._dependencies().keys()) +def test_extra_files(lib): + ''' + Ensure all files are included in the lists + ''' + dependencies = lambdalib._dependencies()[lib][0] + + fs_base = os.path.dirname(lambdalib.__file__) + rm_base = os.path.dirname(fs_base) + + fs_files = [] + lib_files = [] + for name in [lib, *dependencies]: + lib_files.extend(lambdalib._dependencies()[name][1]()) + + glob_path = f"{fs_base}/{name}/rtl/*.v" + fs_files.extend([f[len(rm_base)+1:] for f in glob.glob(glob_path)]) + + assert not set(fs_files).difference(set(lib_files)) + assert not set(lib_files).difference(set(fs_files))