github/workflows: use klayout for layout preview
diff --git a/.github/workflows/user_project_ci.yml b/.github/workflows/user_project_ci.yml
index 84e4bed..ad8cdf7 100644
--- a/.github/workflows/user_project_ci.yml
+++ b/.github/workflows/user_project_ci.yml
@@ -16,6 +16,7 @@
   PDK_ROOT: '/home/runner/work/pdk'
   OPENLANE_ROOT: '/home/runner/work/openlane'
   PDK: 'gf180mcuC'
+  PDK_TECH: 'gf180mcu'
   SETUP_TAG: 'gfmpw-0a'
 
 jobs:
@@ -218,8 +219,9 @@
         git commit -m "harden project [skip ci]"
         git push origin main
 
-  svg:
-    needs: gds
+  layout:
+    needs:
+    - gds
     runs-on: ubuntu-latest
     steps:
     - name: setup python
@@ -242,22 +244,19 @@
           spi/
           verilog/
         key: ${{ runner.os }}-gds-${{ github.run_id }}
-    - name: create tiny_user_project svg
+    - name: install klayout
       run: |
-        python -m pip install gdstk
-        python << EOF
-        import gdstk
-        library = gdstk.read_gds('gds/user_project_wrapper.gds')
-        top_cells = library.top_level()
-        top_cells[0].write_svg('user_project_wrapper.svg')
-        EOF
-    - name: convert to png
+        curl -O https://www.klayout.org/downloads/Ubuntu-18/klayout_0.27.12-1_amd64.deb
+        dpkg -i klayout_0.27.12-1_amd64.deb
+        sudo apt-get -f install
+        sudo apt-get install -yq xvfb
+    - name: save layout image
       run: |
-        python -m pip install cairosvg
-        python << EOF
-        import cairosvg
-        cairosvg.svg2png(url='user_project_wrapper.svg', write_to='user_project_wrapper.png')
-        EOF
+       cat << EOF > save_image.rb
+       mw = RBA::Application::instance.main_window
+       mw.current_view.save_image("#{$image_path}", 1000, 1000)
+       EOF
+       xvfb-run klayout -d 10 -z -n ${{ env.PDK }} -nn ${{ env.PDK_ROOT }}/${{ env.PDK }}/libs.tech/klayout/tech/${{ env.PDK_TECH }}.lyt -l ${{ env.PDK_ROOT }}/${{ env.PDK }}/libs.tech/klayout/tech/${{ env.PDK_TECH }}.lyp -r save_image.rb -rd image_path=user_project_wrapper.png user_project_wrapper.gds
     - name: populate img cache
       uses: actions/cache@v3
       with:
@@ -267,7 +266,7 @@
   pages:
     if: github.ref_name == 'main'
     needs:
-    - svg
+    - layout
     environment:
       name: github-pages
       url: ${{ steps.deployment.outputs.page_url }}