Merge main changes

This commit is contained in:
Mario Romero 2023-10-14 19:39:40 -03:00
commit 1a6904acc3
15 changed files with 1045 additions and 77 deletions

13
.gitattributes vendored
View File

@ -3,6 +3,17 @@
.png filter=lfs diff=lfs merge=lfs -text .png filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text *.png filter=lfs diff=lfs merge=lfs -text
*.sh text eol=lf *.sh text eol=lf
*.py text eol=lf
*.bat text eol=crlf *.bat text eol=crlf
<<<<<<< HEAD
*.desktop text eol=lf *.desktop text eol=lf
scripts/* text eol=lf scripts/* text eol=lf
=======
desktopinit text eol=lf
klayout text eol=lf
.bashrc text eol=lf
setwallpaper text eol=lf
startserver text eol=lf
*.desktop text eol=lf
xschemrc text eol=lf
>>>>>>> 9337a522bfce850a6848722c6ba4973ce31ea63b

View File

@ -312,4 +312,43 @@ jobs:
tags: git.1159.cl/mario1159/heavy-web tags: git.1159.cl/mario1159/heavy-web
platforms: linux/amd64 platforms: linux/amd64
context: . context: .
file: ./stacks/heavy.Dockerfile file: ./stacks/heavy.Dockerfile
build-chipathon-tools:
needs: build-heavy
runs-on: [ubuntu-latest, amd64]
container:
image: catthehacker/ubuntu:act-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Docker BuildX
uses: docker/setup-buildx-action@v2
- name: Authentication
uses: docker/login-action@v2
with:
registry: git.1159.cl
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build chipathon-tools desktop
uses: docker/build-push-action@v4
with:
push: true
build-args: BASE_IMG=git.1159.cl/mario1159/heavy-desktop
tags: git.1159.cl/mario1159/chipathon-tools-desktop
platforms: linux/amd64
context: .
file: ./stacks/chipathon-tools/Dockerfile
- name: Build chipathon-tools web
uses: docker/build-push-action@v4
with:
push: true
build-args: BASE_IMG=git.1159.cl/mario1159/heavy-web
tags: git.1159.cl/mario1159/chipathon-tools-web
platforms: linux/amd64
context: .
file: ./stacks/chipathon-tools/Dockerfile

View File

@ -50,9 +50,9 @@ These scripts automate the binding of graphics environment variables to the cont
Execute the next script in powershell and follow the container initialization prompt. Execute the next script in powershell and follow the container initialization prompt.
```pwsh ```pwsh
& ([scriptblock]::Create((irm https://git.1159.cl/Mario1159/osic-stacks/raw/branch/main/run.ps1))) -remote & ([scriptblock]::Create((irm https://git.1159.cl/Mario1159/osic-stacks/raw/branch/main/run.ps1))) -pull -download
``` ```
This script will run the container inside WSL and bind the enviroments variables for [WSLg](https://github.com/microsoft/wslg/blob/main/samples/container/Containers.md). This script will run the container inside WSL and bind the enviroments variables for [WSLg](https://github.com/microsoft/wslg/blob/main/samples/container/Containers.md). Also, it will download itself so it will exists locally.
##### Linux ##### Linux
Execute the next docker command in your terminal replacing `<container_name>` by any name and `<stack>` by an stack from the previous [stack list](#stacks). Execute the next docker command in your terminal replacing `<container_name>` by any name and `<stack>` by an stack from the previous [stack list](#stacks).

43
compile.bat Normal file
View File

@ -0,0 +1,43 @@
@echo off
setlocal
@REM SET BASE_IMG=git.1159.cl/mario1159/analog-xk-web:latest
SET BASE_IMG=git.1159.cl/mario1159/heavy-desktop:latest
SET RESULT_IMAGE=akilesalreadytaken/chipathon-tools:latest
SET CALL=call
:parse
IF /I ""%1""=="""" GOTO run
IF /I ""%1""==""--help"" GOTO documentation
IF /I ""%1""==""-h"" GOTO documentation
IF /I ""%1""==""--dry"" ( SET "CALL=echo" )
IF /I ""%1""==""-s"" ( SET "CALL=echo" )
IF /I ""%1""==""--path"" ( SET "DESIGNS=%~2" && SHIFT )
IF /I ""%1""==""-p"" ( SET "DESIGNS=%~2" && SHIFT )
SHIFT
GOTO parse
:documentation
echo Usage: run.bat %~nx0 [-h^|--help] [-s^|--dry-run]
GOTO end
:run
%CALL% docker build --build-arg BASE_IMG=%BASE_IMG% -t %RESULT_IMAGE% -f stacks/chipathon-tools/Dockerfile stacks/chipathon-tools/
GOTO end
:end
endlocal
:normalizepath
SET DESIGNS=%~f1
EXIT /B
:: Get DISPLAY from WSL
::wsl --exec bash --norc -c 'echo $DISPLAY'
:: Get current path of batsh script
::SET BATCH_PATH=%~dpnx0

166
run.bat Normal file
View File

@ -0,0 +1,166 @@
@echo off
setlocal
SET IMAGE=akilesalreadytaken/analog-xk:latest
SET IMAGE=akilesalreadytaken/chipathon-tools:latest
::SET IMAGE=git.1159.cl/mario1159/analog-xk-web:latest
SET CALL=call
:parse
IF /I ""%~1""=="""" GOTO run
IF /I ""%~1""==""--help"" GOTO documentation
IF /I ""%~1""==""-h"" GOTO documentation
IF /I ""%~1""==""--dry"" ( SET "CALL=echo" )
IF /I ""%~1""==""-s"" ( SET "CALL=echo" )
IF /I ""%~1""==""-v"" ( SET "ENABLE_VNC=" )
IF /I ""%~1""==""--vnc"" ( SET "ENABLE_VNC=" )
IF /I ""%~1""==""--path"" ( SET "DESIGNS=%~2" && SHIFT )
IF /I ""%~1""==""-p"" ( SET "DESIGNS=%~2" && SHIFT )
IF /I ""%~1""==""-k"" ( SET "PDK=%~2" && SHIFT )
IF /I ""%~1""==""--pdk"" ( SET "PDK=%~2" && SHIFT )
SHIFT
GOTO parse
:documentation
echo Usage: run.bat %~nx0 [ OPTIONS ]
echo.
echo -h --help Show usage information
echo -s --dry See the commands to be executed
echo -p --path PATH Link to a directory
echo -v --vnc Enable the vnc in port "https:\\localhost:8444"
echo If vnc is not working, execute:
echo ^$ xfce4-session --display=:1 ^&
echo -k --pdk PDK Set the PDK to be used: gf180mcuC ^| sky130A
echo By default: gf180mcuC
GOTO end
:run
:: Set fixed parameters
:::::::::::::::::::::::::::
IF NOT DEFINED DESIGNS SET DESIGNS=%CD%
CALL :NORMALIZEPATH %DESIGNS%
IF NOT DEFINED PDK SET PDK=gf180mcuC
IF NOT DEFINED DOCKER_USER SET DOCKER_USER=git.1159.cl/mario1159
IF NOT DEFINED DOCKER_IMAGE SET DOCKER_IMAGE=analog-xk
IF NOT DEFINED DOCKER_TAG SET DOCKER_TAG=latest
IF NOT DEFINED CONTAINER_USER SET CONTAINER_USER=1000
IF NOT DEFINED CONTAINER_GROUP SET CONTAINER_GROUP=1000
IF NOT DEFINED CONTAINER_NAME SET CONTAINER_NAME=chipathon-tools
IF NOT DEFINED JUPYTER_PORT SET JUPYTER_PORT=8888
IF NOT DEFINED VNC_PORT SET VNC_PORT=8444
:: Get parameters from wsl
::::::::::::::::::::::::::
SET WSL_GET_PARAMETER=wsl --exec bash --norc -c "echo $DISPLAY"
@REM SET WSL_GET_PARAMETER=wsl -d docker-desktop --exec ash -c "echo $DISPLAY"
FOR /F "USEBACKQ" %%i IN (`%WSL_GET_PARAMETER%`) DO ( SET "DISPLAY=%%i" )
SET WSL_GET_PARAMETER=wsl --exec bash --norc -c "echo $WAYLAND_DISPLAY"
@REM SET WSL_GET_PARAMETER=wsl -d docker-desktop --exec ash -c "echo $WAYLAND_DISPLAY"
FOR /F "USEBACKQ" %%i IN (`%WSL_GET_PARAMETER%`) DO ( SET "WAYLAND_DISPLAY=%%i" )
SET WSL_GET_PARAMETER=wsl --exec bash --norc -c "echo $XDG_RUNTIME_DIR"
@REM SET WSL_GET_PARAMETER=wsl -d docker-desktop --exec ash -c "echo $XDG_RUNTIME_DIR"
FOR /F "USEBACKQ" %%i IN (`%WSL_GET_PARAMETER%`) DO ( SET "XDG_RUNTIME_DIR=%%i" )
:: Validate parameters
::::::::::::::::::::::
IF %CONTAINER_USER% NEQ 0 IF %CONTAINER_USER% LSS 1000 (
echo WARNING: Selected User ID %CONTAINER_USER% is below 1000. This ID might interfere with User-IDs inside the container and cause undefined behaviour!
)
IF %CONTAINER_GROUP% NEQ 0 IF %CONTAINER_GROUP% LSS 1000 (
echo WARNING: Selected Group ID %CONTAINER_GROUP% is below 1000. This ID might interfere with Group-IDs inside the container and cause undefined behaviour!
)
:: Attach to existing container
:::::::::::::::::::::::::::::::
docker container inspect %CONTAINER_NAME% 2>&1 | find "Status" | find /i "running"
IF NOT ERRORLEVEL 1 (
ECHO Container %CONTAINER_NAME% is running!
ECHO Stop with "docker stop %CONTAINER_NAME%"
ECHO Remove with "docker rm %CONTAINER_NAME%" if required.
GOTO attach_shell
)
docker container inspect %CONTAINER_NAME% 2>&1 | find "Status" | find /i "exited"
IF NOT ERRORLEVEL 1 (
ECHO Container %CONTAINER_NAME% exists.
ECHO Restart with "docker start %CONTAINER_NAME%"
ECHO Or remove with "docker rm %CONTAINER_NAME%" if required.
GOTO restart_shell
)
:: Set environment, variables and run the container
:::::::::::::::::::::::::::::::::::::::::::::::::::
echo Check requirements
%CALL% wsl --install Ubuntu --no-launch
%CALL% wsl --update
echo Container does not exist, creating %CONTAINER_NAME% ...
SET PARAMS=-d
SET PARAMS=%PARAMS% --name %CONTAINER_NAME%
::SET PARAMS=%PARAMS% --user %CONTAINER_USER%:%CONTAINER_GROUP%
SET PARAMS=%PARAMS% --security-opt seccomp=unconfined
SET PARAMS=%PARAMS% -p %JUPYTER_PORT%:8888
SET PARAMS=%PARAMS% -p %VNC_PORT%:8444
SET PARAMS=%PARAMS% -v "%DESIGNS%":/home/designer/shared
SET PARAMS=%PARAMS% -v "\\wsl.localhost\Ubuntu\mnt\wslg":/tmp
SET PARAMS=%PARAMS% -v "\\wsl.localhost\Ubuntu\mnt\wslg\runtime-dir":%XDG_RUNTIME_DIR%
@REM SET PARAMS=%PARAMS% -v "\\wsl.localhost\docker-desktop\mnt\host\wslg":/tmp
@REM SET PARAMS=%PARAMS% -v "\\wsl.localhost\docker-desktop\mnt\host\wslg\runtime-dir":%XDG_RUNTIME_DIR%
SET PARAMS=%PARAMS% -e PDK=%PDK%
SET PARAMS=%PARAMS% -e DISPLAY=%DISPLAY%
SET PARAMS=%PARAMS% -e WAYLAND_DISPLAY=%WAYLAND_DISPLAY%
SET PARAMS=%PARAMS% -e XDG_RUNTIME_DIR=%XDG_RUNTIME_DIR%
@REM IF NOT DEFINED ENABLE_VNC (
@REM ) ELSE (
@REM )
IF NOT DEFINED IMAGE (
SET IMAGE=%DOCKER_USER%/%DOCKER_IMAGE%
IF DEFINED DOCKER_TAG SET IMAGE=%IMAGE%:%DOCKER_TAG%
)
@REM SET COMMAND=jupyter-lab --no-browser
@REM SET COMMAND=sleep infinity
%CALL% docker run %PARAMS% %IMAGE% %COMMAND%
GOTO attach_shell
:attach_shell
%CALL% docker exec -it %CONTAINER_NAME% bash
GOTO end
:restart_shell
%CALL% docker start %CONTAINER_NAME%
GOTO attach_shell
:end
endlocal
EXIT
:normalizepath
SET DESIGNS=%~f1
EXIT /B
:: Get DISPLAY from WSL
::wsl --exec bash --norc -c 'echo $DISPLAY'
:: Get current path of batsh script
::SET BATCH_PATH=%~dpnx0

283
run.ps1
View File

@ -1,89 +1,232 @@
param([switch] $remote = $false) param(
[switch] $pull = $false,
Write-Host "OSIC-Stacks Container Creation" -ForegroundColor Green [switch] $interactive = $false,
Write-Host "Checking requirements and WSL updates" -ForegroundColor DarkGray [switch] $silent = $false,
[switch] $attach = $false,
Write-Host "" [switch] $download = $false
wsl --install Ubuntu --no-launch
wsl --update
Write-Host ""
Write-Host "Please select an image index:"
$stacks_options = @(
'analog-xk'
'analog-xm'
'analog-heavy'
'digital-ator'
'digital-icarus'
'digital-heavy'
'heavy'
) )
for($i = 0; $i -lt $stacks_options.Length; $i++) { $global:STACK_OPTIONS = [ordered]@{
$stack_option = $stacks_options[$i] 1 = 'analog-xk'
Write-Host "[$($i+1)] - $stack_option" -ForegroundColor Cyan 2 = 'analog-xm'
3 = 'analog-heavy'
4 = 'digital-ator'
5 = 'digital-icarus'
6 = 'digital-heavy'
7 = 'heavy'
8 = "chipathon-tools"
} }
$stack_index = Read-Host -Prompt "Container image to initialize [1-$($stacks_options.Length)]" $global:SELECTED_STACK='chipathon-tools'
$selected_stack = $stacks_options[$stack_index-1] $global:CONTAINER_NAME=$global:SELECTED_STACK
$container_name = Read-Host -Prompt "Container instance name [default=$selected_stack]" $global:EXECMODE='desktop'
if (!$container_name) { $container_name = $selected_stack } $global:PDK="gf180mcuC"
$global:DIRECTORY=Get-Location | Foreach-Object { $_.Path }
$execmode = '' $global:PARAMS = ""
while(!$execmode) {
Write-Host "Please select an execution mode index" New-Alias Call Invoke-Expression
Write-Host '[1] - desktop' -ForegroundColor Cyan
Write-Host '[2] - web' -ForegroundColor Cyan function validate-environment() {
$response = Read-Host "Execution mode [1-2]" Write-Host "Checking requirements and WSL updates" -ForegroundColor DarkGray
if ($response -eq '1') {
$execmode = 'desktop' Write-Host ""
} elseif ($response -eq '2') { Call "wsl --install Ubuntu --no-launch"
$execmode = 'web' Call "wsl --update"
} else { Write-Host ""
Write-Host "Unexpected respose, please try again" -ForegroundColor Red }
function select-stack() {
Write-Host "Please select an stack index:"
$STACK_OPTIONS.GetEnumerator() | ForEach-Object {
Write-Host "[$($_.Key)] - $($_.Value)" -ForegroundColor Cyan
}
$response = Read-Host -Prompt "Container stack to initialize [1-$($STACK_OPTIONS.Count)]"
if ($response) {
$global:SELECTED_STACK = $STACK_OPTIONS[$response-1]
}
$response = Read-Host -Prompt "Container instance name [default=$global:CONTAINER_NAME]"
if ($response) {
$global:CONTAINER_NAME = $response
} }
} }
$additional_options = '' function select-execmode() {
if($remote) { Write-Host "Please select an execution mode index"
$image = "git.1159.cl/mario1159/$selected_stack-$execmode" Write-Host '[1] - desktop' -ForegroundColor Cyan
$additional_options = '--pull always ' Write-Host '[2] - web' -ForegroundColor Cyan
} else { $response = Read-Host "Execution mode [1-2] [default=$global:EXECMODE]"
$image = "$selected_stack-$execmode"
if ($response -eq '1') {
$global:EXECMODE = 'desktop'
} elseif ($response -eq '2') {
$global:EXECMODE = 'web'
} else {
Write-Host "Using default mode ($global:EXECMODE)"
}
} }
$response = Read-Host "Do you want to bind the container home directory into a windows directory? [N/y]" function bind-to-directory() {
$response = Read-Host "Do you want to bind the container home directory into a windows directory? [N/y]"
if ($response -eq 'y') { if ($response -eq 'y') {
$directory = Read-Host "Write the windows directory destination relative to WSL, for example `"/mnt/c/Users/Username/Desktop/ExampleFolder`"`n" $global:DIRECTORY = Read-Host "Write the windows directory destination , for example `"C:\Users\Username\Desktop\ExampleFolder`"`n"
$additionaloptions = -join($additionaloptions, "-v ${directory}:/home/designer/shared ") }
} }
$response = Read-Host -Prompt "Do you want to set additional arguments for the container instantiation? [N/y]" function set-aditional-parameters() {
$response = Read-Host -Prompt "Do you want to set additional arguments for the container instantiation? [N/y]"
if ($response -eq 'y') { if ($response -eq 'y') {
$response = Read-Host -Prompt "Write the additional arguments, for example -v <wsl_path>:<container_path>." $response = Read-Host -Prompt "Write the additional arguments, for example -v <wsl_path>:<container_path>."
$additionaloptions = -join($additionaloptions, $response) $global:PARAMS += " $response"
}
} }
Write-Host "" function force-pull() {
$response = Read-Host -Prompt "Do you want to pull latest image? [N/y] [default=N]"
$dockercommand = ("docker run -d " + if ($response -eq 'y') {
"--name $container_name " + $global:PARAMS += " --pull always"
"-v /tmp/.X11-unix:/tmp/.X11-unix " + }
"-v /mnt/wslg:/mnt/wsl " + }
"-e WAYLAND_DISPLAY=`$WAYLAND_DISPLAY " +
"-e DISPLAY=`$DISPLAY " +
"-e XDG_RUNTIME_DIR=/mnt/wslg " +
"$additional_options "+
$image)
wsl -d Ubuntu bash -ic $dockercommand function select-pdk() {
Write-Host "Please select a pdk"
Write-Host '[1] - gf180mcuC' -ForegroundColor Cyan
Write-Host '[2] - sky130A' -ForegroundColor Cyan
$response = Read-Host "Execution mode [1-2] [default=$global:PDK]"
if ($?) { if ($response -eq '1') {
Write-Host "Container created successfully!" -ForegroundColor Green $global:PDK = 'gf180mcuC'
Write-Host "Enter the container with `"docker exec -it $container_name bash`"" -ForegroundColor DarkGray } elseif ($response -eq '2') {
} else { $global:PDK = 'sky130A'
Write-Host "Container creation failed, see logs above" -ForegroundColor Red } else {
} Write-Host "Using default pdk ($global:PDK)"
}
}
function attach-shell () {
Call "docker exec -it $global:CONTAINER_NAME bash"
}
function path-conversion() {
$directory, $other = $args
$drive, $path = $directory.split(":")
echo "/mnt/$($drive.tolower())$($path.replace("\","/"))"
}
function get-value-from-wsl () {
$variable, $other = $args
return "$(wsl -d Ubuntu bash -c "echo `$$variable")"
}
function set-common-parameters () {
$global:IMAGE = "git.1159.cl/mario1159/$SELECTED_STACK-$EXECMODE"
if ($attach) {
$global:PARAMS += " -it --rm"
$global:COMMAND = "bash"
} else {
$global:PARAMS += " -d"
$global:COMMAND = ""
}
if ($pull) {
$global:PARAMS += " --pull always"
}
$global:PARAMS += " --name $global:CONTAINER_NAME"
$global:PARAMS += " --security-opt seccomp=unconfined"
# $global:PARAMS += " -p '8888:8888'"
# $global:PARAMS += " -p '8082:8082'"
$global:PARAMS += " -e PDK=$global:PDK"
$global:PARAMS += " -e DISPLAY=$(get-value-from-wsl "DISPLAY")"
$global:PARAMS += " -e WAYLAND_DISPLAY=$(get-value-from-wsl "WAYLAND_DISPLAY")"
$global:PARAMS += " -e XDG_RUNTIME_DIR=$(get-value-from-wsl "XDG_RUNTIME_DIR")"
}
function run-docker-wsl() {
$global:DIRECTORY = path-conversion $global:DIRECTORY
$global:PARAMS += " -v /tmp/.X11-unix:/tmp/.X11-unix"
$global:PARAMS += " -v /mnt/wslg:/mnt/wsl"
$global:PARAMS += " -v ${global:DIRECTORY}:/home/designer/shared "
Call "wsl -d Ubuntu bash --noprofile --norc -ic `"docker run $global:PARAMS $global:IMAGE $global:COMMAND`""
if ($?) {
Write-Host "Container created successfully!" -ForegroundColor Green
Write-Host "Enter the container with `"docker exec -it $global:CONTAINER_NAME bash`"" -ForegroundColor DarkGray
attach-shell
} else {
Write-Host "Container creation failed, see logs above" -ForegroundColor Red
}
}
function run-docker-win() {
$global:PARAMS += " -v '\\wsl.localhost\Ubuntu\mnt\wslg:/tmp'"
$global:PARAMS += " -v ${global:DIRECTORY}:/home/designer/shared"
#$global:PARAMS += " -v '\\wsl.localhost\Ubuntu\mnt\wslg\runtime-dir'%XDG_RUNTIME_DIR%"
Call "docker run $global:PARAMS $global:IMAGE $global:COMMAND"
if ($?) {
Write-Host "Container created successfully!" -ForegroundColor Green
Write-Host "Enter the container with `"docker exec -it $global:CONTAINER_NAME bash`"" -ForegroundColor DarkGray
attach-shell
} else {
Write-Host "Container creation failed, see logs above" -ForegroundColor Red
}
}
function download-run-bat () {
if (!$download) { return }
try {
$response = Call "Invoke-WebRequest -URI https://git.1159.cl/Mario1159/osic-stacks/src/branch/main/run.ps1"
} catch {
$StatusCode = $_.Exception.Response.StatusCode.value__
Write-Host "Error downloading file :( ($($StatusCode))" -ForegroundColor Red
return
}
Write-Host "run.bat updated successfully" -ForegroundColor Green
}
function run(){
if ($silent) {
Write-Host "[Silent Mode]" -ForegroundColor Yellow
Remove-Alias Call
New-Alias Call Write-Host
}
Write-Host "OSIC-Stacks Container Creation" -ForegroundColor Green
download-run-bat
validate-environment
if ($interactive) {
select-stack
select-execmode
bind-to-directory
set-aditional-parameters
force-pull
}
set-common-parameters
#run-docker-win
run-docker-wsl
}
run

155
run.sh Normal file
View File

@ -0,0 +1,155 @@
#!/bin/bash
set -e
# IMAGE=akilesalreadytaken/analog-xk:latest
IMAGE=akilesalreadytaken/chipathon-tools:latest
# IMAGE=git.1159.cl/mario1159/analog-xk-web:latest
CALL=
function parse () {
while getopts ":hsvp:k:" option; do
case $option in
h) documentation ;;
s) CALL="echo [CMD] " ;;
#v) ENABLE_VNC=1 ;; # VNC not working rigth now
p) DESIGNS=$OPTARG ;;
k) PDK=$OPTARG ;;
\?) echo "Error: Invalid option"; documentation ;;
esac
done
}
function documentation () {
echo "Usage: run.bat [ OPTIONS ]"
echo ""
echo " -h Show usage information"
echo " -s See the commands to be executed"
echo " -p PATH Link to a directory"
# echo " -v Enable the vnc in port "https:\\localhost:8444""
# echo " If vnc is not working, execute:"
# echo " $ xfce4-session --display=:1 &"
echo " -k PDK Set the PDK to be used (gf180mcuC | sky130A)"
echo " By default: gf180mcuC"
exit
}
function run () {
# Set fixed parameters
####################
[ -z "${DESIGNS+x}" ] && DESIGNS=$PWD
DESIGNS=$( realpath $DESIGNS )
[ -z "${PDK+x}" ] && PDK=gf180mcuC
[ -z "${DOCKER_USER+x}" ] && DOCKER_USER=git.1159.cl/mario1159
[ -z "${DOCKER_IMAGE+x}" ] && DOCKER_IMAGE=analog-xk
[ -z "${DOCKER_TAG+x}" ] && DOCKER_TAG=latest
[ -z "${CONTAINER_USER+x}" ] && CONTAINER_USER=$(id -u)
[ -z "${CONTAINER_GROUP+x}" ] && CONTAINER_GROUP=$(id -g)
[ -z "${CONTAINER_NAME+x}" ] && CONTAINER_NAME=chipathon-tools
[ -z "${JUPYTER_PORT+x}" ] && JUPYTER_PORT=8888
[ -z "${VNC_PORT+x}" ] && VNC_PORT=8444
# Validate parameters
#####################
if [[ ${CONTAINER_USER} -ne 0 ]] && [[ ${CONTAINER_USER} -lt 1000 ]]; then
prt_str="# [WARNING] Selected User ID ${CONTAINER_USER} is below 1000. This ID might interfere with User-IDs inside the container and cause undefined behavior! #"
printf -- '#%.0s' $(seq 1 ${#prt_str})
echo
echo "${prt_str}"
printf -- '#%.0s' $(seq 1 ${#prt_str})
echo
fi
if [[ ${CONTAINER_GROUP} -ne 0 ]] && [[ ${CONTAINER_GROUP} -lt 1000 ]]; then
prt_str="# [WARNING] Selected Group ID ${CONTAINER_GROUP} is below 1000. This ID might interfere with Group-IDs inside the container and cause undefined behavior! #"
printf -- '#%.0s' $(seq 1 ${#prt_str})
echo
echo "${prt_str}"
printf -- '#%.0s' $(seq 1 ${#prt_str})
echo
fi
# Check if the container exists and if it is running.
if [ "$(docker ps -q -f name="${CONTAINER_NAME}")" ]; then
echo "[WARNING] Container is running!"
echo "[HINT] It can also be stopped with \"docker stop ${CONTAINER_NAME}\" and removed with \"docker rm ${CONTAINER_NAME}\" if required."
echo
echo -n "Press \"s\" to stop, and \"r\" to stop & remove: "
read -r -n 1 k <&1
echo
if [[ $k = s ]] ; then
$CALL docker stop "${CONTAINER_NAME}"
elif [[ $k = r ]] ; then
$CALL docker stop "${CONTAINER_NAME}"
$CALL docker rm "${CONTAINER_NAME}"
fi
exit
fi
# If the container exists but is exited, it is restarted.
if [ "$(docker ps -aq -f name="${CONTAINER_NAME}")" ]; then
echo "[WARNING] Container ${CONTAINER_NAME} exists."
echo "[HINT] It can also be restarted with \"docker start ${CONTAINER_NAME}\" or removed with \"docker rm ${CONTAINER_NAME}\" if required."
echo
echo -n "Press \"s\" to start, and \"r\" to remove: "
read -r -n 1 k <&1
echo
if [[ $k = s ]] ; then
$CALL docker start "${CONTAINER_NAME}"
elif [[ $k = r ]] ; then
$CALL docker rm "${CONTAINER_NAME}"
fi
exit
fi
# Set environment, variables and run the container
##################################################
echo "[INFO] Container does not exist, creating ${CONTAINER_NAME} ..."
PARAMS="-d"
PARAMS="$PARAMS --name $CONTAINER_NAME"
PARAMS="$PARAMS -e PDK=$PDK"
PARAMS="$PARAMS --user ${CONTAINER_USER}:${CONTAINER_GROUP}"
PARAMS="$PARAMS --security-opt seccomp=unconfined"
PARAMS="$PARAMS -p $JUPYTER_PORT:8888"
PARAMS="$PARAMS -v $DESIGNS:/home/designer/shared"
PARAMS="$PARAMS -v /tmp/.X11-unix:/tmp/.X11-unix"
if [ -z "${ENABLE_VNC+x}" ]; then
PARAMS="$PARAMS -e DISPLAY=$DISPLAY"
PARAMS="$PARAMS -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY"
PARAMS="$PARAMS -e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR"
else
PARAMS="$PARAMS -p $VNC_PORT:8444"
# Should use WSL_DISTRO_NAME ?
PARAMS="$PARAMS -v /mnt/wslg:/mnt/wsl"
fi
if [ -z "${IMAGE+x}" ]; then
IMAGE=$DOCKER_USER/$DOCKER_IMAGE:$DOCKER_TAG
fi
echo "[INFO] Container based on $IMAGE"
$CALL docker run $PARAMS $IMAGE $COMMAND
attach_shell
}
function attach_shell () {
$CALL docker exec -it $CONTAINER_NAME bash
}
function restart_shell () {
$CALL docker start $CONTAINER_NAME
attach_shell
}
parse $@
run

View File

@ -12,9 +12,6 @@ RUN sudo aur-install \
klayout \ klayout \
netgen-lvs-git netgen-lvs-git
RUN pip install gdsfactory --break-system-packages
RUN pip install gf180 --upgrade --break-system-packages
# Clean cache # Clean cache
RUN sudo pacman -Scc RUN sudo pacman -Scc

View File

@ -0,0 +1,15 @@
ARG BASE_IMG=heavy-desktop
FROM $BASE_IMG as chipathon-tools
# Add scripts
COPY --chown=designer:designer --chmod=755 stacks/chipathon-tools/scripts/install-open-pdks.sh .
RUN ./install-open-pdks.sh
COPY --chown=designer:designer --chmod=755 stacks/chipathon-tools/scripts/* .
RUN ./patch-open-pdks-gf180.sh
RUN ./patch-open-pdks-sky130.sh
RUN rm *.sh
# Initialize the enviroment keeping container alive
CMD ["sleep", "infinity"]

View File

@ -0,0 +1,49 @@
[[ $- != *i* ]] && return
case "$PDK" in
gf180mcuC)
export PDKPATH=$PDK_ROOT/$PDK
export STD_CELL_LIBRARY=gf180mcu_fd_sc_mcu7t5v0
;;
sky130A)
export PDKPATH=$PDK_ROOT/$PDK
export STD_CELL_LIBRARY=sky130_fd_sc_hd
;;
*)
echo "PDK not defined, using default one (gf180mcuC)"
export PDK=gf180mcuC
export PDKPATH=$PDK_ROOT/$PDK
export STD_CELL_LIBRARY=gf180mcu_fd_sc_mcu7t5v0
;;
esac
function git_branch {
branch=$(git symbolic-ref --short HEAD 2>/dev/null)
if [ "$branch" != "" ]; then
echo "[$branch]"
fi
}
c_res='\[\033[00m\]' # Reset
c_bla='\[\033[01;30m\]' # Black
c_red='\[\033[01;31m\]' # Red
c_gre='\[\033[01;32m\]' # Green
c_yel='\[\033[01;33m\]' # Yellow
c_blu='\[\033[01;34m\]' # Blue
c_pur='\[\033[01;35m\]' # Purple
c_cya='\[\033[01;36m\]' # Cyan
c_whi='\[\033[01;37m\]' # White
# export PS1="${c_pur}\w $(git_branch)\n${c_res}\$ " ## This dont work :(
PS1="${c_pur}\w \n${c_res}\$ " ## This dont work :(
export KLAYOUT_HOME=$PDK_ROOT/$PDK/libs.tech/klayout
export DESIGNS="/home/designer/shared"
alias ls="ls --color=auto -XF"
alias grep="grep --color=auto"
alias xschem='xschem -b --rcfile $PDK_ROOT/$PDK/libs.tech/xschem/xschemrc'
alias xschemtcl='xschem --rcfile $PDK_ROOT/$PDK/libs.tech/xschem/xschemrc'
git config --global --add safe.directory $DESIGNS

View File

@ -0,0 +1,26 @@
set nocompatible
filetype plugin on
filetype indent on
syntax on
set number relativenumber
set autoindent expandtab tabstop=4 shiftwidth=4
set cursorline
set mouse=a
set showcmd
set showmatch
set lazyredraw
set ttyfast
set clipboard="unnamedplus"
set showmatch
set wildmenu
set backspace=indent,eol,start
let &t_SI="\e[6 q"
let &t_EI="\e[2 q"
let &t_ut=''

View File

@ -0,0 +1,133 @@
#!/usr/bin/env python3
# ========================================================================
# SPDX-FileCopyrightText: 2021-2022 Harald Pretl
# Johannes Kepler University, Institute for Integrated Circuits
#
# 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.
# SPDX-License-Identifier: Apache-2.0
#
# This script traverses SPICE model files (e.g. from SKY130) and
# extracts only the wanted model section, removes all comments and
# empty lines, and resolves all includes so that a flat model file
# results. This should speed up ngspice starts.
# ========================================================================
import sys,re,os
def process_file(file_in_name, top_file):
global is_warning
try:
f_in = open(file_in_name, 'r')
except FileNotFoundError:
print('Warning! File ' + file_in_name + ' not found.')
is_warning = True
return;
# process_file can be called recursively, so that nested include
# files can be traversed
# write_active indicates whether we are in the right model section; in
# include files, it is always true
if top_file == True:
write_active = False
else:
write_active = True
for line in f_in:
line_trim = (line.lower()).strip()
if top_file == True:
# we assume that .lib statements are only used in the main file
if '.lib' in line_trim:
if model_section in line_trim:
write_active = True
else:
write_active = False
if '.endl' == line_trim:
write_active = False
f_out.write(line)
if len(line_trim) > 0: # write no empty lines
if (line_trim[0] != '*'): # write no comments
if (write_active == True):
if '.include' in line_trim:
# need to save and restore working dir so that nested
# includes work
current_wd = os.getcwd()
newfile = re.findall(r'"(.*?)(?<!\\)"', line_trim)
print('Reading ',newfile[0])
# enter new working dir
new_wd = os.path.dirname(newfile[0])
if len(new_wd) > 0:
try:
os.chdir(new_wd)
except OSError:
print('Warning: Could not enter directory ' + new_wd)
is_warning = True
# traverse into new include file
new_file_name = os.path.basename(newfile[0])
process_file(new_file_name, False)
# restore old working dir after return
os.chdir(current_wd)
else:
f_out.write(line)
f_in.close()
return;
# main routine
if len(sys.argv) == 3:
model_section = sys.argv[2]
else:
model_section = 'tt'
if (len(sys.argv) == 2) or (len(sys.argv) == 3):
infile_name = sys.argv[1]
outfile_name = infile_name + '.' + model_section + '.red'
try:
f_out = open(outfile_name, 'w')
except OSError:
print('Error: Cannot write file ' + outfile_name + '.')
sys.exit(1)
is_warning = False
process_file(infile_name, True)
f_out.close()
print()
print('Model file ' + outfile_name + ' written.')
if is_warning == True:
print('There have been warnings! Please check output log.')
sys.exit(0)
else:
sys.exit(0)
else:
print()
print('iic-spice-model-red.py SPICE model file reducer')
print(' (c) 2021 Harald Pretl, JKU')
print()
print('Usage: iic-spice-model-red <inputfile> [corner] (default corner = tt)')
print()
print('Return codes for script automation:')
print(' 0 = all OK or warnings')
print(' 1 = errors')
print(' 2 = call of script w/o parameters (= showing this message)')
print()
sys.exit(2)

View File

@ -0,0 +1,35 @@
#!/bin/bash
set -e
export OPEN_PDKS_VERSION="dd7771c384ed36b91a25e9f8b314355fc26561be"
export SCRIPT_DIR=$PWD
#pip install git+https://github.com/gdsfactory/skywater130.git git+https://github.com/gdsfactory/gf180.git --upgrade --break-system-packages
pip install gf180 --upgrade --break-system-packages
pip install sky130 --upgrade --break-system-packages
######################
# INSTALL GF180MCU PDK
######################
volare enable "${OPEN_PDKS_VERSION}" --pdk gf180mcu
rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuA
rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuB
rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuD
rm -rf $PDK_ROOT/gf180mcuA
rm -rf $PDK_ROOT/gf180mcuB
rm -rf $PDK_ROOT/gf180mcuD
####################
# INSTALL SKY130 PDK
####################
volare enable "${OPEN_PDKS_VERSION}" --pdk sky130
# ADD PCELL SUPPORT
# remove version sky130B to save space (efabless TO use mostly sky130A)
rm -rf "$PDK_ROOT"/volare/sky130/versions/*/sky130B
rm -rf "$PDK_ROOT"/sky130B

