Repository: dan-fritchman/Hdl21 (language: python)

Issue:
BUG: sky130 pdk pypi Install
When I try to install the sky130 pdk I receive the following error due to it not being able to find the readme.  Here I have "sky130-hdl21 == 5.0.0" as a dependency in the pyproject.toml of my "bandgaps" project and am trying to do an editable install of bandgaps.

I would propose that we convert the sky130-hdl21 pdk package to use a pyproject.toml to define the metadata and build the project using [flit](https://flit.pypa.io/en/stable/).  

This would have a simpler definition than the currernt setup.py and handles problems where the package is a zip rather than an actual path.

![image](https://github.com/dan-fritchman/Hdl21/assets/4685385/c1f471bf-df5f-4d9e-9b65-938bca8dc5e3)

Bring `pyproject.toml` Back!
@vighneshiyer pointed out (some time ago now) that `Poetry` now supports the feature we really wanted it to, when we ditched it: editable dev-mode installs. 

I think it's worth bringing back, when we have the chance. 


Discussion / hints:

I can also say firsthand, having used this on some other projects now, that Poetry does all the stuff we want for this project.  
Should be a relatively quick replacement of all the (4-5) `setup.py` files. 
This should probably more accurately be titled:  
Bring `pyproject.toml` back!

Since nowadays one can run `pip install -e` on projects with a TOML config (and no setup.py), without needing Poetry. 
I used poetry before and the editable dev install feature was the thing I wanted the most too :)))
One complication using the `pip`/ `pyproject.toml` combo: it doesn't appear to support the `dev-dependencies` feature.  
Tried this elsewhere to no luck, and found many issues around the internet to this effect:  
https://github.com/python-poetry/poetry/issues/3348

In `setup.py` the development-dependencies are an "extra feature", which just happens to be named `dev`. Tried that too, to no avail. 

