| AC_INIT([open_pdks], [1.0], [github.com/RTimothyEdwards/open_pdks]) | |
| # AC_PREFIX_DEFAULT(/usr) | |
| AC_CONFIG_MACRO_DIR(m4) | |
| ## REQUIRES: https://www.gnu.org/software/autoconf-archive/ax_python_module.html#ax_python_module | |
| AM_PATH_PYTHON([3.4]) | |
| AX_PYTHON_MODULE([distutils],[]) | |
| # Check for Mac OS X gsed vs. sed | |
| m4_ifndef([AC_PROG_SED], | |
| [AC_DEFUN([AC_PROG_SED],[AC_ARG_VAR([SED]) | |
| AC_CHECK_PROGS([SED],[gsed sed])])]) | |
| AC_PROG_SED | |
| AC_SUBST(SED) | |
| realpath() { | |
| # Cross-platform, handles empty argument, and ~ | |
| if @<:@ "$#" != "1" @:>@ ; then return ; fi | |
| python3 -c 'import os,sys;print(os.path.realpath(os.path.expanduser(sys.argv@<:@1@:>@)))' $1 | |
| } | |
| ENABLED_TECHS= | |
| # Export the open_pdks top level directory | |
| OPENPDKS_TOP=`cd .. && pwd` | |
| # detect PDKs based on directories that include Makefile.in files | |
| m4_define([M4_GET_TECHS], [m4_normalize(m4_esyscmd(cd .. && find -H * -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. | |
| m4_define([M4_GET_TOOLS], [m4_normalize(m4_esyscmd(cat ./tools.txt | tr "\n" " "))]) | |
| # check for the source and install paths for each PDK. | |
| AC_DEFUN([M4_GEN_WITH_PDK_ARGS], [ | |
| # --enable-pdk-[pdk]=/path/to/pdk | |
| m4_foreach_w(pdk, $1, [ | |
| echo "Checking technology pdk..." | |
| m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z-" "A-Z_"))]) | |
| pdkvar[]_ENABLED_VARIANTS="all" | |
| pdkvar[]_SOURCE_PATH="" | |
| pdkvar[]_LINK_TARGETS="none" | |
| pdkvar[]_AUTO="0" | |
| 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 | |
| export pdkvar[]_SOURCE_PATH=../sources/pdk-[pdk] | |
| pdkvar[]_AUTO="1" | |
| ENABLED_TECHS="$ENABLED_TECHS pdk" | |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then | |
| echo "Disabling pdk..." | |
| else | |
| pdkvar[]_SOURCE_PATH=$enableval | |
| ENABLED_TECHS="$ENABLED_TECHS pdk" | |
| fi | |
| ], [ | |
| ] | |
| ) | |
| if @<:@ "$[]pdkvar[]_SOURCE_PATH" != "" @:>@; then | |
| pdkvar[]_SOURCE_PATH=`realpath $[]pdkvar[]_SOURCE_PATH` | |
| pdkvar[]_BASENAME=`basename $[]pdkvar[]_SOURCE_PATH` | |
| if @<:@ "$[]pdkvar[]_BASENAME" = "libraries" @:>@; then | |
| pdkvar[]_SOURCE_PATH=`dirname $[]pdkvar[]_SOURCE_PATH` | |
| fi | |
| # Basic check that the PDK path exists, unless depending on Makefile | |
| # to download it automatically. | |
| if @<:@ "$[]pdkvar[]_AUTO" = "0" @:>@; then | |
| 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]) | |
| ]) | |
| else | |
| AC_MSG_NOTICE([PDK 'pdk' will be downloaded automatically during make.]) | |
| fi | |
| # --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]) | |
| # --with-pdk-variants=PDK_ENABLED_VARIANTS | |
| AC_ARG_WITH(pdk-variants, | |
| [AS_HELP_STRING([--with-pdk-variants=all|A|B|...], "compile/install specified PDK variants only @<:@default=all@:>@")], | |
| [[]pdkvar[]_ENABLED_VARIANTS=$with_[]pdk[]_variants] | |
| ) | |
| AC_SUBST([]pdkvar[]_ENABLED_VARIANTS) | |
| AC_MSG_NOTICE([Enabled variants set to $pdkvar[]_ENABLED_VARIANTS]) | |
| fi | |
| AC_SUBST(pdkvar[]_SOURCE_PATH) | |
| AC_SUBST(pdkvar[]_LINK_TARGETS) | |
| AC_SUBST(pdkvar[]_ENABLED_VARIANTS) | |
| ]) | |
| ]) | |
| AC_MSG_NOTICE([Found technology directories: M4_GET_TECHS()]) | |
| M4_GEN_WITH_PDK_ARGS(M4_GET_TECHS()) | |
| # Export the list of known technologies to the Makefile | |
| ALL_TECHS="M4_GET_TECHS()" | |
| AC_SUBST(ALL_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 setup @<:@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 | |
| AC_PATH_PROG(PATCH, patch) | |
| if test -z "$PATCH"; then | |
| AC_MSG_ERROR([You need 'patch' to apply patches.]) | |
| fi | |
| # Other installations (libraries or tools if applicable) | |
| 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([location], $3) | |
| # echo target targetvar flag location | |
| targetvar[]_PATH="" | |
| AC_ARG_ENABLE( | |
| flag, | |
| AS_HELP_STRING( | |
| [--enable-flag@<:@=path@:>@], | |
| [Install target. If path is omitted, the repository will be downloaded. @<:@default=enabled@:>@] | |
| ), [ | |
| if test "$enableval" == "yes" -o "$enableval" == "YES"; then | |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) | |
| export targetvar[]_PATH=location/target | |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then | |
| AC_MSG_NOTICE([Disabling package 'target']) | |
| export targetvar[]_PATH="" | |
| else | |
| targetvar[]_PATH=$enableval | |
| AC_MSG_NOTICE([Enabling package 'target' at $[]targetvar[]_PATH]) | |
| fi | |
| targetvar[]_PATH=`realpath $[]targetvar[]_PATH` | |
| ],[ | |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) | |
| targetvar[]_PATH=location/target | |
| ] | |
| ) | |
| $4 | |
| AC_SUBST(targetvar[]_PATH) | |
| ]) | |
| # Optional installations (like the above, but disabled by default) | |
| AC_DEFUN([M4_OPT_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([location], $3) | |
| # echo target targetvar flag location | |
| targetvar[]_PATH="" | |
| AC_ARG_ENABLE( | |
| flag, | |
| AS_HELP_STRING( | |
| [--enable-flag@<:@=path@:>@], | |
| [Install target. If path is omitted, the repository will be downloaded. @<:@default=disabled@:>@] | |
| ), [ | |
| if test "$enableval" == "yes" -o "$enableval" == "YES"; then | |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) | |
| export targetvar[]_PATH=location/target | |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then | |
| AC_MSG_NOTICE([Disabling package 'target']) | |
| export targetvar[]_PATH="" | |
| else | |
| targetvar[]_PATH=$enableval | |
| AC_MSG_NOTICE([Enabling package 'target' at $[]targetvar[]_PATH]) | |
| fi | |
| targetvar[]_PATH=`realpath $[]targetvar[]_PATH` | |
| ],[ | |
| AC_MSG_NOTICE([Package 'target' will not be installed.]) | |
| ] | |
| ) | |
| $4 | |
| AC_SUBST(targetvar[]_PATH) | |
| ]) | |
| # NOTE: This part of the configuration should be based off of the | |
| # contents of a file with a predetermined name existing in each of | |
| # the open PDK directories. | |
| # SkyWater sky130 essential | |
| M4_GEN_INSTALLATION(sky130_fd_pr, primitive-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_io, io-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_hs, sc-hs-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_ms, sc-ms-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_ls, sc-ls-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_lp, sc-lp-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_hd, sc-hd-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_hdll, sc-hdll-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_fd_sc_hvl, sc-hvl-sky130, ../sources) | |
| M4_GEN_INSTALLATION(sky130_ml_xx_hd, alpha-sky130, ../sources) | |
| M4_GEN_INSTALLATION(xschem_sky130, xschem-sky130, ../sources) | |
| M4_GEN_INSTALLATION(klayout_sky130, klayout-sky130, ../sources) | |
| M4_GEN_INSTALLATION(precheck_sky130, precheck-sky130, ../sources) | |
| # SkyWater sky130 optional | |
| M4_OPT_INSTALLATION(sky130_sram_macros, sram-sky130, ../sources) | |
| M4_OPT_INSTALLATION(sky130_fd_bd_sram, sram-space-sky130, ../sources) | |
| M4_OPT_INSTALLATION(sky130_fd_pr_reram, reram-sky130, ../sources) | |
| M4_OPT_INSTALLATION(sky130_osu_t12, osu-t12-sky130, ../sources) | |
| M4_OPT_INSTALLATION(sky130_osu_t15, osu-t15-sky130, ../sources) | |
| M4_OPT_INSTALLATION(sky130_osu_t18, osu-t18-sky130, ../sources) | |
| # GlobalFoundries gf180mcu essential | |
| M4_GEN_INSTALLATION(gf180mcu_fd_pr, primitive-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_fd_pv, verification-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_fd_io, io-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_fd_sc_mcu7t5v0, sc-7t5v0-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_fd_sc_mcu9t5v0, sc-9t5v0-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_fd_ip_sram, sram-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_ocd_alpha, alpha-gf180mcu, ../sources) | |
| # GlobalFoundries gf180mcu optional | |
| M4_GEN_INSTALLATION(gf180mcu_osu_sc, osu-sc-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_as_sc, avalon-sc-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_re_efuse, re-efuse-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_ocd_io, ocd-io-gf180mcu, ../sources) | |
| M4_GEN_INSTALLATION(gf180mcu_ocd_ip_sram, ocd-sram-gf180mcu, ../sources) | |
| 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 --disable-tool, | |
| Enable or disable tool setup @<:@default=enabled@:>@ | |
| ), | |
| [ | |
| if test "$enableval" == "no" -o "$enableval" == "NO"; then | |
| toolvar[]_DISABLED=1 | |
| fi | |
| ], | |
| ) | |
| AC_SUBST(toolvar[]_DISABLED) | |
| ]) | |
| ]) | |
| AC_MSG_NOTICE([Tools enabled for PDK setup installation: M4_GET_TOOLS()]) | |
| # Check for "--with-reference" | |
| USE_REFERENCE=0 | |
| AC_ARG_WITH( | |
| [reference], | |
| AS_HELP_STRING( | |
| [--with-reference], | |
| [Use PDK JSON file reference commit values for sources @<:@default=no@:>@] | |
| ), [ | |
| pdks_reference=$withval | |
| if test "$withval" == "yes" -o "$withval" == "YES"; then | |
| USE_REFERENCE=1 | |
| else | |
| USE_REFERENCE="$pdks_reference" | |
| fi | |
| ], | |
| ) | |
| AC_SUBST(USE_REFERENCE) | |
| # 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_SUBST(EF_STYLE) | |
| # Export the list of enabled technologies to the Makefile | |
| AC_SUBST(ENABLED_TECHS) | |
| # Export the top level directory of open_pdks | |
| AC_SUBST(OPENPDKS_TOP) | |
| MAKEFILES=$(find -L .. -name "Makefile.in" | sed 's/\(.*\)\.in/\1/g') | |
| AC_CONFIG_FILES($MAKEFILES) | |
| AC_OUTPUT | |
| AC_MSG_RESULT(Build configured successfully) |