diff --git a/docs/index.rst b/docs/index.rst index 3261a63..fd29723 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,6 +22,7 @@ glossary contributing + resources partners references diff --git a/docs/resources.rst b/docs/resources.rst new file mode 100644 index 0000000..9341951 --- /dev/null +++ b/docs/resources.rst @@ -0,0 +1,111 @@ +Further Resources +================= + + +News Articles +------------- + +* `Open Source Process Design Kit from Google, SkyWater Technologies and Partners Released `__ +* `Free chips courtesy of Google, SkyWater, eFabless `__ +* `Design an Open-Source SoC with Google SkyWater PDK, Get It Manufactured for Free `__ +* `CREATING A CUSTOM ASIC WITH THE FIRST OPEN SOURCE PDK `__ +* `Google, SkyWater Release Production Dev Kit, Offer Open Hardware Projects Free 130nm Manufacturing `__ +* `Produce your own physical chips. For free. In the Open. `__ + + +Conferences +----------- + +ICCAD 2020 +~~~~~~~~~~ + +**Conference Dates:** 2nd November 2020 to 5th November 2020 + +* `https://iccad.com/event_details?id=305-8-D `__ + +WOSET 2020 +~~~~~~~~~~ + +* `https://woset-workshop.github.io/WOSET2020.html `__ +* `https://woset-workshop.github.io/PDFs/2020/a03.pdf `__ +* `https://woset-workshop.github.io/PDFs/2020/a04.pdf `__ +* `https://woset-workshop.github.io/PDFs/2020/a23.pdf `__ +* `https://woset-workshop.github.io/PDFs/2020/a21.pdf `__ + +VLSI SoC Conference 2020 +~~~~~~~~~~~~~~~~~~~~~~~~ + +* `https://ef.link/KLO5s `__ + + +Talk Series +----------- + +FOSSi Foundation Dialup Talk Series +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Free and Open Source Silicon and EDA tools. It features selected speakers from the rapidly developing FOSSi ecosystem. + +**Page**: https://fossi-foundation.org/dial-up/ + +Fully open source manufacturable PDK for a 130nm process +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: Tim Ansell +**Details**: Google Kick-off Presentation of Open Source Foundry +**Video**: `[FOSSi Dial-Up] Tim Ansell - Skywater PDK: Fully open source manufacturable PDK for a 130nm process `__ +**Video**: `Open Source manufacturable PDK for Skywater 130nm process node (Google slides) `__ + +The striVe RISC-V SoC Family on SkyWater 130nm +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: Mohamed Kassem +**Video**: `[FOSSi Dial-Up] Mohamed Kassem - The striVe RISC-V SoC Family on SkyWater 130nm `__ +**Video**: `The striVe RISC-V SoC Family on Skywater 130nm (PPTX) `__ +**Video**: `The striVe RISC-V SoC Family on Skywater 130nm (PDF) `__ + +OpenLane, A Digital ASIC Flow for SkyWater 130nm Open PDK +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: Mohamed Shalan +**Video**: `[FOSSi Dial-Up] Mohamed Shalan - OpenLane, A Digital ASIC Flow for SkyWater 130nm Open PDK `__ +**Video**: `OpenLane, A Digital ASIC Flow for Skywater 130nm Open PDK `__ + +Designing new 130nm cells for SkyWater 130nm +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: James Stine +**Video**: `[FOSSi Dial-Up] James Stine - Designing new 130nm cells for SkyWater 130nm `__ +**Video**: `Engineering System on Chip (SoC) Flows for SkyWater 130nm Open PDK `__ + +OpenRAM on SkyWater 130nm +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: Matt Guthaus +**Video**: `[FOSSi Dial-Up] Matt Guthaus - OpenRAM on SkyWater 130nm `__ +**Video**: `OpenRAM on SkyWater 130nm `__ + +The Amp Hour Podcast +~~~~~~~~~~~~~~~~~~~~ + +Fabless Chip Design with Mohamed Kassem +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Presenter**: Mohamed Kassem +**Video**: `#503 – Fabless Chip Design with Mohamed Kassem `__ + + +LinkedIn Posts +-------------- + +* `Mohamed Kassem `__ +* `Mike Wishart `__ +* `Efabless Corporation `__ + + +Courses +------- + +* `VLSI Systems Design course main page `__ +* `Lab - Intro to OpenLane and Skywater 130 `__ + diff --git a/requirements.txt b/requirements.txt index 41b39cc..d564202 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,9 @@ wavedrom # rst_include tool as GitHub doesn't support `.. include::` when rendering # previews. rst_include +pandas +odfpy +Jinja2 # The Python API for the SkyWater PDK. -e scripts/python-skywater-pdk diff --git a/scripts/python-skywater-pdk/setup.py b/scripts/python-skywater-pdk/setup.py index 7b7029e..fed4c3b 100644 --- a/scripts/python-skywater-pdk/setup.py +++ b/scripts/python-skywater-pdk/setup.py @@ -70,4 +70,8 @@ setup( 'Bug Reports': 'https://github.com/google/skywater-pdk/issues', 'Source': 'https://github.com/google/skywater-pdk/', }, + + package_data = { + 'skywater_pdk': ['templates/resources.template.rst'], + }, ) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py new file mode 100644 index 0000000..bb17cdb --- /dev/null +++ b/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright 2020 SkyWater PDK Authors +# +# 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 +# +# https://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. +# +# SPDX-License-Identifier: Apache-2.0 + +import sys +import os +import argparse +from pathlib import Path +import pandas as pd +import errno +from jinja2 import Template +import importlib.resources as resources + +sys.path.insert(0, os.path.abspath(__file__ + '/../../')) + +from skywater_pdk import templates + + +def parse_entries(filepath, sheet_name, cols=None): + """ + Loads resources from spreadsheet to pandas frames. + + Parameters + ---------- + filepath: + path or URL to spreadsheet file (ODS requires odfpy package, XLSX + requires xlrd package) + sheet_name: name of the sheet to extract data from + cols: range of columns to extract from the sheet + """ + values = pd.read_excel( + filepath, + sheet_name=sheet_name, + header=0, + usecols=cols + ) + values = values.where(values.notnull(), None) + return values + + +def main(argv): + parser = argparse.ArgumentParser(prog=argv[0]) + parser.add_argument( + 'output', + help='The path to output RST file', + type=Path + ) + parser.add_argument( + '--spreadsheet-file', + help='The path to input spreadsheet file', + type=Path + ) + parser.add_argument( + '--google-spreadsheet-id', + help='Google Spreadsheet ID of the document to process', + action='store_true' + ) + + args = parser.parse_args(argv[1:]) + + input_file = None + if args.spreadsheet_file: + input_file = args.spreadsheet_file + if args.google_spreadsheet_id: + input_file = f'https://docs.google.com/spreadsheets/d/{args.google_spreadsheet_id}/export?format=ods' # noqa: E501 + + if input_file is None: + print('Input file is not provided') + return errno.ENOENT + + news_articles = parse_entries(input_file, 'News Articles') + talk_series = parse_entries(input_file, 'Talk Series') + conferences = parse_entries(input_file, 'Conferences') + linkedin = parse_entries(input_file, 'LinkedIn Posts') + courses = parse_entries(input_file, 'Courses') + + with resources.path(templates, 'resources.template.rst') as resourcepath: + with open(resourcepath, 'r') as resourcetemplate: + resources_rst_template = resourcetemplate.read() + + tm = Template(resources_rst_template) + resources_rst_content = tm.render( + news_articles=news_articles, + talk_series=talk_series, + conferences=conferences, + linkedin=linkedin, + courses=courses + ) + + with open(args.output, 'w') as out: + out.write(resources_rst_content) + + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/scripts/python-skywater-pdk/skywater_pdk/templates/__init__.py b/scripts/python-skywater-pdk/skywater_pdk/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/python-skywater-pdk/skywater_pdk/templates/resources.template.rst b/scripts/python-skywater-pdk/skywater_pdk/templates/resources.template.rst new file mode 100644 index 0000000..2fffe89 --- /dev/null +++ b/scripts/python-skywater-pdk/skywater_pdk/templates/resources.template.rst @@ -0,0 +1,98 @@ +Further Resources +================= + + +News Articles +------------- + +{% for _, row in news_articles.iterrows() -%} +* `{{ row["Article"] }} <{{ row["Link"] }}>`__ +{% endfor %} + +Conferences +----------- +{% for _, row in conferences.iterrows() -%} + +{% if row["Conference"] %} +{{ row["Conference"] }} +{{ '~' * row["Conference"]|length }} + +{% endif -%} +{% if row["Description"] -%} +{{ row["Description"] }} + +{% endif -%} +{% if row["Related link"] -%} +* `{{ row["Related link"] }} <{{ row["Related link"] }}>`__ +{% endif -%} +{% endfor %} + +Talk Series +----------- +{% for _, row in talk_series.iterrows() -%} +{% if row["Talk series"] %} +{{ row["Talk series"] }} +{{ '~' * row["Talk series"]|length }} +{% if row["Description"] %} +{{ row["Description"] }} +{% endif -%} +{% if row["Page"] %} +**Page**: {{ row["Page"] }} +{% endif -%} +{% endif %} +{{ row["Title"] }} +{{ '^' * row["Title"]|length }} + +{% if row["Presenter"] -%} +**Presenter**: {{ row["Presenter"] }} +{% endif -%} +{% if row["Talk details"] -%} +**Details**: {{ row["Talk details"] }} +{% endif -%} +{% if row["Video link"] -%} +{% if row["Video"] -%} +**Video**: `{{ row["Video"] }} <{{ row["Video link"] }}>`__ +{% else -%} +**Video**: `{{ row["Video link"] }} <{{ row["Video link"] }}>`__ +{% endif -%} +{% endif -%} +{% if row["Slides PPTX link"] -%} +{% if row["Slides PPTX"] -%} +**Video**: `{{ row["Slides PPTX"] }} <{{ row["Slides PPTX link"] }}>`__ +{% else -%} +**Video**: `{{ row["Slides PPTX link"] }} <{{ row["Slides PPTX link"] }}>`__ +{% endif -%} +{% endif -%} +{% if row["Slides PDF link"] -%} +{% if row["Slides PDF"] -%} +**Video**: `{{ row["Slides PDF"] }} <{{ row["Slides PDF link"] }}>`__ +{% else -%} +**Video**: `{{ row["Slides PDF link"] }} <{{ row["Slides PDF link"] }}>`__ +{% endif -%} +{% endif -%} +{% endfor %} + +LinkedIn Posts +-------------- + +{% for _, row in linkedin.iterrows() -%} +* `{{ row["Title"] }} <{{ row["Link"] }}>`__ +{% endfor %} + +Courses +------- + +{% for _, row in courses.iterrows() -%} +{% if row["Courses"] %} +{{ row["Courses"] }} +{{ '~' * row["Courses"]|length }} +{% endif -%} +{% if row["Link"] -%} +{% if row["Link title"] -%} +* `{{ row["Link title"] }} <{{ row["Link"] }}>`__ +{% else -%} +* `{{ row["Link"] }} <{{ row["Link"] }}>`__ +{% endif -%} +{% endif -%} +{% endfor %} +