Oklahoma State University (OSU) standard cells for SKY90FD
==========================================================

This repository will contain a new set of standard cells for the
`SKY90FD process technology release by Google and SkyWater <https://github.com/google/sky90fd-pdk>`_.

These standard cells are being designed by James E. Stine, Jr. from the
VLSI Computer Architecture Research Group.

VLSI Computer Architecture Research Group
=========================================

-  James E. Stine, Jr.
-  Teo Ene
-  Landon Burleson
-  Ryan Swann
-  Ryan Ridley
-  Brett Mathis
-  Alex Underwood
-  S. Ross Thompson
-  Peter Tikalsky
-  Brandon Ong
-  Hunter Lusk

Thanks to the following for help, guidance and support!

-  Tim ‘mithro’ Ansell <tansell@google.com> (Google)
-  Tim Edwards <tim@efabless.com> (eFabless)
-  Mohamed Kassem <mkk@efabless.com> (eFabless)

License
=======

This repository is released under the Apache 2.0 license. The full
license text can be found in the `LICENSE <LICENSE>`_ file.

::

   Copyright 2022  Board of Regents for the Oklahoma Agricultural and Mechanical Colleges

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License
