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
}