Files
mxpic_EDA/develop_plan/findings.md
T
2026-06-08 14:48:14 +08:00

109 lines
10 KiB
Markdown

# Project Findings
## Repository Inventory
- Static/frontend files are under `frontend/`: `login.html`, `dashboard.html`, `canvas.html`, and `canvas-helpers.js`.
- Backend files are under `backend/`: `server.py`, `database.py`, `pdk_access.py`, `technology_manifest.py`, `gds_builder.py`, routing helpers, icons, and `directories.yaml`.
- Persistent data appears under `database/`, including `mxpic_data.db`, saved layout YAML/SVG files, and generated `_exports/*.gds`.
- Tests are JavaScript static/unit-style tests under `tests/`.
- Project docs exist under `docs/`, including intranet deployment, GDS/SVG generation, and PDK technology loading notes.
- A checked saved layout example at `database/engineer/layout/mxpic_project_1/mxpic_project_1.yml` contains unresolved merge-conflict markers, so at least some local saved data may be invalid until cleaned.
- Conflict-marker search also found real markers in `database/engineer/layout/mxpic_project_1/mxpic_project_1.svg`, `tests/layout-ui-wiring.test.js`, and `tests/layout-backend-static.test.js`.
- `backend/directories.yaml` is a legacy/declarative directory category file with PDK-style categories; the active docs/source show library scanning is now driven by the role-scoped PDK filesystem.
## Saved Layout YAML Shape
- Saved layout YAML uses schema version `2.0.0`, `kind: cell`, `coordinate_system: gds_y_up`, `canvas_size`, `project`, `name`, `type`, and `version`.
- Modern YAML uses `pins`, `instances`, `elements`, and `bundles`.
- `instances` can reference basic components like `circle`, generated/forge components, other project cells, or PDK paths such as `Silterra/<technology>/primitives/...`.
- `bundles.output_bus.links` stores routed connections with source/target pins and route settings.
- Both checked `.project.json` metadata files (`admin` and `engineer`) select technology `Silterra/EMO1_2ML_CU_Al_RDL`.
## README / Deployment
- The project is `mxpic_EDA`, an EDA layout tool for OptiHK.
- Runtime requirement explicitly listed in README is Flask.
- The application can launch login, dashboard, canvas editing, YAML generation, and PDK browsing without build-time router dependencies.
- Build/export actions require `mxpic_router` and Nazca; if `mxpic_forge.Route` is unavailable, routing falls back to Nazca interconnects.
- SVG preview generation for routed/build output requires `gdstk`.
- Intranet server is started with `run_intranet_server.ps1` and listens on `0.0.0.0:3000` by default.
- LAN users browse to `http://<host-computer-ip>:3000`; firewall must allow inbound TCP `3000`.
- Default local accounts are `admin / 123456` and `engineer / 123456`.
- User project files are stored under `database/<username>/layout`.
- Important env vars include `MXPIC_SECRET_KEY`, `MXPIC_HOST`, `MXPIC_PORT`, `MXPIC_DEBUG`, `MXPIC_COOKIE_SECURE`, `MXPIC_PDK_PUBLIC_ROOT`, and `MXPIC_PDK_ATLAS_ROOT`.
- Public/developer PDK roots default to `../opt_pdk_public/foundries`; manager/atlas roots default to `../opt_pdk_atlas/foundries`.
- `run_intranet_server.ps1` sets default `MXPIC_SECRET_KEY` if absent, sets `MXPIC_HOST=0.0.0.0`, `MXPIC_PORT=3000`, `MXPIC_DEBUG=0`, then runs `python backend\server.py`.
- `backend/server.py` initializes the local SQLite database when the server process starts.
- Flask runs threaded on the configured host and port.
## GDS / SVG Generation
- `Build Layout` serializes the active canvas page into layout YAML, posts it to `/api/save-layout`, writes `database/<username>/layout/<project>/<cell>.yml`, writes optional route sidecar data, then calls router-backed SVG preview generation.
- Routed SVG preview uses `backend/routed_layout_preview.py`, which delegates to `mxpic_router.build_project_gds`, reads the temporary GDS with `gdstk`, and writes `<cell>.svg`.
- `Build GDS` posts to `/api/build-gds` with only the project name. It does not automatically serialize unsaved in-memory canvas state first.
- Final GDS export reads existing saved project YAML files, calls `backend/gds_builder.py`, delegates to `mxpic_router`, writes `database/_exports/<uuid>/<project>.gds`, returns a download URL, then cleans up the export folder after response close.
- Saved layout files are under `database/<username>/layout/<project>/`.
- External build dependencies are lazy: normal web usage can work without router stack, while preview/build actions require `mxpic_router`, Nazca, and sometimes `gdstk`.
## PDK / Technology / Xsections
- PDK components, technology manifests, and GDS assets all come from role-scoped PDK roots.
- Dashboard loads available technologies from `/api/technologies`, scanning `<active_role_pdk_root>/<foundry>/<technology>/technology.yml`.
- Project creation stores selected technology in `database/<username>/layout/<project>/.project.json`.
- Canvas loads project metadata from `/api/projects/<project>`, then loads `/api/technologies/<foundry>/<technology>/manifest`.
- `technology.yml` supplies layer mappings, routing type options, defaults, and xsection definitions such as `strip`, `rib_low`, `metal_1`, and `metal_2`.
- Canvas route editing uses the active technology manifest to populate xsection choices and route defaults.
- Saved YAML stores component paths and per-link route data such as `xsection`, `family`, `width`, `radius`, and `routing_type`.
- Build-time router applies `technology.yml` to Nazca layers/xsections before resolving PDK assets and routing links.
## Backend Route Surface
- `backend/server.py` serves `/`, `/dashboard`, `/canvas`, `/canvas-helpers.js`, and `/logout`.
- Login endpoint is `POST /login`.
- Health check endpoint is `/api/health`.
- Account/profile endpoints include `/api/profile`, `/api/profile/password`, and `/api/logs`.
- Project endpoints include listing/creating `/api/projects`, reading/deleting `/api/projects/<project_name>`, cell rename/delete under `/api/projects/<project_name>/cells/<cell_name>`, and `/api/save-layout`.
- Build/export endpoints include `/api/build-gds`, `/api/exports/<export_id>/<filename>`, and `/api/projects/<project_name>/gds/<filename>`.
- PDK/technology endpoints include `/api/technologies`, `/api/technologies/<foundry>/<technology>/manifest`, `/api/library`, `/api/component/<component_name>`, `/api/component/<component_name>/image`, and `/api/icon/<category>`.
- Project listing treats each `.yml`/`.yaml` inside a project folder as one saved cell/canvas.
- Project creation sanitizes the requested name, adds a numeric suffix if needed, creates an initial project folder, writes `.project.json`, and logs `project.create`.
- `/api/save-layout` accepts `project`, `cell`, `content`, and optional `preview` flag.
- `/api/library` rebuilds the component tree on each request so project technology and user role are reflected immediately.
## Frontend Page Flow
- `frontend/login.html` renders a login form that submits `POST /login` and then moves authenticated users into the dashboard.
- `frontend/dashboard.html` loads recent logs from `/api/logs`, profile data from `/api/profile`, projects from `/api/projects`, and technology choices from `/api/technologies`.
- Opening a project navigates to `/canvas?project=<name>`.
- Creating a project posts `{ name, technology }` to `/api/projects`.
- Dashboard also supports deleting projects, updating occupation, and changing password through backend APIs.
- `frontend/canvas.html` loads project metadata/cells from `/api/projects/<project>`, then loads the selected technology manifest.
- Canvas loads the component library with `/api/library?project=<project>`, component metadata from `/api/component/<component_name>?project=<project>`, and component images from `/api/component/<component_name>/image?project=<project>`.
- Canvas save/build controls call `/api/save-layout` and `/api/build-gds`.
- Dashboard `openProject(name)` navigates directly to `/canvas?project=<name>`.
- Canvas `loadTechnologyManifest` falls back to `FALLBACK_TECHNOLOGY_MANIFEST` when the saved technology is missing/invalid.
- Canvas `fetchLibrary` is project-scoped, so the visible library follows the selected project technology.
- Canvas source comments define the control split:
- `handleBuildLayout`: save active page, generate preview assets, show preview tab.
- `handleSaveProjectLayouts`: save YAML for every editable page without opening previews.
- `handleBuildGds`: build project GDS through the backend and trigger download.
## Database
- `backend/database.py` uses SQLite at `database/mxpic_data.db`.
- Tables: `users` and `user_logs`.
- User records include password hash, creation date, credits, occupation, and `user_group`.
- Database migrations add missing columns to older local SQLite files.
- Default account roles are `admin -> manager`, `engineer -> developers`, and ordinary users default to `user`.
- Audit logs record user action, project/cell context, detail, IP address, and UTC timestamp.
## PDK Access and Build Helpers
- `backend/pdk_access.py` defines supported user groups: `manager`, `developers`, and `user`.
- Managers resolve to `MXPIC_PDK_ATLAS_ROOT` or `opt_pdk_atlas/foundries`; developers/users resolve to `MXPIC_PDK_PUBLIC_ROOT` or `opt_pdk_public/foundries`.
- Only managers prefer full component GDS assets; other roles use public/black-box style assets.
- Temporary GDS exports are created in UUID folders and old export folders are cleaned up after an age threshold.
- `backend/gds_builder.py` validates that saved cell YAML files exist, then delegates all final GDS work to `mxpic_router.build_project_gds`.
- Local GDS building is not implemented as a fallback in this repository.
## Tests
- Tests are JavaScript assertion scripts in `tests/`.
- The test suite heavily checks static frontend/backend integration contracts, such as route existence, API strings, layout/GDS wiring, technology manifest loading, and PDK access behavior.
- `tests/canvas-helpers.test.js` directly imports `frontend/canvas-helpers.js` and checks handle placement, YAML serialization, route defaults, element ports, route YAML, and route crossing helpers.
- Several tests intentionally assert that legacy local preview/registry modules are absent and that the router-backed preview/GDS path is present.
- Current checked test files include unresolved conflict markers in at least two files, so `node` test execution may fail before assertions run unless those files are cleaned.
## Open Questions
- None remaining for the requested project usage/workflow summary.