Ran last commit from the wrong directory and didn't catch most of the modified files.
diff --git a/.gitignore b/.gitignore index 0cb02a5..3c2b7bd 100644 --- a/.gitignore +++ b/.gitignore
@@ -11,17 +11,13 @@ *_migrate.log # autotools artifacts -scripts/* -!scripts/configure -!scripts/configure.ac -!scripts/tools.txt -!scripts/rl **/Makefile **/Makefile.am # exceptions for travisCI !.travisCI/Makefile -# staged PDKs -sky130/sky130A -sky130/sky130A/* +# local install cache +/pdks +/libs +/tools \ No newline at end of file
diff --git a/Makefile.in b/Makefile.in index 1a1c2c7..b0fcdc0 100644 --- a/Makefile.in +++ b/Makefile.in
@@ -35,13 +35,39 @@ # The following definitions are tied to the contents # of this repository and should not be changed. -TECHS = sky130 +TECHS = + +SKY130_SOURCE_PATH = @SKY130_SOURCE_PATH@ +ifneq ($(SKY130_SOURCE_PATH),) + TECHS += sky130 +endif + +DONE_MESSAGE = "Done." +ifeq ($(TECHS),) + DONE_MESSAGE = "No techs configured." +endif + +TECHS_ALL = $(addprefix tech_,$(TECHS)) +TECHS_INSTALL = $(addprefix install-,$(TECHS)) +TECHS_CLEAN = $(addprefix clean-,$(TECHS)) +TECHS_VERYCLEAN = $(addprefix veryclean-,$(TECHS)) #--------------------------------------------------- -all: ${TECHS} - for tech in ${TECHS}; do \ - ${MAKE} tech_$$tech; done +all: $(TECHS_ALL) + @echo $(DONE_MESSAGE) + +install: $(TECHS_INSTALL) + @echo $(DONE_MESSAGE) + +clean: $(TECHS_CLEAN) + @echo $(DONE_MESSAGE) + +veryclean: $(TECHS_VERYCLEAN) + @echo $(DONE_MESSAGE) + +distclean: $(TECHS_VERYCLEAN) + @echo $(DONE_MESSAGE) #--------------------------------------------------- @@ -59,20 +85,4 @@ veryclean-sky130: (cd sky130 && ${MAKE} veryclean) -#--------------------------------------------------- - -install: ${TECHS} - for tech in ${TECHS}; do \ - ${MAKE} install-$${tech}; done - -clean: ${TECHS} - for tech in ${TECHS}; do \ - ${MAKE} clean-$${tech}; done - -veryclean: ${TECHS} - for tech in ${TECHS}; do \ - ${MAKE} veryclean-$${tech}; done - -distclean: ${TECHS} - for tech in ${TECHS}; do \ - ${MAKE} veryclean-$${tech}; done +#--------------------------------------------------- \ No newline at end of file
diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 0000000..b1083e1 --- /dev/null +++ b/scripts/.gitignore
@@ -0,0 +1,7 @@ +* +!.gitignore +!configure +!configure.ac +!tools.txt +!print_tools_make.pl +!dl \ No newline at end of file
diff --git a/scripts/configure b/scripts/configure index 5841a66..ba4f0c8 100755 --- a/scripts/configure +++ b/scripts/configure
@@ -587,7 +587,6 @@ ac_subst_vars='LTLIBOBJS LIBOBJS EF_STYLE -MAGIC pkgpyexecdir pyexecdir pkgpythondir @@ -597,15 +596,19 @@ PYTHON_PREFIX PYTHON_VERSION PYTHON +XSCHEM_PATH +SKY130_ML_XX_HD_PATH +OSU_PATH +MAGIC QFLOW_DISABLED OPENLANE_DISABLED NETGEN_DISABLED MAGIC_DISABLED KLAYOUT_DISABLED -SKY130_LINK_TARGETS SKY130_DIST_PATH SKY130_LOCAL_PATH SKY130_SOURCE_PATH +SKY130_LINK_TARGETS target_alias host_alias build_alias @@ -647,7 +650,7 @@ ac_subst_files='' ac_user_opts=' enable_option_checking -with_sky130_source +enable_sky130_pdk with_sky130_local_path with_sky130_dist_path with_sky130_link_targets @@ -656,6 +659,9 @@ enable_netgen enable_openlane enable_qflow +enable_osu_lib +enable_alpha_lib +enable_xschem with_ef_style ' ac_precious_vars='build_alias @@ -1271,6 +1277,37 @@ --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-sky130-pdk=[/path/to/sky130/] --disable-sky130-pdk + "location of the source files for the sky130 (pdks + with a pdk_url file can automatically download them + if the path is omitted)" + --enable-klayout + Enable or disable klayout [default=enabled] + + + --enable-magic + Enable or disable magic [default=enabled] + + + --enable-netgen + Enable or disable netgen [default=enabled] + + + --enable-openlane + Enable or disable openlane [default=enabled] + + + --enable-qflow + Enable or disable qflow [default=enabled] + + + --enable-osu-lib[=path] Install osu. If path is omitted, it'll be + downloaded. [default=disabled] + --enable-alpha-lib[=path] + Install sky130_ml_xx_hd. If path is omitted, it'll be + downloaded. [default=disabled] + --enable-xschem[=path] Install xschem. If path is omitted, it'll be + downloaded. [default=disabled] --enable-klayout --disable-klayout Enable or disable klayout [default=enabled] --enable-magic --disable-magic @@ -1285,12 +1322,10 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-sky130-source=/path/to/sky130/source - "location of the source files for sky130" - --with-sky130-local-path=/path/to/install/pdks - "run-time location of the PDKs" - --with-sky130-dist-path=/path/to/install/pdks - "staging location to install the PDKs for + --with-sky130-local-path=/path/to/install/sky130 + "run-time location of the PDK" + --with-sky130-dist-path=/path/to/install/sky130 + "staging location to install the PDK for distribution (optional)" --with-sky130-link-targets=none|source "make symbolic links to existing files @@ -1736,10 +1771,14 @@ # detect PDKs based on directories that include Makefile.in files +# define tools # define tools to install setup files for. This does not imply that the tools are # available on the system; just that open_pdks will install the setup files for them. +## DO NOT INCLUDE XSCHEM IN THE TOOL LIST. XSCHEM CAN BE INSTALLED IN THE CONFIG SCRIPT +mkdir -p ../pdks + # check for the source and install paths for each PDK. @@ -1747,31 +1786,102 @@ $as_echo "$as_me: Found technology directories: sky130" >&6;} - # --with-pdk-source=PDK_SOURCE_PATH + + # --enable-pdk-[pdk]=/path/to/pdk - SKY130_SOURCE_PATH_="" -# Check whether --with-sky130-source was given. -if test "${with_sky130_source+set}" = set; then : - withval=$with_sky130_source; SKY130_SOURCE_PATH_=$withval + SKY130_SOURCE_PATH="" + SKY130_LOCAL_PATH="" + SKY130_DIST_PATH="" + SKY130_LINK_TARGETS="none" + + pdk_get() { + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../sky130/pdk_url" >&5 +$as_echo_n "checking for ../sky130/pdk_url... " >&6; } +if ${ac_cv_file____sky130_pdk_url+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../sky130/pdk_url"; then + ac_cv_file____sky130_pdk_url=yes +else + ac_cv_file____sky130_pdk_url=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____sky130_pdk_url" >&5 +$as_echo "$ac_cv_file____sky130_pdk_url" >&6; } +if test "x$ac_cv_file____sky130_pdk_url" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../pdks/sky130" >&5 +$as_echo_n "checking for ../pdks/sky130... " >&6; } +if ${ac_cv_file____pdks_sky130+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../pdks/sky130"; then + ac_cv_file____pdks_sky130=yes +else + ac_cv_file____pdks_sky130=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____pdks_sky130" >&5 +$as_echo "$ac_cv_file____pdks_sky130" >&6; } +if test "x$ac_cv_file____pdks_sky130" = xyes; then : + + echo "Using pre-existing sky130 download..." + +else + + mkdir -p ../pdks/sky130 + sh dl $(cat "../sky130/pdk_get") ../pdks/sky130.tar.gz; + (echo "Extracting sky130" && cd ../pdks && tar -xf sky130.tar.gz --strip-components 1 -C ../pdks/sky130) fi + export SKY130_SOURCE_PATH=../pdks/sky130 - # Require this argument - { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether source path is specified for 'sky130'" >&5 -$as_echo "$as_me: Checking whether source path is specified for 'sky130'" >&6;} - if test "x$SKY130_SOURCE_PATH_" == "x" ; then - as_fn_error $? "Option --with-sky130-source=<path> not specified!" "$LINENO" 5 - fi +else - SKY130_SOURCE_PATH=`readlink -f $SKY130_SOURCE_PATH_` + as_fn_error $? "PDK sky130 cannot be automatically downloaded and requires a path." "$LINENO" 5 - # basic check that the PDK exists there (the path must exist in any case) - { $as_echo "$as_me:${as_lineno-$LINENO}: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&5 +fi + + } + + # Check whether --enable-sky130-sky130 was given. +if test "${enable_sky130_pdk+set}" = set; then : + enableval=$enable_sky130_pdk; + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + pdk_get + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling sky130..." + else + export SKY130_SOURCE_PATH=$enableval + fi + +else + + pdk_get + + +fi + + # # Require this argument + # AC_MSG_NOTICE([Checking whether source path is specified for 'pdk']) + # if test "x$[]pdkvar[]_SOURCE_PATH" == "x" ; then + # AC_MSG_ERROR([Option --with-pdk-source=<path> not specified!]) + # fi + + if [ "$SKY130_SOURCE_PATH" != "" ]; then + SKY130_SOURCE_PATH=`readlink -f $SKY130_SOURCE_PATH` + + # basic check that the PDK exists there (the path must exist in any case) + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&5 $as_echo "$as_me: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&6;} - as_ac_File=`$as_echo "ac_cv_file_$SKY130_SOURCE_PATH" | $as_tr_sh` + as_ac_File=`$as_echo "ac_cv_file_$SKY130_SOURCE_PATH" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SKY130_SOURCE_PATH" >&5 $as_echo_n "checking for $SKY130_SOURCE_PATH... " >&6; } if eval \${$as_ac_File+:} false; then : @@ -1790,72 +1900,57 @@ $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: 'sky130' source path found at $SKY130_SOURCE_PATH" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: 'sky130' source path found at $SKY130_SOURCE_PATH" >&5 $as_echo "$as_me: 'sky130' source path found at $SKY130_SOURCE_PATH" >&6;} else - as_fn_error $? "Specified path for 'sky130' at $SKY130_SOURCE_PATH not found" "$LINENO" 5 + as_fn_error $? "Specified path for 'sky130' at $SKY130_SOURCE_PATH not found" "$LINENO" 5 fi - - - - # --with-pdk-local-path=PDK_LOCAL_PATH - - - SKY130_LOCAL_PATH_="" + # --with-pdk-local-path=PDK_LOCAL_PATH # Check whether --with-sky130-local-path was given. if test "${with_sky130_local_path+set}" = set; then : - withval=$with_sky130_local_path; SKY130_LOCAL_PATH_=$withval + withval=$with_sky130_local_path; SKY130_LOCAL_PATH=$withval fi - # Require this argument - { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether local path is specified for 'sky130'" >&5 + + # Require this argument + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether local path is specified for 'sky130'" >&5 $as_echo "$as_me: Checking whether local path is specified for 'sky130'" >&6;} - if test "x$SKY130_LOCAL_PATH_" == "x" ; then - as_fn_error $? "Option --with-sky130-local-path=<path> not specified!" "$LINENO" 5 - SKY130_LOCAL_PATH="" - else - SKY130_LOCAL_PATH=`readlink -f $SKY130_LOCAL_PATH_` - fi + if test "x$SKY130_LOCAL_PATH" == "x" ; then + as_fn_error $? "Option --with-sky130-local-path=<path> not specified!" "$LINENO" 5 + SKY130_LOCAL_PATH="" + else + SKY130_LOCAL_PATH=`readlink -f $SKY130_LOCAL_PATH` + fi - - - # --with-pdk-dist-path=PDK_DIST_PATH - - - SKY130_DIST_PATH_="" + # --with-pdk-dist-path=PDK_DIST_PATH # Check whether --with-sky130-dist-path was given. if test "${with_sky130_dist_path+set}" = set; then : - withval=$with_sky130_dist_path; SKY130_DIST_PATH_=$withval + withval=$with_sky130_dist_path; SKY130_DIST_PATH=$withval fi - # Require this argument - { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether distribution path is specified for 'sky130'" >&5 + + + # "Require" this argument + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether distribution path is specified for 'sky130'" >&5 $as_echo "$as_me: Checking whether distribution path is specified for 'sky130'" >&6;} - if test "x$SKY130_DIST_PATH_" == "x" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Option --with-sky130-dist-path=<path> not specified. Local install only.\"" >&5 -$as_echo "$as_me: Option --with-sky130-dist-path=<path> not specified. Local install only.\"" >&6;} - SKY130_DIST_PATH="" - else - SKY130_DIST_PATH=`readlink -f $SKY130_DIST_PATH_` - fi + if test "x$SKY130_DIST_PATH" == "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Option --with-sky130-dist-path=<path> not specified. Local install only." >&5 +$as_echo "$as_me: Option --with-sky130-dist-path=<path> not specified. Local install only." >&6;} + SKY130_DIST_PATH="" + else + SKY130_DIST_PATH=`readlink -f $SKY130_DIST_PATH` + fi - - - # --with-pdk-link-targets=PDK_LINK_TARGETS - - - # Default link_targets = "none" - SKY130_LINK_TARGETS="none" - + # --with-pdk-link-targets=PDK_LINK_TARGETS # Check whether --with-sky130-link-targets was given. if test "${with_sky130_link_targets+set}" = set; then : @@ -1864,8 +1959,377 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Link targets set to $SKY130_LINK_TARGETS" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Link targets set to $SKY130_LINK_TARGETS" >&5 $as_echo "$as_me: Link targets set to $SKY130_LINK_TARGETS" >&6;} + fi + + + + + + + + +# Set variables for tool setups + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: Found tools: klayout magic netgen openlane qflow" >&5 +$as_echo "$as_me: Found tools: klayout magic netgen openlane qflow" >&6;} + + + + + + KLAYOUT_DISABLED=0 + # Check whether --enable-klayout was given. +if test "${enable_klayout+set}" = set; then : + enableval=$enable_klayout; + if test "$enableval" == "no" -o "$enableval" == "NO"; then + KLAYOUT_DISABLED=1 + fi + + +fi + + + + + + MAGIC_DISABLED=0 + # Check whether --enable-magic was given. +if test "${enable_magic+set}" = set; then : + enableval=$enable_magic; + if test "$enableval" == "no" -o "$enableval" == "NO"; then + MAGIC_DISABLED=1 + fi + + +fi + + + + + + NETGEN_DISABLED=0 + # Check whether --enable-netgen was given. +if test "${enable_netgen+set}" = set; then : + enableval=$enable_netgen; + if test "$enableval" == "no" -o "$enableval" == "NO"; then + NETGEN_DISABLED=1 + fi + + +fi + + + + + + OPENLANE_DISABLED=0 + # Check whether --enable-openlane was given. +if test "${enable_openlane+set}" = set; then : + enableval=$enable_openlane; + if test "$enableval" == "no" -o "$enableval" == "NO"; then + OPENLANE_DISABLED=1 + fi + + +fi + + + + + + QFLOW_DISABLED=0 + # Check whether --enable-qflow was given. +if test "${enable_qflow+set}" = set; then : + enableval=$enable_qflow; + if test "$enableval" == "no" -o "$enableval" == "NO"; then + QFLOW_DISABLED=1 + fi + + +fi + + + + + +# Magic +# Extract the first word of "magic", so it can be a program name with args. +set dummy magic; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MAGIC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC in + [\\/]* | ?:[\\/]*) + ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MAGIC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MAGIC=$ac_cv_path_MAGIC +if test -n "$MAGIC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC" >&5 +$as_echo "$MAGIC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$MAGIC"; then + as_fn_error $? "You need 'magic' to generate the needed various cell views." "$LINENO" 5 +fi + +# Other installations (libraries or tools if applicable) +mkdir -p ../libs +mkdir -p ../tools + + + + + + + + + + # echo target targetvar flag url location + + OSU_PATH="" + OSU_GET() { + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../libs/osu" >&5 +$as_echo_n "checking for ../libs/osu... " >&6; } +if ${ac_cv_file____libs_osu+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../libs/osu"; then + ac_cv_file____libs_osu=yes +else + ac_cv_file____libs_osu=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____libs_osu" >&5 +$as_echo "$ac_cv_file____libs_osu" >&6; } +if test "x$ac_cv_file____libs_osu" = xyes; then : + + echo "Using pre-existing osu download..." + +else + + mkdir -p ../libs/osu + sh ./download.sh 'https://vlsiarch.ecen.okstate.edu/flows/MOSIS_SCMOS/osu_stdcells_v2.4/osu_stdcells_lib.v2.4.tar.gz' ../libs/osu.tar.gz + (echo "Extracting osu..." && cd ../libs && tar -xf osu.tar.gz --strip-components 1 -C ../libs/osu) + + +fi + + export OSU_PATH=../libs/osu + } + + # Check whether --enable-osu-lib was given. +if test "${enable_osu_lib+set}" = set; then : + enableval=$enable_osu_lib; + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + OSU_GET + XSCHEM_INST=1 + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling osu..." + XSCHEM_DISABLED=1 + else + OSU_PATH=$enableval + fi + OSU_PATH=`readlink -f $OSU_PATH` + +fi + + + + + + + + + + + + + + # echo target targetvar flag url location + + SKY130_ML_XX_HD_PATH="" + SKY130_ML_XX_HD_GET() { + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../libs/sky130_ml_xx_hd" >&5 +$as_echo_n "checking for ../libs/sky130_ml_xx_hd... " >&6; } +if ${ac_cv_file____libs_sky130_ml_xx_hd+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../libs/sky130_ml_xx_hd"; then + ac_cv_file____libs_sky130_ml_xx_hd=yes +else + ac_cv_file____libs_sky130_ml_xx_hd=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____libs_sky130_ml_xx_hd" >&5 +$as_echo "$ac_cv_file____libs_sky130_ml_xx_hd" >&6; } +if test "x$ac_cv_file____libs_sky130_ml_xx_hd" = xyes; then : + + echo "Using pre-existing sky130_ml_xx_hd download..." + +else + + mkdir -p ../libs/sky130_ml_xx_hd + sh ./download.sh 'https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz' ../libs/sky130_ml_xx_hd.tar.gz + (echo "Extracting sky130_ml_xx_hd..." && cd ../libs && tar -xf sky130_ml_xx_hd.tar.gz --strip-components 1 -C ../libs/sky130_ml_xx_hd) + + +fi + + export SKY130_ML_XX_HD_PATH=../libs/sky130_ml_xx_hd + } + + # Check whether --enable-alpha-lib was given. +if test "${enable_alpha_lib+set}" = set; then : + enableval=$enable_alpha_lib; + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + SKY130_ML_XX_HD_GET + XSCHEM_INST=1 + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling sky130_ml_xx_hd..." + XSCHEM_DISABLED=1 + else + SKY130_ML_XX_HD_PATH=$enableval + fi + SKY130_ML_XX_HD_PATH=`readlink -f $SKY130_ML_XX_HD_PATH` + +fi + + + + + + + +XSCHEM_DISABLED=0 +XSCHEM_INST=0 + + + + + + + + # echo target targetvar flag url location + + XSCHEM_PATH="" + XSCHEM_GET() { + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../tools/xschem" >&5 +$as_echo_n "checking for ../tools/xschem... " >&6; } +if ${ac_cv_file____tools_xschem+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../tools/xschem"; then + ac_cv_file____tools_xschem=yes +else + ac_cv_file____tools_xschem=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____tools_xschem" >&5 +$as_echo "$ac_cv_file____tools_xschem" >&6; } +if test "x$ac_cv_file____tools_xschem" = xyes; then : + + echo "Using pre-existing xschem download..." + +else + + mkdir -p ../tools/xschem + sh ./download.sh 'https://github.com/StefanSchippers/xschem/archive/master.tar.gz' ../tools/xschem.tar.gz + (echo "Extracting xschem..." && cd ../tools && tar -xf xschem.tar.gz --strip-components 1 -C ../tools/xschem) + + +fi + + export XSCHEM_PATH=../tools/xschem + } + + # Check whether --enable-xschem was given. +if test "${enable_xschem+set}" = set; then : + enableval=$enable_xschem; + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + XSCHEM_GET + XSCHEM_INST=1 + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling xschem..." + XSCHEM_DISABLED=1 + else + XSCHEM_PATH=$enableval + fi + XSCHEM_PATH=`readlink -f $XSCHEM_PATH` + +fi + + + + if [ "$XSCHEM_INST" = 1 ]; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../tools/xschem-install" >&5 +$as_echo_n "checking for ../tools/xschem-install... " >&6; } +if ${ac_cv_file____tools_xschem_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r "../tools/xschem-install"; then + ac_cv_file____tools_xschem_install=yes +else + ac_cv_file____tools_xschem_install=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____tools_xschem_install" >&5 +$as_echo "$ac_cv_file____tools_xschem_install" >&6; } +if test "x$ac_cv_file____tools_xschem_install" = xyes; then : + + echo "Using pre-existing xschem installation..." + +else + + echo "---" + echo "Note: attempting to build xschem. Xschem requires all of Magic's dependencies and further, flex, bison and libxpm." + echo "Your build WILL fail if any of these are missing. You can choose to remove --enable-xschem or add a known installation path." + sleep 2 + mkdir -p ../tools/xschem-install + XSCHEM_ABSOLUTE=`readlink -f ../tools/xschem-install` + (cd ../tools/xschem && ./configure --prefix=$XSCHEM_ABSOLUTE && make && make install) + XSCHEM_PATH=$XSCHEM_ABSOLUTE + +fi + + fi + + @@ -2238,60 +2702,16 @@ fi -# Extract the first word of "magic", so it can be a program name with args. -set dummy magic; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_MAGIC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC in - [\\/]* | ?:[\\/]*) - ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_MAGIC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -MAGIC=$ac_cv_path_MAGIC -if test -n "$MAGIC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC" >&5 -$as_echo "$MAGIC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -if test -z "$MAGIC"; then - as_fn_error $? "You need 'magic' to generate the needed various cell views" "$LINENO" 5 -fi - # Check for "--with-ef-style" EF_STYLE=0 # Check whether --with-ef-style was given. if test "${with_ef_style+set}" = set; then : withval=$with_ef_style; - pdks_ef_style=$withval - if test "$withval" == "yes" -o "$withval" == "YES"; then - EF_STYLE=1 - fi + pdks_ef_style=$withval + if test "$withval" == "yes" -o "$withval" == "YES"; then + EF_STYLE=1 + fi fi
diff --git a/scripts/configure.ac b/scripts/configure.ac index b615f48..1c06fcf 100755 --- a/scripts/configure.ac +++ b/scripts/configure.ac
@@ -1,95 +1,118 @@ AC_INIT([open_pdks], [1.0], [github.com/RTimothyEdwards/open_pdks]) # detect PDKs based on directories that include Makefile.in files -m4_define([M4_GET_TECHS], [m4_normalize(m4_esyscmd(cd .. && find * -mindepth 1 -name "Makefile.in" -exec dirname {} \; | tr "\n" " "))]) +m4_define([M4_GET_TECHS], [m4_normalize(m4_esyscmd(cd .. && find * -mindepth 1 -maxdepth 1 -name "Makefile.in" -exec dirname {} \; | tr "\n" " "))]) +# define tools # define tools to install setup files for. This does not imply that the tools are # available on the system; just that open_pdks will install the setup files for them. +## DO NOT INCLUDE XSCHEM IN THE TOOL LIST. XSCHEM CAN BE INSTALLED IN THE CONFIG SCRIPT m4_define([M4_GET_TOOLS], [m4_normalize(m4_esyscmd(cat ./tools.txt | tr "\n" " "))]) +mkdir -p ../pdks + # check for the source and install paths for each PDK. -AC_DEFUN([M4_GEN_WITH_PDK_ARGS], -[ - # --with-pdk-source=PDK_SOURCE_PATH +AC_DEFUN([M4_GEN_WITH_PDK_ARGS], [ + + # --enable-pdk-[pdk]=/path/to/pdk m4_foreach_w(pdk, $1, [ - m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))]) - pdkvar[]_SOURCE_PATH_="" - AC_ARG_WITH(pdk-source, - [AS_HELP_STRING([--with-pdk-source=/path/to/pdk/source], "location of the source files for pdk")], - [pdkvar[]_SOURCE_PATH_=$withval] + m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))]) + + pdkvar[]_SOURCE_PATH="" + pdkvar[]_LOCAL_PATH="" + pdkvar[]_DIST_PATH="" + pdkvar[]_LINK_TARGETS="none" + + pdk_get() { + AC_CHECK_FILE(../pdk/[pdk]_url, [ + AC_CHECK_FILE(../pdks/pdk,[ + echo "Using pre-existing pdk download..." + ], [ + mkdir -p ../pdks/pdk + sh dl $(cat "../pdk/pdk_get") ../pdks/pdk.tar.gz; + (echo "Extracting pdk..." && cd ../pdks && tar -xf pdk.tar.gz --strip-components 1 -C ../pdks/pdk) + ]) + export pdkvar[]_SOURCE_PATH=../pdks/pdk + ], [ + AC_MSG_ERROR([PDK pdk cannot be automatically downloaded and requires a path.]) + ]) + } + + AC_ARG_ENABLE(pdk-[pdk], + [AS_HELP_STRING([--enable-pdk-[pdk]=@<:@/path/to/pdk/@:>@ --disable-pdk-[pdk]], "location of the source files for the pdk (pdks with a [pdk]_url file can automatically download them if the path is omitted)")], + [ + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + pdk_get + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling pdk..." + else + export pdkvar[]_SOURCE_PATH=$enableval + fi + ], [ + pdk_get + ] ) + # # Require this argument + # AC_MSG_NOTICE([Checking whether source path is specified for 'pdk']) + # if test "x$[]pdkvar[]_SOURCE_PATH" == "x" ; then + # AC_MSG_ERROR([Option --with-pdk-source=<path> not specified!]) + # fi - # Require this argument - AC_MSG_NOTICE([Checking whether source path is specified for 'pdk']) - if test "x$[]pdkvar[]_SOURCE_PATH_" == "x" ; then - AC_MSG_ERROR([Option --with-pdk-source=<path> not specified!]) - fi + if @<:@ "$[]pdkvar[]_SOURCE_PATH" != "" @:>@; then + pdkvar[]_SOURCE_PATH=`readlink -f $[]pdkvar[]_SOURCE_PATH` - pdkvar[]_SOURCE_PATH=`readlink -f $[]pdkvar[]_SOURCE_PATH_` + # basic check that the PDK exists there (the path must exist in any case) + AC_MSG_NOTICE([Checking specified path for 'pdk' at $pdkvar[]_SOURCE_PATH]) + AC_CHECK_FILE($pdkvar[]_SOURCE_PATH,[ + AC_MSG_NOTICE(['pdk' source path found at $pdkvar[]_SOURCE_PATH]) + ], [ + AC_MSG_ERROR([Specified path for 'pdk' at $pdkvar[]_SOURCE_PATH not found]) + ]) - # basic check that the PDK exists there (the path must exist in any case) - AC_MSG_NOTICE([Checking specified path for 'pdk' at $[]pdkvar[]_SOURCE_PATH]) - AC_CHECK_FILE($[]pdkvar[]_SOURCE_PATH, - [ - AC_MSG_NOTICE(['pdk' source path found at $[]pdkvar[]_SOURCE_PATH]) - ], - [ - AC_MSG_ERROR([Specified path for 'pdk' at $[]pdkvar[]_SOURCE_PATH not found]) - ]) - AC_SUBST([]pdkvar[]_SOURCE_PATH) - ]) + # --with-pdk-local-path=PDK_LOCAL_PATH + AC_ARG_WITH(pdk-local-path, + [AS_HELP_STRING([--with-pdk-local-path=/path/to/install/pdk], "run-time location of the PDK")], + [pdkvar[]_LOCAL_PATH=$withval] + ) + + # Require this argument + AC_MSG_NOTICE([Checking whether local path is specified for 'pdk']) + if test "x$[]pdkvar[]_LOCAL_PATH" == "x" ; then + AC_MSG_ERROR([Option --with-pdk-local-path=<path> not specified!]) + pdkvar[]_LOCAL_PATH="" + else + pdkvar[]_LOCAL_PATH=`readlink -f $[]pdkvar[]_LOCAL_PATH` + fi + # --with-pdk-dist-path=PDK_DIST_PATH + AC_ARG_WITH(pdk-dist-path, + [AS_HELP_STRING([--with-pdk-dist-path=/path/to/install/pdk], "staging location to install the PDK for distribution (optional)")], + [pdkvar[]_DIST_PATH=$withval] + ) - # --with-pdk-local-path=PDK_LOCAL_PATH - m4_foreach_w(pdk, $1, [ - m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))]) - pdkvar[]_LOCAL_PATH_="" - AC_ARG_WITH(pdk-local-path, - [AS_HELP_STRING([--with-pdk-local-path=/path/to/install/pdks], "run-time location of the PDKs")], - [pdkvar[]_LOCAL_PATH_=$withval] - ) - # Require this argument - AC_MSG_NOTICE([Checking whether local path is specified for 'pdk']) - if test "x$[]pdkvar[]_LOCAL_PATH_" == "x" ; then - AC_MSG_ERROR([Option --with-pdk-local-path=<path> not specified!]) - pdkvar[]_LOCAL_PATH="" - else - pdkvar[]_LOCAL_PATH=`readlink -f $[]pdkvar[]_LOCAL_PATH_` - fi - AC_SUBST([]pdkvar[]_LOCAL_PATH) - ]) + + # "Require" this argument + AC_MSG_NOTICE([Checking whether distribution path is specified for 'pdk']) + if test "x$[]pdkvar[]_DIST_PATH" == "x" ; then + AC_MSG_NOTICE([Option --with-pdk-dist-path=<path> not specified. Local install only.]) + pdkvar[]_DIST_PATH="" + else + pdkvar[]_DIST_PATH=`readlink -f $[]pdkvar[]_DIST_PATH` + fi - # --with-pdk-dist-path=PDK_DIST_PATH - m4_foreach_w(pdk, $1, [ - m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))]) - pdkvar[]_DIST_PATH_="" - AC_ARG_WITH(pdk-dist-path, - [AS_HELP_STRING([--with-pdk-dist-path=/path/to/install/pdks], "staging location to install the PDKs for distribution (optional)")], - [pdkvar[]_DIST_PATH_=$withval] - ) - # Require this argument - AC_MSG_NOTICE([Checking whether distribution path is specified for 'pdk']) - if test "x$[]pdkvar[]_DIST_PATH_" == "x" ; then - AC_MSG_NOTICE([Option --with-pdk-dist-path=<path> not specified. Local install only."]) - pdkvar[]_DIST_PATH="" - else - pdkvar[]_DIST_PATH=`readlink -f $[]pdkvar[]_DIST_PATH_` - fi - AC_SUBST([]pdkvar[]_DIST_PATH) - ]) + # --with-pdk-link-targets=PDK_LINK_TARGETS + AC_ARG_WITH(pdk-link-targets, + [AS_HELP_STRING([--with-pdk-link-targets=none|source], "make symbolic links to existing files @<:@default=none@:>@")], + [[]pdkvar[]_LINK_TARGETS=$with_[]pdk[]_link_targets] + ) + AC_SUBST([]pdkvar[]_LINK_TARGETS) + AC_MSG_NOTICE([Link targets set to $pdkvar[]_LINK_TARGETS]) + fi - # --with-pdk-link-targets=PDK_LINK_TARGETS - m4_foreach_w(pdk, $1, [ - m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))]) - # Default link_targets = "none" - pdkvar[]_LINK_TARGETS="none" - - AC_ARG_WITH(pdk-link-targets, - [AS_HELP_STRING([--with-pdk-link-targets=none|source], "make symbolic links to existing files @<:@default=none@:>@")], - [[]pdkvar[]_LINK_TARGETS=$with_[]pdk[]_link_targets] - ) - AC_SUBST([]pdkvar[]_LINK_TARGETS) - AC_MSG_NOTICE([Link targets set to $[]pdkvar[]_LINK_TARGETS]) + AC_SUBST(pdkvar[]_SOURCE_PATH) + AC_SUBST(pdkvar[]_LOCAL_PATH) + AC_SUBST(pdkvar[]_DIST_PATH) + AC_SUBST(pdkvar[]_LINK_TARGETS) ]) ]) @@ -97,6 +120,110 @@ M4_GEN_WITH_PDK_ARGS(M4_GET_TECHS()) +# Set variables for tool setups +AC_DEFUN([M4_GEN_WITH_TOOLS], [ + m4_foreach_w(tool, $1, [ + m4_define([toolvar], [m4_normalize(m4_esyscmd(echo tool | tr "a-z" "A-Z"))]) + + toolvar[]_DISABLED=0 + AC_ARG_ENABLE(tool, + AS_HELP_STRING( + --enable-tool + Enable or disable tool @<:@default=enabled@:>@ + ), [ + if test "$enableval" == "no" -o "$enableval" == "NO"; then + toolvar[]_DISABLED=1 + fi + ] + ) + AC_SUBST(toolvar[]_DISABLED) + ]) +]) + +AC_MSG_NOTICE([Found tools: M4_GET_TOOLS()]) + +M4_GEN_WITH_TOOLS(M4_GET_TOOLS()) + +# Magic +AC_PATH_PROG(MAGIC, magic) +if test -z "$MAGIC"; then + AC_MSG_ERROR([You need 'magic' to generate the needed various cell views.]) +fi + +# Other installations (libraries or tools if applicable) +mkdir -p ../libs +mkdir -p ../tools +AC_DEFUN([M4_GEN_INSTALLATION], [ + m4_define([target], $1) + m4_define([targetvar], [m4_normalize(m4_esyscmd(echo target | tr "a-z" "A-Z"))]) + m4_define([flag], $2) + m4_define([url], $3) + m4_define([location], $4) + + # echo target targetvar flag url location + + targetvar[]_PATH="" + targetvar[]_GET() { + AC_CHECK_FILE( + location/target, + [ + echo "Using pre-existing target download..." + ], [ + mkdir -p location/target + sh ./download.sh url location/target.tar.gz + (echo "Extracting target..." && cd location && tar -xf target.tar.gz --strip-components 1 -C location/target) + ] + ) + export targetvar[]_PATH=location/target + } + + AC_ARG_ENABLE( + flag, + AS_HELP_STRING( + [--enable-flag@<:@=path@:>@], + [Install target. If path is omitted, it'll be downloaded. @<:@default=disabled@:>@] + ), [ + if test "$enableval" == "yes" -o "$enableval" == "YES"; then + targetvar[]_GET + XSCHEM_INST=1 + elif test "$enableval" == "no" -o "$enableval" == "NO"; then + echo "Disabling target..." + XSCHEM_DISABLED=1 + else + targetvar[]_PATH=$enableval + fi + targetvar[]_PATH=`readlink -f $[]targetvar[]_PATH` + ], + [] + ) + + $5 + + AC_SUBST(targetvar[]_PATH) +]) + +M4_GEN_INSTALLATION(osu, osu-lib, 'https://vlsiarch.ecen.okstate.edu/flows/MOSIS_SCMOS/osu_stdcells_v2.4/osu_stdcells_lib.v2.4.tar.gz', ../libs) +M4_GEN_INSTALLATION(sky130_ml_xx_hd, alpha-lib, 'https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz', ../libs) + +XSCHEM_DISABLED=0 +XSCHEM_INST=0 +M4_GEN_INSTALLATION(xschem, xschem, 'https://github.com/StefanSchippers/xschem/archive/master.tar.gz', ../tools, [ + if @<:@ "$XSCHEM_INST" = 1 @:>@; then + AC_CHECK_FILE(../tools/xschem-install,[ + echo "Using pre-existing xschem installation..." + ], [ + echo "---" + echo "Note: attempting to build xschem. Xschem requires all of Magic's dependencies and further, flex, bison and libxpm." + echo "Your build WILL fail if any of these are missing. You can choose to remove --enable-xschem or add a known installation path." + sleep 2 + mkdir -p ../tools/xschem-install + XSCHEM_ABSOLUTE=`readlink -f ../tools/xschem-install` + (cd ../tools/xschem && ./configure --prefix=$XSCHEM_ABSOLUTE && make && make install) + XSCHEM_PATH=$XSCHEM_ABSOLUTE + ]) + fi +]) + AC_DEFUN([M4_GEN_WITH_TOOLS], [ m4_foreach_w(tool, $1, [ m4_define([toolvar], [m4_normalize(m4_esyscmd(echo tool | tr "a-z" "A-Z"))]) @@ -126,22 +253,20 @@ AM_PATH_PYTHON([3.4]) AX_PYTHON_MODULE([distutils],[]) -AC_PATH_PROG(MAGIC, magic) -if test -z "$MAGIC"; then - AC_MSG_ERROR([You need 'magic' to generate the needed various cell views]) -fi - # Check for "--with-ef-style" EF_STYLE=0 -AC_ARG_WITH([ef-style], - [AS_HELP_STRING([--with-ef-style], - [Use efabless style file system structure @<:@default=no@:>@])], - [ - pdks_ef_style=$withval - if test "$withval" == "yes" -o "$withval" == "YES"; then - EF_STYLE=1 - fi - ], ) +AC_ARG_WITH( + [ef-style], + AS_HELP_STRING( + [--with-ef-style], + [Use efabless style file system structure @<:@default=no@:>@] + ), [ + pdks_ef_style=$withval + if test "$withval" == "yes" -o "$withval" == "YES"; then + EF_STYLE=1 + fi + ], +) AC_SUBST(EF_STYLE)
diff --git a/scripts/print_tools_make.pl b/scripts/print_tools_make.pl new file mode 100644 index 0000000..0a54494 --- /dev/null +++ b/scripts/print_tools_make.pl
@@ -0,0 +1,21 @@ +#!/usr/bin/env perl +# +# This is a simple script that generates Makefile "TOOLS" flags. +# +# This is not used at all during part of any build or CI. It's a convenience +# tool for open_pdks contributors. +# +open(FH, '<', "./tools.txt") or die $!; +while (<FH>) { + chomp $_; + my $capitalized = uc $_; + my $disable_macro = "$capitalized\_DISABLED"; + print <<"HD" +# $disable_macro = 0 | 1 +$disable_macro = \@$disable_macro\@ +ifneq (\${$disable_macro}, 1) + TOOLS += $_ +endif + +HD +} \ No newline at end of file