Fix patch:
diff --git a/SampleSitePdks/LICENSE b/SampleSitePdks/LICENSE
new file mode 100644
index 00000000..2a2ea6c4
--- /dev/null
+++ b/SampleSitePdks/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021, Dan Fritchman
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/SampleSitePdks/pyproject.toml b/SampleSitePdks/pyproject.toml
new file mode 100644
index 00000000..4020485e
--- /dev/null
+++ b/SampleSitePdks/pyproject.toml
@@ -0,0 +1,53 @@
+[project]
+name = "sitepdks"
+version = "5.0.0"
+description="PDK Installations on THIS Machine"
+dependencies = [
+    "hdl21 >= 5.0.0,<6.0.0",
+    "sky130-hdl21 >= 5.0.0,<6.0.0",
+    "gf180-hdl21 >= 5.0.0,<6.0.0",
+    "asap7-hdl21 >= 5.0.0,<6.0.0",
+]
+requires-python = ">=3.7, <3.13"
+maintainers = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+]
+authors = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+  {name = "Curtis Mayberry", email = "Curtisma3@gmail.com"},
+]
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["HDL", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[project.urls]
+Homepage = "https://github.com/dan-fritchman/Hdl21"
+Documentation = "https://github.com/dan-fritchman/Hdl21/blob/main/readme.md"
+Repository = "https://github.com/dan-fritchman/Hdl21"
+"Bug Tracker" = "https://github.com/dan-fritchman/Hdl21/issues"
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "sitepdks"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/SampleSitePdks/setup.py b/SampleSitePdks/setup.py
deleted file mode 100644
index cb527c0a..00000000
--- a/SampleSitePdks/setup.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-here = pathlib.Path(__file__).parent.resolve()
-
-# Get the long description from the README file
-long_description = (here / "readme.md").read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "5.0.0"
-
-setup(
-    name="sitepdks",
-    version=_VLSIR_VERSION,
-    description="PDK Installations on THIS Machine",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="",
-    author="Dan Fritchman",
-    author_email="dan@fritch.mn",
-    packages=find_packages(),
-    python_requires=">=3.7",
-    install_requires=[
-        f"sky130-hdl21=={_VLSIR_VERSION}",
-        # f"asap7-hdl21=={_VLSIR_VERSION}",
-    ],
-    extras_require={
-        "dev": ["pytest==7.1", "coverage", "pytest-cov", "black==22.6", "twine"]
-    },
-)
diff --git a/pdks/Asap7/LICENSE b/pdks/Asap7/LICENSE
new file mode 100644
index 00000000..2a2ea6c4
--- /dev/null
+++ b/pdks/Asap7/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021, Dan Fritchman
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pdks/Asap7/pyproject.toml b/pdks/Asap7/pyproject.toml
new file mode 100644
index 00000000..58efed82
--- /dev/null
+++ b/pdks/Asap7/pyproject.toml
@@ -0,0 +1,51 @@
+[project]
+name = "asap7-hdl21"
+version = "5.0.0"
+description="ASAP7 PDK Package for Hdl21"
+dependencies = [
+    "hdl21 >= 5.0.0,<6.0.0",
+]
+requires-python = ">=3.7, <3.13"
+maintainers = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+]
+authors = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+  {name = "Thomas Pluck"},
+  {name = "Curtis Mayberry", email = "Curtisma3@gmail.com"},
+]
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["PDK", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[project.urls]
+Homepage = "https://github.com/dan-fritchman/Hdl21"
+Documentation = "https://github.com/dan-fritchman/Hdl21/blob/main/pdks/Asap7/readme.md"
+Repository = "https://github.com/dan-fritchman/Hdl21"
+"Bug Tracker" = "https://github.com/dan-fritchman/Hdl21/issues"
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "asap7_hdl21"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/pdks/Asap7/setup.py b/pdks/Asap7/setup.py
deleted file mode 100644
index 067a6f38..00000000
--- a/pdks/Asap7/setup.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-here = pathlib.Path(__file__).parent.resolve()
-
-# Get the long description from the README file
-long_description = (here / "readme.md").read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "5.0.0"
-
-setup(
-    name="asap7-hdl21",
-    version=_VLSIR_VERSION,
-    description="ASAP7 PDK Package for Hdl21",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="https://github.com/dan-fritchman/Hdl21",
-    author="Dan Fritchman",
-    packages=find_packages(),
-    python_requires=">=3.7",
-    install_requires=[f"hdl21=={_VLSIR_VERSION}"],
-    extras_require={"dev": ["pytest==7.1", "coverage", "pytest-cov", "twine"]},
-)
diff --git a/pdks/Gf180/LICENSE b/pdks/Gf180/LICENSE
new file mode 100644
index 00000000..2a2ea6c4
--- /dev/null
+++ b/pdks/Gf180/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021, Dan Fritchman
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pdks/Gf180/pyproject.toml b/pdks/Gf180/pyproject.toml
new file mode 100644
index 00000000..9c4acda8
--- /dev/null
+++ b/pdks/Gf180/pyproject.toml
@@ -0,0 +1,51 @@
+[project]
+name = "gf180-hdl21"
+version = "5.0.0"
+description="Global Foundries 180nm MCU PDK Package for Hdl21"
+dependencies = [
+    "hdl21 >= 5.0.0,<6.0.0",
+]
+requires-python = ">=3.7, <3.13"
+maintainers = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+]
+authors = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+  {name = "Thomas Pluck"},
+  {name = "Curtis Mayberry", email = "Curtisma3@gmail.com"},
+]
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["PDK", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[project.urls]
+Homepage = "https://github.com/dan-fritchman/Hdl21"
+Documentation = "https://github.com/dan-fritchman/Hdl21/blob/main/pdks/Gf180/readme.md"
+Repository = "https://github.com/dan-fritchman/Hdl21"
+"Bug Tracker" = "https://github.com/dan-fritchman/Hdl21/issues"
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "gf180_hdl21"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/pdks/Gf180/setup.py b/pdks/Gf180/setup.py
deleted file mode 100644
index 7eacec1f..00000000
--- a/pdks/Gf180/setup.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-here = pathlib.Path(__file__).parent.resolve()
-
-# Get the long description from the README file
-long_description = (here / "readme.md").read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "5.0.0"
-
-setup(
-    name="gf180-hdl21",
-    version=_VLSIR_VERSION,  # Maybe this should change
-    description="Global Foundries 180nm MCU PDK Package for Hdl21",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="https://github.com/dan-fritchman/Hdl21",
-    author="Dan Fritchman, Thomas Pluck",
-    packages=find_packages(),
-    python_requires=">=3.7",
-    install_requires=[f"hdl21=={_VLSIR_VERSION}"],
-    extras_require={"dev": ["pytest==7.1", "coverage", "pytest-cov", "twine"]},
-)
diff --git a/pdks/PdkTemplate/{{cookiecutter.repo_name}}/pyproject.toml b/pdks/PdkTemplate/{{cookiecutter.repo_name}}/pyproject.toml
new file mode 100644
index 00000000..9e8ebffd
--- /dev/null
+++ b/pdks/PdkTemplate/{{cookiecutter.repo_name}}/pyproject.toml
@@ -0,0 +1,37 @@
+[project]
+name = "{{ cookiecutter.pypi_name }}"
+version = "{{cookiecutter.version}}"
+description="{{ cookiecutter.pdk_name }} PDK Package for Hdl21"
+dependencies = [
+  "hdl21 >= 5.0.0,<6.0.0",
+]
+requires-python = ">=3.7, <3.13"
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["PDK", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "{{cookiecutter.pdk_name}}"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/pdks/PdkTemplate/{{cookiecutter.repo_name}}/setup.py b/pdks/PdkTemplate/{{cookiecutter.repo_name}}/setup.py
deleted file mode 100644
index f2cdccb7..00000000
--- a/pdks/PdkTemplate/{{cookiecutter.repo_name}}/setup.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-here = pathlib.Path(__file__).parent.resolve()
-
-# Get the long description from the README file
-long_description = (here / "readme.md").read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "{{cookiecutter.vlsir_version}}"
-
-setup(
-    name="{{ cookiecutter.pypi_name }}",
-    version="{{cookiecutter.version}}",
-    description="{{ cookiecutter.pdk_name }} Hdl21 PDK Package",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="",
-    author="",
-    packages=find_packages(),
-    python_requires=">=3.7",
-    install_requires=[
-        "pydantic>=1.9.0",
-        f"hdl21=={_VLSIR_VERSION}",
-    ],
-    extras_require={"dev": ["pytest==7.1", "coverage", "pytest-cov", "twine"]},
-)
diff --git a/pdks/Sky130/LICENSE b/pdks/Sky130/LICENSE
new file mode 100644
index 00000000..2a2ea6c4
--- /dev/null
+++ b/pdks/Sky130/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021, Dan Fritchman
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pdks/Sky130/pyproject.toml b/pdks/Sky130/pyproject.toml
new file mode 100644
index 00000000..1f64d849
--- /dev/null
+++ b/pdks/Sky130/pyproject.toml
@@ -0,0 +1,51 @@
+[project]
+name = "sky130-hdl21"
+version = "5.0.0"
+description="SkyWater 130nm PDK Package for Hdl21"
+dependencies = [
+    "hdl21 >= 5.0.0,<6.0.0",
+]
+requires-python = ">=3.7, <3.13"
+maintainers = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+]
+authors = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+  {name = "Thomas Pluck"},
+  {name = "Curtis Mayberry", email = "Curtisma3@gmail.com"},
+]
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["PDK", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[project.urls]
+Homepage = "https://github.com/dan-fritchman/Hdl21"
+Documentation = "https://github.com/dan-fritchman/Hdl21/blob/main/pdks/Sky130/readme.md"
+Repository = "https://github.com/dan-fritchman/Hdl21"
+"Bug Tracker" = "https://github.com/dan-fritchman/Hdl21/issues"
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "sky130_hdl21"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/pdks/Sky130/setup.py b/pdks/Sky130/setup.py
deleted file mode 100644
index ccb9839e..00000000
--- a/pdks/Sky130/setup.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-here = pathlib.Path(__file__).parent.resolve()
-
-# Get the long description from the README file
-long_description = (here / "readme.md").read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "5.0.0"
-
-setup(
-    name="sky130-hdl21",
-    version=_VLSIR_VERSION,
-    description="SkyWater 130nm PDK Package for Hdl21",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="https://github.com/dan-fritchman/Hdl21",
-    author="Dan Fritchman, Thomas Pluck",
-    packages=find_packages(),
-    python_requires=">=3.7",
-    install_requires=[f"hdl21=={_VLSIR_VERSION}"],
-    extras_require={"dev": ["pytest==7.1", "coverage", "pytest-cov", "twine"]},
-)
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..9f2938c8
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,57 @@
+[project]
+name = "hdl21"
+version = "5.0.0"
+description="Hardware Description Library"
+dependencies = [
+    "vlsir >= 5.0.0,<6.0.0",
+    "vlsirtools >= 5.0.0,<6.0.0",
+    "pydantic>=1.9.0,<2.7",
+]
+requires-python = ">=3.7, <3.13"
+maintainers = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+]
+authors = [
+  {name = "Dan Fritchman", email = "dan@fritch.mn"},
+  {name = "Thomas Pluck"},
+  {name = "Kennedy Caisley"},
+  {name = "Zeyi Wang"},
+  {name = "Arya Reais-Parsi"},
+  {name = "Vighnesh Iyer"},
+  {name = "Curtis Mayberry", email = "Curtisma3@gmail.com"},
+]
+
+readme = "readme.md"
+license = {file = "LICENSE"}
+keywords = ["HDL", "EDA", "analog", "circuit"]
+classifiers = [
+  "Development Status :: 4 - Beta",
+  "Programming Language :: Python",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+]
+
+[project.optional-dependencies]
+dev = [
+    "pytest==7.1",
+    "coverage",
+    "pytest-cov",
+    "pre-commit==2.20",
+    "black==22.6",
+    "flit",
+]
+
+[project.urls]
+Homepage = "https://github.com/dan-fritchman/Hdl21"
+Documentation = "https://github.com/dan-fritchman/Hdl21/blob/main/readme.md"
+Repository = "https://github.com/dan-fritchman/Hdl21"
+"Bug Tracker" = "https://github.com/dan-fritchman/Hdl21/issues"
+
+[build-system]
+requires = ["flit_core >=3.2,<4"]
+build-backend = "flit_core.buildapi"
+
+[tool.flit.module]
+name = "hdl21"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=pdks/PdkTemplate"
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 5765415d..00000000
--- a/setup.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-# Setup Script
-
-Derived from the setuptools sample project at
-https://github.com/pypa/sampleproject/blob/main/setup.py
-
-"""
-
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-import pathlib
-
-# Get the long description from the README file
-here = pathlib.Path(__file__).parent.resolve()
-readme = here / "readme.md"
-long_description = "" if not readme.exists() else readme.read_text(encoding="utf-8")
-
-_VLSIR_VERSION = "5.0.0"
-
-setup(
-    name="hdl21",
-    version=_VLSIR_VERSION,
-    description="Hardware Description Library",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="https://github.com/dan-fritchman/Hdl21",
-    author="Dan Fritchman",
-    author_email="dan@fritch.mn",
-    packages=find_packages(),
-    package_data={"hdl21": ["**/*.sp"]},  # Include built-in PDK models
-    python_requires=">=3.7, <3.13",
-    install_requires=[
-        f"vlsir=={_VLSIR_VERSION}",
-        f"vlsirtools=={_VLSIR_VERSION}",
-        # Our primary external dependency is pydantic.
-        # Tested with everything in the 1.9-2.6 range.
-        "pydantic>=1.9.0,<2.7",
-    ],
-    extras_require={
-        "dev": [
-            "pytest==7.1",
-            "coverage",
-            "pytest-cov",
-            "pre-commit==2.20",
-            "black==22.6",
-            "twine",
-            "build",
-        ]
-    },
-)


Test patch:
diff --git a/pytest.ini b/pytest.ini
deleted file mode 100644
index b4962858..00000000
--- a/pytest.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[pytest]
-addopts = --ignore=pdks/PdkTemplate
\ No newline at end of file