View File

@ -0,0 +1,82 @@
#!/bin/bash
set -ex
SCRIPT_DIR=$PWD
# This files can be downloaded directly
# - sky130A_mr.drc
# - gf180mcuC_mr.drc
PRECHECK_REPO=https://raw.githubusercontent.com/efabless/mpw_precheck/main/checks/tech-files/
PRECHECK_GF_FILE=gf180mcuC_mr.drc
PRECHECK_SKY_FILE=sky130A_mr.drc
sudo aur-install wget
pip install docopt --upgrade --break-system-packages
function gf180_patch_xschemrc() {
FILEPATH=$PDK_ROOT/gf180mcuC/libs.tech/xschem/xschemrc
ORIGINAL='append XSCHEM_LIBRARY_PATH :$env(PWD)'
REPLACE='append XSCHEM_LIBRARY_PATH :$env(PDK_ROOT)/$env(PDK)/libs.tech/xschem'
sed -i "s\\$ORIGINAL\\$REPLACE\g" $FILEPATH
ORIGINAL='set 180MCU_MODELS ${PDK_ROOT}/models/ngspice'
REPLACE='set 180MCU_MODELS $env(PDK_ROOT)/$env(PDK)/libs.tech/ngspice'
sed -i "s\\$ORIGINAL\\$REPLACE\g" $FILEPATH
}
function gf180_patch_klayout_pcells() {
mv $KLAYOUT_HOME/pymacros $KLAYOUT_HOME/cells
mkdir $KLAYOUT_HOME/pymacros
mv $KLAYOUT_HOME/cells $KLAYOUT_HOME/pymacros
mv $KLAYOUT_HOME/tech/gf180mcu.lym $KLAYOUT_HOME/pymacros
rm -rf .scripts/klayout
}
function gf180_patch_klayout_dropdown() {
# 27:00 & 36:40
DROPDOWN_REPO="https://github.com/mabrains/globalfoundries-pdk-libs-gf180mcu_fd_pr"
DROPDOWN_DIRECTORY="gf_dropdown"
git clone $DROPDOWN_REPO $DROPDOWN_DIRECTORY
cp -r $DROPDOWN_DIRECTORY/rules/klayout/macros $KLAYOUT_HOME
rm -rf $DROPDOWN_DIRECTORY
}
function gf180_patch_klayout_gf_drc() {
# 27:00 & 36:40
GF_VERIFICATION_REPO=https://github.com/efabless/globalfoundries-pdk-libs-gf180mcu_fd_pv
VERIFICATION_DIR="gf_verification"
git clone $GF_VERIFICATION_REPO $VERIFICATION_DIR
# rm -rf $KLAYOUT_HOME/drc
# rm -rf $KLAYOUT_HOME/lvs
cp -r $VERIFICATION_DIR/klayout/drc/* $KLAYOUT_HOME/drc
cp -r $VERIFICATION_DIR/klayout/lvs/* $KLAYOUT_HOME/lvs
rm -rf $VERIFICATION_DIR
}
function gf180_patch_klayout_precheck_drc() {
#curl -o $KLAYOUT_HOME/drc/rule_decks/$PRECHECK_GF_FILE $PRECHECK_REPO/$PRECHECK_GF_FILE
wget -O $KLAYOUT_HOME/drc/rule_decks/$PRECHECK_GF_FILE $PRECHECK_REPO/$PRECHECK_GF_FILE
}
function gf180_patch() {
export KLAYOUT_HOME="$PDK_ROOT/gf180mcuC/libs.tech/klayout"
gf180_patch_xschemrc
gf180_patch_klayout_pcells
gf180_patch_klayout_precheck_drc
gf180_patch_klayout_dropdown
gf180_patch_klayout_gf_drc
}
gf180_patch
sudo aur-install gedit xterm gvim

View File

@ -0,0 +1,74 @@
#!/bin/bash
set -ex
SCRIPT_DIR=$PWD
# This files can be downloaded directly
# - sky130A_mr.drc
# - gf180mcuC_mr.drc
PRECHECK_REPO=https://raw.githubusercontent.com/efabless/mpw_precheck/main/checks/tech-files/
PRECHECK_GF_FILE=gf180mcuC_mr.drc
PRECHECK_SKY_FILE=sky130A_mr.drc
# TODO: DOWNLOAD WITH WGET, DONT HAVE IT STATIC
if [ -d $SCRIPT_DIR/iic-spice-model-red.py ]; then
echo File iic-spice-model.red.py not found
return -1
fi
sudo aur-install wget
function sky130_patch_reduced_models() {
cd "$PDK_ROOT/sky130A/libs.tech/ngspice" || exit 1
"$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice tt
"$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice ss
"$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice ff
cd "$SCRIPT_DIR"
rm -rf "iic-spice-model-red.py"
}
function sky130_patch_klayout_lyt() {
FILEPATH="$KLAYOUT_HOME/tech/sky130A.lyt"
sed -i 's/>sky130</>sky130A</g' $FILEPATH
sed -i 's/sky130.lyp/sky130A.lyp/g' $FILEPATH
sed -i '/<base-path>/c\ <base-path/>' $FILEPATH
sed -i '/<original-base-path>/c\ <original-base-path>$PDK_ROOT/$PDK/libs.tech/klayout</original-base-path>' $FILEPATH
}
function sky130_patch_klayout_lym () {
# ERROR: Reading /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/sky130.lym: XML parser error: invalid name for processing instruction in line 17, column 6
# ERROR: Reading /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/sky130.lym: XML parser error: invalid name for processing instruction in line 17, column 6
# ERROR: Reading /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/sky130.lym: XML parser error: invalid name for processing instruction in line 17, column 6
FILENAME="$KLAYOUT_HOME/pymacros/sky130.lym"
LINE=17
( sed -n ${LINE}' {p;q}' $FILENAME ; sed "${LINE}d" $FILENAME ) > $FILENAME
}
function sky130_patch_klayout_pcells() {
# Fixing the above, the cells indicates the following:
# ERROR: /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/cells/via_generator.py:23: ModuleNotFoundError: No module named 'gdsfactory.types'
# /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/cells/via_generator.py:23
# /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/cells/vias.py:20
# /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/cells/__init__.py:21
# /home/designer/.volare/sky130A/libs.tech/klayout/pymacros/sky130.lym:9 (class ModuleNotFoundError)
echo hola
}
function sky130_patch_klayout_precheck_drc() {
wget -O $KLAYOUT_HOME/drc/$PRECHECK_SKY_FILE $PRECHECK_REPO/$PRECHECK_SKY_FILE
}
function sky130_patch() {
export KLAYOUT_HOME="$PDK_ROOT/sky130A/libs.tech/klayout"
sky130_patch_reduced_models
sky130_patch_klayout_lyt
# sky130_patch_klayout_lym # TODO: The file disappears
# sky130_patch_klayout_pcells # TODO: Before fixing lym, this explodes
sky130_patch_klayout_precheck_drc
}
sky130_patch
sudo aur-install gedit xterm gvim