System on Chip Design Flow including standard cells for SkyWater 130nm process

# 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

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)

################################################################

Oklahoma State University 130nm Library
Board of Regents for the Oklahoma Agricultural and Mechanical Colleges
VLSI Computer Architecture Research Laboratory

We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:

    Reporting a bug
    Discussing the current state of the code
    Submitting a fix
    Proposing new features
    Becoming a maintainer

  Any contributions you make will be under the Apache 2.0 Software License

  In short, when you submit code changes, your submissions are understood to be under the same Apache 2.0 License that covers the project. Feel free to contact the maintainers if that's a concern.

  Write bug reports with detail, background, and sample code

  Great Bug Reports tend to have:

    A quick summary and/or background
    Steps to reproduce
      Be specific!
      Give sample code if you can.
    What you expected would happen
    What actually happens
    Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)

Use a Consistent Coding Style

    2 spaces for indentation rather than tabs
    You can try running npm run lint for style unification

License

  By contributing, you agree that your contributions will be licensed under its Apache 2.0 License.

Development Team

In no particular order, we list the team members of the development team. We have put our life blood into this project.  We hope you enjoy it.  All of us have worked hard to contribute to this project in some way.  Please contribute by using or contributing.  If you use this library, please reference Oklahoma State University VLSI Computer Architecture Research Laboratory under an Apache 2.0 license.

James Stine
Teo Ene
Landon Burleson
Ryan Swann
Ryan Ridley
Brett Mathis
Alex Underwood
S. Ross Thompson
Peter Tikalsky

################################################################
