view_gds
Open GDSII layout files in KLayout viewer to visualize integrated circuit designs from Electronic Design Automation workflows.
Instructions
Open GDSII file in KLayout viewer
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID from OpenLane run | |
| gds_file | No | Specific GDS filename (optional, auto-detected if not provided) |
Implementation Reference
- src/index.ts:508-581 (handler)EDAServer.viewGds: Core handler that retrieves the GDS file from an OpenLane project and launches KLayout viewer.async viewGds(projectId: string, gdsFile?: string): Promise<string> { try { const project = this.projects.get(projectId); if (!project) { return JSON.stringify({ success: false, error: `Project ${projectId} not found.`, }, null, 2); } let gdsPath = ""; if (gdsFile) { // Specific GDS file provided gdsPath = join(project.dir, gdsFile); } else { // Auto-find GDS file in OpenLane project const runsDir = join(project.dir, "runs"); try { const runs = await fs.readdir(runsDir); if (runs.length > 0) { const latestRun = runs.sort().reverse()[0]; const finalDir = join(runsDir, latestRun, "final", "gds"); const gdsFiles = await fs.readdir(finalDir); const gdsFilesList = gdsFiles.filter(f => f.endsWith('.gds')); if (gdsFilesList.length > 0) { gdsPath = join(finalDir, gdsFilesList[0]); } } } catch { return JSON.stringify({ success: false, error: "No GDS files found in project. Run OpenLane flow first.", }, null, 2); } } if (!gdsPath) { return JSON.stringify({ success: false, error: "No GDS file found to open.", }, null, 2); } // Check if GDS file exists try { await fs.access(gdsPath); } catch { return JSON.stringify({ success: false, error: `GDS file not found: ${gdsPath}`, }, null, 2); } // Launch KLayout directly with the correct command format const klayoutCmd = `open -a KLayout "${gdsPath}"`; await execAsyncWithTimeout(klayoutCmd, { shell: true }, 10000); return JSON.stringify({ success: true, message: `KLayout launched with GDS file`, gds_file: basename(gdsPath), gds_path: gdsPath, project_id: projectId, command_executed: klayoutCmd }, null, 2); } catch (error: any) { return JSON.stringify({ success: false, error: error.message || String(error), }, null, 2); } }
- src/index.ts:819-836 (registration)Tool registration in ListTools handler, defining name, description, and input schema for 'view_gds'.{ name: "view_gds", description: "Open GDSII file in KLayout viewer", inputSchema: { type: "object", properties: { project_id: { type: "string", description: "Project ID from OpenLane run" }, gds_file: { type: "string", description: "Specific GDS filename (optional, auto-detected if not provided)" }, }, required: ["project_id"], }, },
- src/index.ts:916-926 (registration)Dispatch case in CallToolRequestSchema handler that invokes the viewGds method with validated arguments.case "view_gds": { const projectId = validateRequiredString(args, "project_id", name); const gdsFile = getStringProperty(args, "gds_file", ""); return { content: [{ type: "text", text: await edaServer.viewGds(projectId, gdsFile || undefined), }], }; }
- src/index.ts:822-835 (schema)Input schema defining parameters for the view_gds tool: project_id (required), gds_file (optional).inputSchema: { type: "object", properties: { project_id: { type: "string", description: "Project ID from OpenLane run" }, gds_file: { type: "string", description: "Specific GDS filename (optional, auto-detected if not provided)" }, }, required: ["project_id"], },