From fe8bfb63a14612e880a149d82d712c654a5f3903 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Mon, 23 Nov 2020 22:11:43 +0100 Subject: [PATCH 01/13] docs: generate-resources: Added initial resources generator from spreadsheet Signed-off-by: Grzegorz Latosinski --- .../skywater_pdk/generate-resources-rst.py | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py 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 000000000..7a5184dd9 --- /dev/null +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -0,0 +1,156 @@ +#!/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 os +import sys +import pickle +import argparse +from pathlib import Path +from googleapiclient.discovery import build +from google_auth_oauthlib.flow import InstalledAppFlow +from google.auth.transport.requests import Request +import pandas as pd + +SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] + +SAMPLE_SPREADSHEET_ID = '1tOU0N0qMeDFjTz9NrGz_-PBikgu2x2gDHezy2SlE9dA' + + +def parse_news_articles(sheet): + DATA = 'News Articles!B2:D' + result = sheet.values().get( + spreadsheetId=SAMPLE_SPREADSHEET_ID, + range=DATA).execute() + values = result.get('values', []) + return pd.DataFrame.from_records(values[1:], columns=values[0]) + + +def parse_talk_series(sheet): + DATA = 'Talk Series!B2:M' + result = sheet.values().get( + spreadsheetId=SAMPLE_SPREADSHEET_ID, + range=DATA).execute() + values = result.get('values', []) + return pd.DataFrame.from_records(values[1:], columns=values[0]) + + +def parse_conferences(sheet): + DATA = 'Conferences!B2:D' + result = sheet.values().get( + spreadsheetId=SAMPLE_SPREADSHEET_ID, + range=DATA).execute() + values = result.get('values', []) + return pd.DataFrame.from_records(values[1:], columns=values[0]) + + +def main(argv): + parser = argparse.ArgumentParser(prog=argv[0]) + parser.add_argument( + 'output', + help='The path to output RST file', + type=Path + ) + + args = parser.parse_args(argv[1:]) + + creds = None + if os.path.exists('token.pickle'): + with open('token.pickle', 'rb') as token: + creds = pickle.load(token) + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file( + 'credentials.json', + SCOPES + ) + creds = flow.run_local_server(port=0) + with open('token.pickle', 'wb') as token: + pickle.dump(creds, token) + + service = build('sheets', 'v4', credentials=creds) + + sheet = service.spreadsheets() + + news_articles = parse_news_articles(sheet) + talk_series = parse_talk_series(sheet) + conferences = parse_conferences(sheet) + + with open(args.output, 'w') as out: + out.write('Further Resources\n') + out.write('=================\n') + out.write('\n') + out.write('News Articles\n') + out.write('-------------\n') + out.write('\n') + for _, row in news_articles.iterrows(): + out.write(f'* `{row["Article"]} <{row["Link"]}>`__\n') + out.write('\n') + out.write('Conferences\n') + out.write('-----------\n') + out.write('\n') + for _, row in conferences.iterrows(): + if row["Conference"]: + out.write('\n') + out.write(f'{row["Conference"]}\n') + out.write('~' * len(row["Conference"]) + '\n') + out.write('\n') + if row["Description"]: + out.write(f'{row["Description"]}\n') + out.write('\n') + if row["Related link"]: + out.write(f'* `{row["Related link"]} <{row["Related link"]}>`__\n') + out.write('\n') + out.write('Talk Series\n') + out.write('-----------\n') + out.write('\n') + for _, entry in talk_series.iterrows(): + if entry["Talk series"]: + out.write('\n') + out.write(f'{entry["Talk series"]}\n') + out.write('~' * len(entry[0]) + '\n') + out.write('\n') + if entry["Description"]: + out.write(f'{entry["Description"]}') + out.write('\n') + if entry["Page"]: + out.write(f'\n**Page**: {entry["Page"]}\n') + out.write(f'\n{entry["Title"]}\n') + out.write('^' * len(entry["Title"]) + '\n') + out.write('\n') + if entry["Presenter"]: + out.write(f'**Presenter**: {entry["Presenter"]}\n\n') + if entry["Talk details"]: + out.write(f'**Description**: {entry["Talk details"]}\n\n') + if entry["Video link"]: + linkname = entry["Video"] if entry["Video"] else entry["Video link"] + out.write(f'**Video**: `{linkname} `__\n\n') + if entry["Slides PPTX link"]: + linkname = entry["Slides PPTX"] if entry["Slides PPTX"] else entry["Slides PPTX link"] + out.write(f'**Slides**: `{linkname} `__\n\n') + if entry["Slides PDF link"]: + linkname = entry["Slides PDF"] if entry["Slides PDF"] else entry["Slides PDF link"] + out.write(f'**Slides (PDF)**: `{linkname} `__\n\n') + out.write('\n') + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) From 79268a59827239e9c832b94a186ef022fb470d21 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 11:04:15 +0100 Subject: [PATCH 02/13] docs: generate-resources: Changed using Spreadsheet API to using exported spreadsheets Signed-off-by: Grzegorz Latosinski --- .../skywater_pdk/generate-resources-rst.py | 121 +++++++++--------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py index 7a5184dd9..db9e72418 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -17,81 +17,71 @@ # # SPDX-License-Identifier: Apache-2.0 -import os import sys -import pickle import argparse from pathlib import Path -from googleapiclient.discovery import build -from google_auth_oauthlib.flow import InstalledAppFlow -from google.auth.transport.requests import Request import pandas as pd -SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] -SAMPLE_SPREADSHEET_ID = '1tOU0N0qMeDFjTz9NrGz_-PBikgu2x2gDHezy2SlE9dA' - - -def parse_news_articles(sheet): - DATA = 'News Articles!B2:D' - result = sheet.values().get( - spreadsheetId=SAMPLE_SPREADSHEET_ID, - range=DATA).execute() - values = result.get('values', []) - return pd.DataFrame.from_records(values[1:], columns=values[0]) +def parse_news_articles(filepath): + values = pd.read_excel( + filepath, + sheet_name='News Articles', + header=1, + usecols='B:D' + ) + values = values.where(values.notnull(), None) + return values -def parse_talk_series(sheet): - DATA = 'Talk Series!B2:M' - result = sheet.values().get( - spreadsheetId=SAMPLE_SPREADSHEET_ID, - range=DATA).execute() - values = result.get('values', []) - return pd.DataFrame.from_records(values[1:], columns=values[0]) +def parse_talk_series(filepath): + values = pd.read_excel( + filepath, + sheet_name='Talk Series', + header=1, + usecols='B:M' + ) + values = values.where(values.notnull(), None) + return values -def parse_conferences(sheet): - DATA = 'Conferences!B2:D' - result = sheet.values().get( - spreadsheetId=SAMPLE_SPREADSHEET_ID, - range=DATA).execute() - values = result.get('values', []) - return pd.DataFrame.from_records(values[1:], columns=values[0]) +def parse_conferences(filepath): + values = pd.read_excel( + filepath, + sheet_name='Conferences', + header=1, + usecols='B:D' + ) + values = values.where(values.notnull(), None) + return values def main(argv): parser = argparse.ArgumentParser(prog=argv[0]) + parser.add_argument( + 'input_xlsx', + help='The path to input XLSX file or GID to Google Spreadsheet', + type=Path + ) parser.add_argument( 'output', help='The path to output RST file', type=Path ) + parser.add_argument( + '--input-is-spreadsheet-id', + help='The input_xlsx argument holds public Google Spreadsheet ID', + action='store_true' + ) args = parser.parse_args(argv[1:]) - creds = None - if os.path.exists('token.pickle'): - with open('token.pickle', 'rb') as token: - creds = pickle.load(token) - if not creds or not creds.valid: - if creds and creds.expired and creds.refresh_token: - creds.refresh(Request()) - else: - flow = InstalledAppFlow.from_client_secrets_file( - 'credentials.json', - SCOPES - ) - creds = flow.run_local_server(port=0) - with open('token.pickle', 'wb') as token: - pickle.dump(creds, token) - - service = build('sheets', 'v4', credentials=creds) - - sheet = service.spreadsheets() + if args.input_is_spreadsheet_id: + args.input_xlsx = f'https://docs.google.com/spreadsheets/d/{args.input_xlsx}/export?format=xlsx' # noqa: E501 - news_articles = parse_news_articles(sheet) - talk_series = parse_talk_series(sheet) - conferences = parse_conferences(sheet) + news_articles = parse_news_articles(args.input_xlsx) + talk_series = parse_talk_series(args.input_xlsx) + conferences = parse_conferences(args.input_xlsx) with open(args.output, 'w') as out: out.write('Further Resources\n') @@ -116,7 +106,9 @@ def main(argv): out.write(f'{row["Description"]}\n') out.write('\n') if row["Related link"]: - out.write(f'* `{row["Related link"]} <{row["Related link"]}>`__\n') + out.write( + f'* `{row["Related link"]} <{row["Related link"]}>`__\n' + ) out.write('\n') out.write('Talk Series\n') out.write('-----------\n') @@ -140,14 +132,25 @@ def main(argv): if entry["Talk details"]: out.write(f'**Description**: {entry["Talk details"]}\n\n') if entry["Video link"]: - linkname = entry["Video"] if entry["Video"] else entry["Video link"] - out.write(f'**Video**: `{linkname} `__\n\n') + linkname = (entry["Video"] if entry["Video"] + else entry["Video link"]) + out.write( + f'**Video**: `{linkname} <{entry["Video link"]}>`__\n\n' + ) if entry["Slides PPTX link"]: - linkname = entry["Slides PPTX"] if entry["Slides PPTX"] else entry["Slides PPTX link"] - out.write(f'**Slides**: `{linkname} `__\n\n') + linkname = (entry["Slides PPTX"] if entry["Slides PPTX"] + else entry["Slides PPTX link"]) + out.write( + '**Slides**: ' + + f'`{linkname} <{entry["Slides PPTX link"]}>`__\n\n' + ) if entry["Slides PDF link"]: - linkname = entry["Slides PDF"] if entry["Slides PDF"] else entry["Slides PDF link"] - out.write(f'**Slides (PDF)**: `{linkname} `__\n\n') + linkname = (entry["Slides PDF"] if entry["Slides PDF"] + else entry["Slides PDF link"]) + out.write( + '**Slides (PDF)**: ' + + f'`{linkname} <{entry["Slides PDF link"]}>`__\n\n' + ) out.write('\n') return 0 From a42352270ff34c984a64cd5ce8af8d4e632922c5 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 12:02:11 +0100 Subject: [PATCH 03/13] docs: generate-resources: Simplified calls to spreadsheet Signed-off-by: Grzegorz Latosinski --- .../skywater_pdk/generate-resources-rst.py | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py index db9e72418..99005290e 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -23,34 +23,12 @@ import pandas as pd -def parse_news_articles(filepath): +def parse_entries(filepath, sheet_name, cols): values = pd.read_excel( filepath, - sheet_name='News Articles', + sheet_name=sheet_name, header=1, - usecols='B:D' - ) - values = values.where(values.notnull(), None) - return values - - -def parse_talk_series(filepath): - values = pd.read_excel( - filepath, - sheet_name='Talk Series', - header=1, - usecols='B:M' - ) - values = values.where(values.notnull(), None) - return values - - -def parse_conferences(filepath): - values = pd.read_excel( - filepath, - sheet_name='Conferences', - header=1, - usecols='B:D' + usecols=cols ) values = values.where(values.notnull(), None) return values @@ -79,9 +57,11 @@ def main(argv): if args.input_is_spreadsheet_id: args.input_xlsx = f'https://docs.google.com/spreadsheets/d/{args.input_xlsx}/export?format=xlsx' # noqa: E501 - news_articles = parse_news_articles(args.input_xlsx) - talk_series = parse_talk_series(args.input_xlsx) - conferences = parse_conferences(args.input_xlsx) + news_articles = parse_entries(args.input_xlsx, 'News Articles', 'B:D') + talk_series = parse_entries(args.input_xlsx, 'Talk Series', 'B:M') + conferences = parse_entries(args.input_xlsx, 'Conferences', 'B:D') + linkedin = parse_entries(args.input_xlsx, 'LinkedIn Posts', 'B:C') + courses = parse_entries(args.input_xlsx, 'Courses', 'B:D') with open(args.output, 'w') as out: out.write('Further Resources\n') From 0f7c7f420023e65c0fe2f506823ac47271294155 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 12:03:15 +0100 Subject: [PATCH 04/13] docs: generate-resources: Added parsing courses and LinkedIn links Signed-off-by: Grzegorz Latosinski --- .../skywater_pdk/generate-resources-rst.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py index 99005290e..73bde06a5 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -132,6 +132,27 @@ def main(argv): f'`{linkname} <{entry["Slides PDF link"]}>`__\n\n' ) out.write('\n') + out.write('LinkedIn Posts\n') + out.write('--------------\n') + out.write('\n') + for _, row in linkedin.iterrows(): + out.write(f'* `{row["Title"]} <{row["Link"]}>`__\n') + out.write('\n') + out.write('Courses\n') + out.write('-------\n') + out.write('\n') + for _, row in courses.iterrows(): + if row["Course"]: + out.write('\n') + out.write(f'{row["Course"]}\n') + out.write('~' * len(row["Course"]) + '\n') + out.write('\n') + if row["Link"]: + title = row['Link title'] if row['Link title'] else row['Link'] + out.write( + f'* `{title} <{row["Link"]}>`__\n' + ) + out.write('\n') return 0 From 1df201a9e7a82f6c86c4c6625344996382ddc29f Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 12:15:30 +0100 Subject: [PATCH 05/13] docs: generate-resources: Added pandas to requirements.txt Signed-off-by: Grzegorz Latosinski --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index fe8a2c1b2..4f70ffc87 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ flake8 # rst_include tool as GitHub doesn't support `.. include::` when rendering # previews. rst_include +pandas # The Python API for the SkyWater PDK. -e scripts/python-skywater-pdk From 8b9ca965d4d84b42c46a5b391fc7e1fa3d70d50f Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 18:42:53 +0100 Subject: [PATCH 06/13] docs: generate-resources: added starting spreadsheet from A1, fixed arguments Signed-off-by: Grzegorz Latosinski --- .../skywater_pdk/generate-resources-rst.py | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py index 73bde06a5..dd421ab0a 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -21,13 +21,25 @@ import argparse from pathlib import Path import pandas as pd +import errno -def parse_entries(filepath, sheet_name, cols): +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=1, + header=0, usecols=cols ) values = values.where(values.notnull(), None) @@ -37,31 +49,38 @@ def parse_entries(filepath, sheet_name, cols): def main(argv): parser = argparse.ArgumentParser(prog=argv[0]) parser.add_argument( - 'input_xlsx', - help='The path to input XLSX file or GID to Google Spreadsheet', + 'output', + help='The path to output RST file', type=Path ) parser.add_argument( - 'output', - help='The path to output RST file', + '--spreadsheet-file', + help='The path to input spreadsheet file', type=Path ) parser.add_argument( - '--input-is-spreadsheet-id', - help='The input_xlsx argument holds public Google Spreadsheet ID', + '--google-spreadsheet-id', + help='Google Spreadsheet ID of the document to process', action='store_true' ) args = parser.parse_args(argv[1:]) - if args.input_is_spreadsheet_id: - args.input_xlsx = f'https://docs.google.com/spreadsheets/d/{args.input_xlsx}/export?format=xlsx' # noqa: E501 + 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(args.input_xlsx, 'News Articles', 'B:D') - talk_series = parse_entries(args.input_xlsx, 'Talk Series', 'B:M') - conferences = parse_entries(args.input_xlsx, 'Conferences', 'B:D') - linkedin = parse_entries(args.input_xlsx, 'LinkedIn Posts', 'B:C') - courses = parse_entries(args.input_xlsx, 'Courses', 'B:D') + 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 open(args.output, 'w') as out: out.write('Further Resources\n') From 42034ef2ee934028a421b530d70a6c9e9b456573 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 18:43:38 +0100 Subject: [PATCH 07/13] docs: generate-resources: added sample generated resources.rst Signed-off-by: Grzegorz Latosinski --- docs/index.rst | 1 + docs/resources.rst | 137 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 docs/resources.rst diff --git a/docs/index.rst b/docs/index.rst index 828ea9b79..a6c9fe95f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,6 +22,7 @@ glossary contributing + resources partners diff --git a/docs/resources.rst b/docs/resources.rst new file mode 100644 index 000000000..b6fa93b7b --- /dev/null +++ b/docs/resources.rst @@ -0,0 +1,137 @@ +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 + +**Description**: 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 `__ + +**Slides**: `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 `__ + +**Slides**: `The striVe RISC-V SoC Family on Skywater 130nm (PPTX) `__ + +**Slides (PDF)**: `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 `__ + +**Slides (PDF)**: `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 `__ + +**Slides (PDF)**: `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 `__ + +**Slides (PDF)**: `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 +------- + + +UC Berkeley - OpenLANE Lab - CS 250 Fall 2020 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* `VLSI Systems Design course main page `__ +* `Lab - Intro to OpenLane and Skywater 130 `__ + From 084b0c2a5aea0deec77653b470a354e950b16c5b Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 24 Nov 2020 18:44:39 +0100 Subject: [PATCH 08/13] docs: generate-resources: added odfpy for parsing ODS files Signed-off-by: Grzegorz Latosinski --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 4f70ffc87..619bc7a71 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ flake8 # previews. rst_include pandas +odfpy # The Python API for the SkyWater PDK. -e scripts/python-skywater-pdk From c5371b8074e4b5c66eaad9d5568d0c5ba3f1e1be Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Wed, 25 Nov 2020 22:38:08 +0100 Subject: [PATCH 09/13] generate-resources: used Jinja template to form resources.rst Signed-off-by: Grzegorz Latosinski --- requirements.txt | 1 + .../skywater_pdk/generate-resources-rst.py | 201 ++++++++++-------- 2 files changed, 113 insertions(+), 89 deletions(-) diff --git a/requirements.txt b/requirements.txt index 619bc7a71..0426205fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ flake8 rst_include pandas odfpy +Jinja2 # The Python API for the SkyWater PDK. -e scripts/python-skywater-pdk diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py index dd421ab0a..9c1e7e84f 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -22,6 +22,107 @@ from pathlib import Path import pandas as pd import errno +from jinja2 import Template + + +resources_rst_template = """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 %} +""" def parse_entries(filepath, sheet_name, cols=None): @@ -82,96 +183,18 @@ def main(argv): linkedin = parse_entries(input_file, 'LinkedIn Posts') courses = parse_entries(input_file, 'Courses') + 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('Further Resources\n') - out.write('=================\n') - out.write('\n') - out.write('News Articles\n') - out.write('-------------\n') - out.write('\n') - for _, row in news_articles.iterrows(): - out.write(f'* `{row["Article"]} <{row["Link"]}>`__\n') - out.write('\n') - out.write('Conferences\n') - out.write('-----------\n') - out.write('\n') - for _, row in conferences.iterrows(): - if row["Conference"]: - out.write('\n') - out.write(f'{row["Conference"]}\n') - out.write('~' * len(row["Conference"]) + '\n') - out.write('\n') - if row["Description"]: - out.write(f'{row["Description"]}\n') - out.write('\n') - if row["Related link"]: - out.write( - f'* `{row["Related link"]} <{row["Related link"]}>`__\n' - ) - out.write('\n') - out.write('Talk Series\n') - out.write('-----------\n') - out.write('\n') - for _, entry in talk_series.iterrows(): - if entry["Talk series"]: - out.write('\n') - out.write(f'{entry["Talk series"]}\n') - out.write('~' * len(entry[0]) + '\n') - out.write('\n') - if entry["Description"]: - out.write(f'{entry["Description"]}') - out.write('\n') - if entry["Page"]: - out.write(f'\n**Page**: {entry["Page"]}\n') - out.write(f'\n{entry["Title"]}\n') - out.write('^' * len(entry["Title"]) + '\n') - out.write('\n') - if entry["Presenter"]: - out.write(f'**Presenter**: {entry["Presenter"]}\n\n') - if entry["Talk details"]: - out.write(f'**Description**: {entry["Talk details"]}\n\n') - if entry["Video link"]: - linkname = (entry["Video"] if entry["Video"] - else entry["Video link"]) - out.write( - f'**Video**: `{linkname} <{entry["Video link"]}>`__\n\n' - ) - if entry["Slides PPTX link"]: - linkname = (entry["Slides PPTX"] if entry["Slides PPTX"] - else entry["Slides PPTX link"]) - out.write( - '**Slides**: ' + - f'`{linkname} <{entry["Slides PPTX link"]}>`__\n\n' - ) - if entry["Slides PDF link"]: - linkname = (entry["Slides PDF"] if entry["Slides PDF"] - else entry["Slides PDF link"]) - out.write( - '**Slides (PDF)**: ' + - f'`{linkname} <{entry["Slides PDF link"]}>`__\n\n' - ) - out.write('\n') - out.write('LinkedIn Posts\n') - out.write('--------------\n') - out.write('\n') - for _, row in linkedin.iterrows(): - out.write(f'* `{row["Title"]} <{row["Link"]}>`__\n') - out.write('\n') - out.write('Courses\n') - out.write('-------\n') - out.write('\n') - for _, row in courses.iterrows(): - if row["Course"]: - out.write('\n') - out.write(f'{row["Course"]}\n') - out.write('~' * len(row["Course"]) + '\n') - out.write('\n') - if row["Link"]: - title = row['Link title'] if row['Link title'] else row['Link'] - out.write( - f'* `{title} <{row["Link"]}>`__\n' - ) - out.write('\n') + out.write(resources_rst_content) + return 0 From 5a151a7f76559205432d98a7188f81f46aa717b0 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Wed, 25 Nov 2020 22:38:35 +0100 Subject: [PATCH 10/13] generate-resources: updated resources.rst Signed-off-by: Grzegorz Latosinski --- docs/resources.rst | 51 +++++++++++----------------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/docs/resources.rst b/docs/resources.rst index b6fa93b7b..bcf11a21d 100644 --- a/docs/resources.rst +++ b/docs/resources.rst @@ -1,6 +1,7 @@ Further Resources ================= + News Articles ------------- @@ -11,15 +12,15 @@ News Articles * `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 @@ -36,10 +37,10 @@ VLSI SoC Conference 2020 * `https://ef.link/KLO5s `__ + Talk Series ----------- - FOSSi Foundation Dialup Talk Series ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,70 +52,46 @@ Fully open source manufacturable PDK for a 130nm process ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Presenter**: Tim Ansell - -**Description**: Google Kick-off Presentation of Open Source Foundry - +**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 `__ - -**Slides**: `Open Source manufacturable PDK for Skywater 130nm process node (Google slides) `__ - - +**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 `__ - -**Slides**: `The striVe RISC-V SoC Family on Skywater 130nm (PPTX) `__ - -**Slides (PDF)**: `The striVe RISC-V SoC Family on Skywater 130nm (PDF) `__ - - +**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 `__ - -**Slides (PDF)**: `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 `__ - -**Slides (PDF)**: `Engineering System on Chip (SoC) Flows for SkyWater 130nm Open PDK `__ - - +**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 `__ - -**Slides (PDF)**: `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 `__ @@ -125,13 +102,9 @@ LinkedIn Posts * `Mike Wishart `__ * `Efabless Corporation `__ + Courses ------- - -UC Berkeley - OpenLANE Lab - CS 250 Fall 2020 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * `VLSI Systems Design course main page `__ * `Lab - Intro to OpenLane and Skywater 130 `__ - From c4ed34efb0737409fd6d0db09db8a543d82f0131 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 1 Dec 2020 11:43:42 +0100 Subject: [PATCH 11/13] generate-resources: moved the RST template to a separate file Signed-off-by: Grzegorz Latosinski --- docs/resources.rst | 3 +- scripts/python-skywater-pdk/setup.py | 4 + .../skywater_pdk/generate-resources-rst.py | 128 +++--------------- .../skywater_pdk/templates/__init__.py | 0 .../templates/resources.template.rst | 98 ++++++++++++++ 5 files changed, 123 insertions(+), 110 deletions(-) create mode 100644 scripts/python-skywater-pdk/skywater_pdk/templates/__init__.py create mode 100644 scripts/python-skywater-pdk/skywater_pdk/templates/resources.template.rst diff --git a/docs/resources.rst b/docs/resources.rst index bcf11a21d..934195180 100644 --- a/docs/resources.rst +++ b/docs/resources.rst @@ -20,7 +20,7 @@ ICCAD 2020 ~~~~~~~~~~ **Conference Dates:** 2nd November 2020 to 5th November 2020 - + * `https://iccad.com/event_details?id=305-8-D `__ WOSET 2020 @@ -108,3 +108,4 @@ Courses * `VLSI Systems Design course main page `__ * `Lab - Intro to OpenLane and Skywater 130 `__ + diff --git a/scripts/python-skywater-pdk/setup.py b/scripts/python-skywater-pdk/setup.py index 7b7029efd..fed4c3bc8 100644 --- a/scripts/python-skywater-pdk/setup.py +++ b/scripts/python-skywater-pdk/setup.py @@ -70,4 +70,8 @@ '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 index 9c1e7e84f..2a34cfc4a 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py @@ -18,111 +18,17 @@ # 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__ + '../')) -resources_rst_template = """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 %} -""" +from skywater_pdk import templates def parse_entries(filepath, sheet_name, cols=None): @@ -183,17 +89,21 @@ def main(argv): linkedin = parse_entries(input_file, 'LinkedIn Posts') courses = parse_entries(input_file, 'Courses') - 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) + 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 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 000000000..e69de29bb 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 000000000..2fffe8985 --- /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 %} + From 5d374bcf17e47f47527772d1a48ac49e489c6d51 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 1 Dec 2020 11:46:56 +0100 Subject: [PATCH 12/13] generate-resources: renamed generate-resources-rst.py to generate_resources_rst.py Signed-off-by: Grzegorz Latosinski --- .../{generate-resources-rst.py => generate_resources_rst.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/python-skywater-pdk/skywater_pdk/{generate-resources-rst.py => generate_resources_rst.py} (100%) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py similarity index 100% rename from scripts/python-skywater-pdk/skywater_pdk/generate-resources-rst.py rename to scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py From 064b239319f5903d255393cd126cbe8a5c958f59 Mon Sep 17 00:00:00 2001 From: Grzegorz Latosinski Date: Tue, 1 Dec 2020 12:46:35 +0100 Subject: [PATCH 13/13] generate-resources: fixed path to skywater_pdk Signed-off-by: Grzegorz Latosinski --- .../python-skywater-pdk/skywater_pdk/generate_resources_rst.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py b/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py index 2a34cfc4a..bb17cdb20 100644 --- a/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py +++ b/scripts/python-skywater-pdk/skywater_pdk/generate_resources_rst.py @@ -26,7 +26,7 @@ from jinja2 import Template import importlib.resources as resources -sys.path.insert(0, os.path.abspath(__file__ + '../')) +sys.path.insert(0, os.path.abspath(__file__ + '/../../')) from skywater_pdk import templates