diff --git a/README.md b/README.md index f3791fa..47a9794 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ act - circuit design and digital simulation
prspice - configure digital/analog circuit co-simulation
Xyce - analog circuit simulation
gaw - analog waveform viewer
+klayout - circuit layout
magic - circuit layout
+OpenROAD - physical design
Semiconductor PDKs are in /opt/cad/conf
Packages may be installed with 'sudo apt install '
@@ -22,7 +24,7 @@ mkdir ~/tech; tar -xzvf sky130.tar.gz -C ~/tech ``` Pull the docker image for the broccoli command line interface, and configure it. ``` -docker pull public.ecr.aws/l5h5o6z4/broccoli-cli:latest +docker pull broccolimicro/broccoli-cli:latest git clone https://git.broccolimicro.io/Broccoli/broccoli-cli.git source broccoli-cli/bcli-develop.sh export BCLI_TECH="$HOME/tech" @@ -57,6 +59,29 @@ bcli down ## Troubleshooting +This script runs the docker container with the following commands: + +``` +# This produces a list of groups and their gids like so: +# 1000 nbingham +# 138 docker +# ... +MEMBERS="$(groups | sed 's/ /\n/g' | xargs -I{} getent group {} | sed 's/\([^:]*\):[^:]*:\([^:]*\):.*/\2 \1/g')" + +docker run --rm -d --net=host \ + -v $HOME:/host \ + -v "${BCLI_TECH:-/opt/tech}:/opt/cad/conf" \ + --name "bcli-$USER" \ + -h "bcli-$USER" \ + -e USER=$USER \ + -e USER_ID=$(id -u) \ + -e GROUP_ID=$(id -g) \ + -e DISPLAY=$DISPLAY \ + -e MEMBERS="$MEMBERS" \ + -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \ + broccolimicro/broccoli-cli:latest > /dev/null +``` + There are multiple versions of docker, the one that seems to work best for this is `docker.io`. `docker-ce` seems to have trouble writing files in the container. ``` sudo apt install docker.io diff --git a/bcli-develop.sh b/bcli-develop.sh index 8b9218d..859af21 100644 --- a/bcli-develop.sh +++ b/bcli-develop.sh @@ -1,49 +1,48 @@ bcli() { - if [ "$1" = "up" ]; then - MEMBERS="$(groups | sed 's/ /\n/g' | xargs -I{} getent group {} | sed 's/\([^:]*\):[^:]*:\([^:]*\):.*/\2 \1/g')" - docker run --rm -d --net=host -v $HOME:/host -v "${BCLI_TECH:-/opt/tech}:/opt/cad/conf" --name "bcli-$USER" -h "bcli-$USER" -e USER=$USER -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) -e DISPLAY=$DISPLAY -e MEMBERS="$MEMBERS" -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" public.ecr.aws/l5h5o6z4/broccoli-cli:latest > /dev/null - #docker run --rm -d -v $HOME:/host -v "${BCLI_TECH:/opt/tech}:/opt/cad/conf" --name "bcli-$USER" -h "bcli-$USER" -e USER=$USER -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) -e DISPLAY=$DISPLAY -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" ${BCLI_IMAGE:-public.ecr.aws/l5h5o6z4/broccoli-cli:latest} > /dev/null - echo "bcli-$USER started" - elif [ "$1" = "down" ]; then - docker stop "bcli-$USER" > /dev/null - echo "bcli-$USER stopped" + if [ "$1" = "up" ]; then + MEMBERS="$(groups | sed 's/ /\n/g' | xargs -I{} getent group {} | sed 's/\([^:]*\):[^:]*:\([^:]*\):.*/\2 \1/g')" + docker run --rm -d --net=host -v $HOME:/host -v "${BCLI_TECH:-/opt/tech}:/opt/cad/conf" --name "bcli-$USER" -h "bcli-$USER" -e USER=$USER -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) -e DISPLAY=$DISPLAY -e MEMBERS="$MEMBERS" -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" broccolimicro/broccoli-cli:latest > /dev/null + echo "bcli-$USER started" + elif [ "$1" = "down" ]; then + docker stop "bcli-$USER" > /dev/null + echo "bcli-$USER stopped" #legacy, or if server files change faster than a new download - elif [ "$1" = "mount" ]; then - if [ -z "$BROCCOLI_USER" ]; then - echo "Please set the BROCCOLI_USER environment variable for ssh access." + elif [ "$1" = "mount" ]; then + if [ -z "$2" ]; then + echo "expected an ssh path to a tech directory (user@server:path/to/tech)." + else + mkdir -p $HOME/tech + sshfs $2 $HOME/tech/ + fi + elif [ "$1" = "unmount" ]; then + shift + if [ "$1" = "-f" ]; then + pkill -KILL sshfs + fusermount -u $HOME/tech + else + umount $HOME/tech + fi + rmdir $HOME/tech + elif [ "$#" -eq 0 ]; then + WD="/host" + if [[ "$PWD" = "$HOME/"* ]]; then + WD="/host${PWD#$HOME}" + fi + XAUTH_TOKEN="$(xauth list | sed 's/^[^:]*/localhost/g' | sed 's/localhost: /localhost:0 /g')" + docker exec -u $(id -u) -e XAUTH_TOKEN="$XAUTH_TOKEN" -it "bcli-$USER" /bin/bash -c "echo \"$XAUTH_TOKEN\" | xargs -n 3 xauth add" + docker exec -u $(id -u) -w $WD -e DISPLAY=$DISPLAY -it "bcli-$USER" /bin/bash else - mkdir -p $HOME/tech - sshfs $BROCCOLI_USER@broccolimicro.io:/opt/tech $HOME/tech/ - fi - elif [ "$1" = "unmount" ]; then - shift - if [ "$1" = "-f" ]; then - pkill -KILL sshfs - fusermount -u $HOME/tech - else - umount $HOME/tech - fi - rmdir $HOME/tech - elif [ "$#" -eq 0 ]; then - WD="/host" - if [[ "$PWD" = "$HOME/"* ]]; then - WD="/host${PWD#$HOME}" - fi - XAUTH_TOKEN="$(xauth list | sed 's/^[^:]*/localhost/g' | sed 's/localhost: /localhost:0 /g')" - docker exec -u $(id -u) -e XAUTH_TOKEN="$XAUTH_TOKEN" -it "bcli-$USER" /bin/bash -c "echo \"$XAUTH_TOKEN\" | xargs -n 3 xauth add" - docker exec -u $(id -u) -w $WD -e DISPLAY=$DISPLAY -it "bcli-$USER" /bin/bash - else - if [ "$1" != "--help" ]; then - echo "error: unrecognized command '$1'" - echo "" - fi + if [ "$1" != "--help" ]; then + echo "error: unrecognized command '$1'" + echo "" + fi - echo "usage: bcli " - echo "If command is empty, then start a terminal logged into the toolset." - echo " up - launch the toolset" - echo " down - shutdown the toolset" - echo " mount - legacy command; mount the technology files from broccolimicro.io" - echo " unmount - legacy command; unmount the technology files" - echo " -f - legacy option; force the unmount if the connection has been broken" - fi + echo "usage: bcli " + echo "If command is empty, then start a terminal logged into the toolset." + echo " up - launch the toolset" + echo " down - shutdown the toolset" + echo " mount - legacy command; mount the technology files from broccolimicro.io" + echo " unmount - legacy command; unmount the technology files" + echo " -f - legacy option; force the unmount if the connection has been broken" + fi }