diff --git a/.gitignore b/.gitignore index 237f9e9..ddbf635 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ dist/ node_modules/ parcel-optimizer-array-buffer/lib/ .direnv/ +target/ +pkg/ diff --git a/.parcelrc b/.parcelrc deleted file mode 100644 index 47d1b5e..0000000 --- a/.parcelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "@parcel/config-default" -} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index fcc9273..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: "3" - -services: - node: - user: 1000:1000 - image: node:18-alpine - volumes: - - .:/app - working_dir: /app - command: npm exec -w viewer-test parcel index.html - ports: - - 1234:1234 - - 1235:1235 diff --git a/docs/development.md b/docs/development.md index 790e984..5633d24 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1,6 +1,7 @@ # Development ## Setup + ```shell git clone git@github.com:EDAcation/nextpnr-viewer.git cd nextpnr-viewer @@ -8,13 +9,14 @@ npm install ``` ## Building + ```shell -npm exec -w parcel-optimizer-array-buffer parcel build npm run -w lib build ``` ## Publishing + ```shell cd lib -npm publish +npm -w lib publish ``` diff --git a/lib/Cargo.lock b/lib/Cargo.lock new file mode 100644 index 0000000..7b84494 --- /dev/null +++ b/lib/Cargo.lock @@ -0,0 +1,476 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +dependencies = [ + "backtrace", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cc" +version = "1.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.162" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "minicov" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +dependencies = [ + "cc", + "walkdir", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "nextpnr-renderer" +version = "0.0.1" +dependencies = [ + "anyhow", + "byteorder", + "console_error_panic_hook", + "num-derive", + "num-traits", + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-test", + "web-sys", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "serde" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "minicov", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/lib/Cargo.toml b/lib/Cargo.toml new file mode 100644 index 0000000..258e784 --- /dev/null +++ b/lib/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "nextpnr-renderer" +version = "0.0.1" +authors = [] +edition = "2021" + +[lib] +path = "src/lib.rs" +crate-type = ["cdylib", "rlib"] + +[features] +default = ["console_error_panic_hook"] + +[dependencies] +wasm-bindgen = "0.2.93" + +# The `console_error_panic_hook` crate provides better debugging of panics by +# logging them with `console.error`. This is great for development, but requires +# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for +# code size when deploying. +console_error_panic_hook = { version = "0.1.7", optional = true } +byteorder = "1.5.0" +num-traits = "0.2.19" +num-derive = "0.4.2" +anyhow = { version = "1.0.93", features = ["backtrace"] } +serde = { version = "1.0.215", features = ["derive"] } +serde-wasm-bindgen = "0.6.5" + +[dependencies.web-sys] +version = "0.3.72" +features = [ + "HtmlCanvasElement", + "WebGl2RenderingContext", + "WebGlProgram", + "WebGlShader", + "WebGlVertexArrayObject", + "WebGlBuffer", + "WebGlUniformLocation", +] + +[dev-dependencies] +wasm-bindgen-test = "0.3.43" + +[profile.release] +opt-level = 2 diff --git a/lib/package.json b/lib/package.json index cf5df98..d242608 100644 --- a/lib/package.json +++ b/lib/package.json @@ -16,18 +16,20 @@ "visualization" ], "source": "src/index.ts", - "main": "dist/main.js", - "module": "dist/module.js", - "types": "dist/types.d.ts", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", "files": [ "dist", "package.json" ], "scripts": { "check": "tsc --noEmit", - "build": "parcel build" + "build-wasm": "wasm-pack build --release --target web", + "build": "npm run-script build-wasm && rollup -c", + "prepublish": "npm run build" }, "dependencies": { - "rxjs": "^7.8.0" + "nextpnr-renderer": "file:./pkg" } } diff --git a/lib/rollup.config.mjs b/lib/rollup.config.mjs new file mode 100644 index 0000000..55a7a04 --- /dev/null +++ b/lib/rollup.config.mjs @@ -0,0 +1,17 @@ +import nodeResolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import { importMetaAssets } from '@web/rollup-plugin-import-meta-assets'; + + +export default { + input: 'src/index.ts', + output: { + dir: 'dist', + format: 'es', + }, + plugins: [ + nodeResolve(), + typescript(), + importMetaAssets(), + ], +}; diff --git a/lib/src/architecture/architecture.ts b/lib/src/architecture/architecture.ts deleted file mode 100644 index f5789d1..0000000 --- a/lib/src/architecture/architecture.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {LocationPOD} from '../chipdb/ecp5.chipdb'; -import {DecalXY} from '../decal/decal'; -import {GraphicElement} from '../gfx/gfx'; - -export interface Architecture { - getDecalGraphics(decal: DecalID): Array; - getBelDecals(): Array>; - getWireDecals(): Array>; - getPipDecals(): Array>; - getGroupDecals(): Array>; - findPipDecalByLocFromTo( - location: LocationPOD, - from: {location: LocationPOD; name: string}, - to: {location: LocationPOD; name: string} - ): DecalXY | null; -} diff --git a/lib/src/architecture/ecp5.arch.ts b/lib/src/architecture/ecp5.arch.ts deleted file mode 100644 index 9e20e0e..0000000 --- a/lib/src/architecture/ecp5.arch.ts +++ /dev/null @@ -1,284 +0,0 @@ -import {ChipInfoPOD, LocationPOD} from '../chipdb/ecp5.chipdb'; -import {DecalXY} from '../decal/decal'; -import {ECP5DecalID, ECP5DecalType} from '../decal/ecp5.decalid'; -import {GFX} from '../gfx/ecp5.gfx'; -import {switchbox_x1, switchbox_x2, switchbox_y1, switchbox_y2} from '../gfx/ecp5.gfx.constants'; -import {GraphicElement} from '../gfx/gfx'; -import {Style} from '../gfx/styles'; -import {GfxTileWireId} from '../gfx/tilewire.ecp5.gfx'; -import {Type} from '../gfx/types'; - -import {Architecture} from './architecture'; - -export class ECP5Arch implements Architecture { - constructor(private _chipdb: ChipInfoPOD) {} - - public getDecalGraphics(decal: ECP5DecalID): Array { - if (decal.type === ECP5DecalType.TYPE_BEL) { - const tile = decal.location.y * this._chipdb.width + decal.location.x; - const loc_info = this._chipdb.locations[this._chipdb.location_type[tile]]; - if (loc_info === undefined) return []; - - const x = decal.location.x; - const y = decal.location.y; - const z = loc_info.bel_data[decal.z].z; - const width = this._chipdb.width; - const height = this._chipdb.height; - const type = loc_info.bel_data[decal.z].type; - const style = Style.Inactive; - - return GFX.tileBel(x, y, z, width, height, type, style); - } else if (decal.type === ECP5DecalType.TYPE_WIRE) { - const tile = decal.location.y * this._chipdb.width + decal.location.x; - const loc_info = this._chipdb.locations[this._chipdb.location_type[tile]]; - if (loc_info === undefined) return []; - - const x = decal.location.x; - const y = decal.location.y; - const width = this._chipdb.width; - const height = this._chipdb.height; - const wiretype = loc_info.wire_data[decal.z].type; - const tilewire: GfxTileWireId = loc_info.wire_data[decal.z].tile_wire; - const style = Style.Inactive; - return GFX.tileWire(x, y, width, height, wiretype, tilewire, style); - } else if (decal.type === ECP5DecalType.TYPE_GROUP) { - const type = decal.z; - const x = decal.location.x; - const y = decal.location.y; - - if (type === 1 /* GroupId::TYPE_SWITCHBOX */) { - const el = new GraphicElement(); - el.type = Type.Box; - el.style = Style.Frame; - - el.x1 = x + switchbox_x1; - el.x2 = x + switchbox_x2; - el.y1 = y + switchbox_y1; - el.y2 = y + switchbox_y2; - return [el]; - } - } else if (decal.type === ECP5DecalType.TYPE_PIP) { - const index = decal.z; - const location = decal.location; - - const loc_info = (wire: {location: typeof location}) => { - const tile = wire.location.y * this._chipdb.width + wire.location.x; - return this._chipdb.locations[this._chipdb.location_type[tile]]; - }; - - const wire_type = (wire: {location: typeof location; index: number}) => { - return loc_info(wire).wire_data[wire.index].type; - }; - - const pip = loc_info(decal)?.pip_data[index]; - if (pip === undefined) return []; - - const src_wire = { - location: { - x: decal.location.x + pip.rel_src_loc.x, - y: decal.location.y + pip.rel_src_loc.y - }, - index: pip.src_idx - }; - const dst_wire = { - location: { - x: decal.location.x + pip.rel_dst_loc.x, - y: decal.location.y + pip.rel_dst_loc.y - }, - index: pip.dst_idx - }; - - const x = decal.location.x; - const y = decal.location.y; - - const src_id: GfxTileWireId = loc_info(src_wire).wire_data[src_wire.index].tile_wire; - const dst_id: GfxTileWireId = loc_info(dst_wire).wire_data[dst_wire.index].tile_wire; - - const style = Style.Hidden; - - const width = this._chipdb.width; - const height = this._chipdb.height; - return GFX.tilePip( - x, - y, - width, - height, - src_wire, - wire_type(src_wire), - src_id, - dst_wire, - wire_type(dst_wire), - dst_id, - style - ); - } - - return []; - } - - public getBelDecals(): Array> { - let cursor_index = 0; - let cursor_tile = 0; - - const ret: Array> = []; - - while (cursor_tile != this._chipdb.width * this._chipdb.height) { - while ( - cursor_tile < this._chipdb.num_tiles && - cursor_index >= this._chipdb.locations[this._chipdb.location_type[cursor_tile]].bel_data.length - ) { - cursor_index = 0; - cursor_tile++; - } - - const x = cursor_tile % this._chipdb.width; - const y = Math.floor(cursor_tile / this._chipdb.width); - const name = this._chipdb.locations[this._chipdb.location_type[cursor_tile]]?.bel_data[cursor_index].name; - - ret.push( - new DecalXY( - new ECP5DecalID(ECP5DecalType.TYPE_BEL, {x, y}, cursor_index), - 0, - 0, - `X${x}/Y${y}/${name}` - ) - ); - cursor_index++; - } - return ret; - } - - public getWireDecals(): Array> { - let cursor_index = 0; - let cursor_tile = 0; - - const ret: Array> = []; - - while (cursor_tile != this._chipdb.width * this._chipdb.height) { - while ( - cursor_tile < this._chipdb.num_tiles && - cursor_index >= this._chipdb.locations[this._chipdb.location_type[cursor_tile]].wire_data.length - ) { - cursor_index = 0; - cursor_tile++; - } - const x = cursor_tile % this._chipdb.width; - const y = Math.floor(cursor_tile / this._chipdb.width); - const name = this._chipdb.locations[this._chipdb.location_type[cursor_tile]]?.wire_data[cursor_index].name; - - ret.push( - new DecalXY( - new ECP5DecalID(ECP5DecalType.TYPE_WIRE, {x, y}, cursor_index), - 0, - 0, - `X${x}/Y${y}/${name}` - ) - ); - cursor_index++; - } - return ret; - } - - public findPipDecalByLocFromTo( - location: LocationPOD, - from: {location: LocationPOD; name: string}, - to: {location: LocationPOD; name: string} - ) { - const tile = location.y * this._chipdb.width + location.x; - let pip_data = this._chipdb.locations[this._chipdb.location_type[tile]].pip_data; - let pip_data_indexed = pip_data.map((v, i) => [i, v] as const); - - // Relative offsets - pip_data_indexed = pip_data_indexed.filter( - ([, pd]) => - pd.rel_src_loc.x === from.location.x && - pd.rel_src_loc.y === from.location.y && - pd.rel_dst_loc.x === to.location.x && - pd.rel_dst_loc.y === to.location.y - ); - - // From Name - pip_data_indexed = pip_data_indexed.filter(([, pd]) => { - const src_x = location.x + pd.rel_src_loc.x; - const src_y = location.y + pd.rel_src_loc.y; - const src_idx = pd.src_idx; - - const src_tile = src_y * this._chipdb.width + src_x; - const src_wire_data = this._chipdb.locations[this._chipdb.location_type[src_tile]].wire_data[src_idx]; - - return src_wire_data.name === from.name; - }); - - // To Name - pip_data_indexed = pip_data_indexed.filter(([, pd]) => { - const dst_x = location.x + pd.rel_dst_loc.x; - const dst_y = location.y + pd.rel_dst_loc.y; - const dst_idx = pd.dst_idx; - - const dst_tile = dst_y * this._chipdb.width + dst_x; - const dst_wire_data = this._chipdb.locations[this._chipdb.location_type[dst_tile]].wire_data[dst_idx]; - - return dst_wire_data.name === to.name; - }); - - if (pip_data_indexed.length === 0) return null; - - return new DecalXY( - new ECP5DecalID(ECP5DecalType.TYPE_PIP, {...location}, pip_data_indexed[0][0]), - 0, - 0, - `${JSON.stringify([location, from, to])}` - ); - } - - public getPipDecals(): Array> { - let cursor_tile = 0; - let cursor_index = 0; - - const ret: Array> = []; - - while (cursor_tile != this._chipdb.width * this._chipdb.height) { - while ( - cursor_tile < this._chipdb.num_tiles && - cursor_index >= this._chipdb.locations[this._chipdb.location_type[cursor_tile]].pip_data.length - ) { - cursor_index = 0; - cursor_tile++; - } - - const x = cursor_tile % this._chipdb.width; - const y = Math.floor(cursor_tile / this._chipdb.width); - - ret.push( - new DecalXY( - new ECP5DecalID(ECP5DecalType.TYPE_PIP, {x, y}, cursor_index), - 0, - 0, - `TODO(${cursor_tile}, ${cursor_index})` - ) - ); - - cursor_index++; - } - return ret; - } - - public getGroupDecals(): Array> { - const ret: Array> = []; - - for (let y = 1; y < this._chipdb.height - 1; ++y) { - for (let x = 1; x < this._chipdb.width - 1; ++x) { - ret.push( - new DecalXY( - new ECP5DecalID(ECP5DecalType.TYPE_GROUP, {x, y}, 1), - 0, - 0, - `X${x}/Y${y}/UNKNOWN_GROUP` - ) - ); - } - } - - return ret; - } -} diff --git a/lib/src/architecture/ecp5.rs b/lib/src/architecture/ecp5.rs new file mode 100644 index 0000000..3f4d455 --- /dev/null +++ b/lib/src/architecture/ecp5.rs @@ -0,0 +1,416 @@ +use super::types::{Architecture, Pip, PipLocation}; +use crate::chipdb; +use crate::decal; +use crate::decal::ECP5DecalID; +use crate::gfx; +use crate::gfx::ecp5::consts; + +type DecalID = decal::ECP5DecalID; +type Decal = decal::DecalXY; + +pub struct ECP5Arch { + chipdb: chipdb::ecp5::ChipInfoPOD, +} + +impl ECP5Arch { + pub fn new(chipdb: chipdb::ecp5::ChipInfoPOD) -> Self { + ECP5Arch { chipdb } + } +} + +impl Architecture for ECP5Arch { + fn get_decal_graphics(&self, decal: &DecalID) -> Vec { + if decal.r#type == decal::ECP5DecalType::TYPE_BEL { + let tile = decal.location.y * (self.chipdb.width as f64) + decal.location.x; + let Some(loc_info) = self + .chipdb + .location_type + .get(tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + else { + return vec![]; + }; + + let Some(bel_info) = loc_info.bel_data.get(decal.z as usize) else { + return vec![]; + }; + + let x = decal.location.x; + let y = decal.location.y; + let z = bel_info.z; + let width = self.chipdb.width; + let height = self.chipdb.height; + let r#type = &bel_info.r#type; + let style = &gfx::Style::Inactive; + + return gfx::ecp5::tile_bel(x, y, z, width, height, r#type, style); + } else if decal.r#type == decal::ECP5DecalType::TYPE_WIRE { + let tile = decal.location.y * (self.chipdb.width as f64) + decal.location.x; + let Some(loc_info) = self + .chipdb + .location_type + .get(tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + else { + return vec![]; + }; + + let Some(wire_data) = loc_info.wire_data.get(decal.z as usize) else { + return vec![]; + }; + + let x = decal.location.x; + let y = decal.location.y; + let width = self.chipdb.width; + let height = self.chipdb.height; + let wiretype = &wire_data.r#type; + let tilewire = &wire_data.tile_wire; + let style = &gfx::Style::Inactive; + return gfx::ecp5::tile_wire(x, y, width, height, wiretype, tilewire, style); + } else if decal.r#type == decal::ECP5DecalType::TYPE_GROUP { + let r#type = decal.z; + let x = decal.location.x; + let y = decal.location.y; + + if (r#type as i32) == 1 + /* GroupId::TYPE_SWITCHBOX */ + { + let mut el = gfx::GraphicElement::new(gfx::Type::Box, gfx::Style::Frame); + el.x1 = x + consts::switchbox_x1; + el.x2 = x + consts::switchbox_x2; + el.y1 = y + consts::switchbox_y1; + el.y2 = y + consts::switchbox_y2; + return vec![el]; + } + } else if decal.r#type == decal::ECP5DecalType::TYPE_PIP { + // Utility functions to get wire/decal loc info + let loc_info_wire = |wire: &gfx::ecp5::WireId| { + let tile = wire.location.y * (self.chipdb.width as f64) + wire.location.x; + return self + .chipdb + .location_type + .get(tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)); + }; + let loc_info_decal = |decal: &decal::ECP5DecalID| { + let tile = decal.location.y * (self.chipdb.width as f64) + decal.location.x; + return self + .chipdb + .location_type + .get(tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)); + }; + + // Get pip + let Some(pip) = loc_info_decal(&decal).and_then(|l| l.pip_data.get(decal.z as usize)) + else { + return vec![]; + }; + + // Get src wire info + let src_wire = gfx::ecp5::WireId { + location: gfx::ecp5::Location { + x: decal.location.x + (pip.rel_src_loc.x as f64), + y: decal.location.y + (pip.rel_src_loc.y as f64), + }, + }; + let Some(loc_src_wire) = loc_info_wire(&src_wire) else { + return vec![]; + }; + let Some(src_wire_info) = loc_src_wire.wire_data.get(pip.src_idx as usize) else { + return vec![]; + }; + + // Get dst wire info + let dst_wire = gfx::ecp5::WireId { + location: gfx::ecp5::Location { + x: decal.location.x + (pip.rel_dst_loc.x as f64), + y: decal.location.y + (pip.rel_dst_loc.y as f64), + }, + }; + let Some(loc_dst_wire) = loc_info_wire(&dst_wire) else { + return vec![]; + }; + let Some(dst_wire_info) = loc_dst_wire.wire_data.get(pip.dst_idx as usize) else { + return vec![]; + }; + + let x = decal.location.x; + let y = decal.location.y; + + let width = self.chipdb.width; + let height = self.chipdb.height; + + let src_type = &src_wire_info.r#type; + let dst_type = &dst_wire_info.r#type; + + let src_id = src_wire_info.tile_wire; + let dst_id = dst_wire_info.tile_wire; + + let style = &gfx::Style::Hidden; + + return gfx::ecp5::tile_pip( + x, y, width, height, &src_wire, src_type, &src_id, &dst_wire, dst_type, &dst_id, + style, + ); + } + + return vec![]; + } + + fn get_bel_decals(&self) -> Vec { + let mut cursor_index = 0; + let mut cursor_tile = 0; + + let mut ret: Vec = vec![]; + + while cursor_tile != self.chipdb.width * self.chipdb.height { + while cursor_tile < self.chipdb.num_tiles { + let Some(len) = self + .chipdb + .location_type + .get(cursor_tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .map(|l| l.bel_data.len()) + else { + return vec![]; + }; + if cursor_index < len { + break; + } + + cursor_index = 0; + cursor_tile += 1; + } + + let x = cursor_tile % self.chipdb.width; + let y = cursor_tile / self.chipdb.width; + + let name = self + .chipdb + .location_type + .get(cursor_tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .and_then(|l| l.bel_data.get(cursor_index)) + .map(|w| &w.name); + + ret.push(Decal::new( + ECP5DecalID::new( + decal::ECP5DecalType::TYPE_BEL, + x as f64, + y as f64, + cursor_index as f64, + ), + 0.0, + 0.0, + format!("X{}/Y{}/{}", x, y, name.unwrap_or(&"Unnamed".to_string())), + )); + cursor_index += 1; + } + return ret; + } + + fn get_wire_decals(&self) -> Vec { + let mut cursor_index = 0; + let mut cursor_tile = 0; + + let mut ret: Vec = vec![]; + + while cursor_tile != self.chipdb.width * self.chipdb.height { + while cursor_tile < self.chipdb.num_tiles { + let Some(len) = self + .chipdb + .location_type + .get(cursor_tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .map(|l| l.wire_data.len()) + else { + return vec![]; + }; + if cursor_index < len { + break; + } + + cursor_index = 0; + cursor_tile += 1; + } + let x = cursor_tile % self.chipdb.width; + let y = cursor_tile / self.chipdb.width; + let name = self + .chipdb + .location_type + .get(cursor_tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .and_then(|l| l.wire_data.get(cursor_index)) + .map(|w| &w.name); + + ret.push(Decal::new( + DecalID::new( + decal::ECP5DecalType::TYPE_WIRE, + x as f64, + y as f64, + cursor_index as f64, + ), + 0.0, + 0.0, + format!("X{}/Y{}/{}", x, y, name.unwrap_or(&"Unnamed".to_string())), + )); + cursor_index += 1; + } + return ret; + } + + fn get_pip_decals(&self) -> Vec { + let mut cursor_tile = 0; + let mut cursor_index = 0; + + let mut ret: Vec = vec![]; + + while cursor_tile != self.chipdb.width * self.chipdb.height { + while cursor_tile < self.chipdb.num_tiles { + let Some(len) = self + .chipdb + .location_type + .get(cursor_tile as usize) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .map(|l| l.pip_data.len()) + else { + return vec![]; + }; + if cursor_index < len { + break; + } + + cursor_index = 0; + cursor_tile += 1; + } + + let x = cursor_tile % self.chipdb.width; + let y = cursor_tile / self.chipdb.width; + + ret.push(Decal::new( + ECP5DecalID::new( + decal::ECP5DecalType::TYPE_PIP, + x as f64, + y as f64, + cursor_index as f64, + ), + 0.0, + 0.0, + format!("TODO({}, {})", cursor_tile, cursor_index), + )); + + cursor_index += 1; + } + return ret; + } + + fn get_group_decals(&self) -> Vec { + let mut ret: Vec = vec![]; + + for y in 1..(self.chipdb.height - 1) { + for x in 1..(self.chipdb.width - 1) { + ret.push(Decal::new( + DecalID::new(decal::ECP5DecalType::TYPE_GROUP, x as f64, y as f64, 1.0), + 0.0, + 0.0, + format!("X{x}/Y{y}/UNKNOWN_GROUP"), + )) + } + } + + return ret; + } + + fn find_pip_decal_by_loc_from_to( + &self, + location: &PipLocation, + from: &Pip, + to: &Pip, + ) -> Option { + let tile = (location.y as i32) * self.chipdb.width + (location.x as i32); + let loc_type = self.chipdb.location_type.get(tile as usize)?; + + let index: usize = self + .chipdb + .locations + .get(loc_type.clone() as usize) + .map(|l| { + l.pip_data + .iter() + .enumerate() + .filter( + // Relative offsets + |(_, pd)| { + pd.rel_src_loc.x == from.location.x + && pd.rel_src_loc.y == from.location.y + && pd.rel_dst_loc.x == to.location.x + && pd.rel_dst_loc.y == to.location.y + }, + ) + .filter(|(_, pd)| { + // From Name + let src_x = (location.x + pd.rel_src_loc.x) as usize; + let src_y = (location.y + pd.rel_src_loc.y) as usize; + let src_idx = pd.src_idx as usize; + + let src_tile = src_y * (self.chipdb.width as usize) + src_x; + let Some(src_wire_data) = self + .chipdb + .location_type + .get(src_tile) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .and_then(|l| l.wire_data.get(src_idx)) + else { + return false; + }; + + return src_wire_data.name == from.name; + }) + .filter(|(_, pd)| { + // To name + let dst_x = (location.x + pd.rel_dst_loc.x) as usize; + let dst_y = (location.y + pd.rel_dst_loc.y) as usize; + let dst_idx = pd.dst_idx as usize; + + let dst_tile = dst_y * (self.chipdb.width as usize) + dst_x; + let Some(dst_wire_data) = self + .chipdb + .location_type + .get(dst_tile) + .and_then(|&t| self.chipdb.locations.get(t as usize)) + .and_then(|l| l.wire_data.get(dst_idx)) + else { + return false; + }; + + return dst_wire_data.name == to.name; + }) + .map(|(i, _pd)| i) // Convert back into index + .collect() + }) + .and_then(|v: Vec| v.get(0).cloned())?; + + return Some(Decal::new( + DecalID::new( + decal::ECP5DecalType::TYPE_PIP, + location.x as f64, + location.y as f64, + index as f64, + ), + 0.0, + 0.0, + format!( + "X{}/Y{};X{}/Y{}/{}->X{}/Y{}/{}", + location.x, + location.y, + from.location.x, + from.location.y, + from.name, + to.location.x, + to.location.y, + to.name + ), + )); + } +} diff --git a/lib/src/architecture/mod.rs b/lib/src/architecture/mod.rs new file mode 100644 index 0000000..91669e1 --- /dev/null +++ b/lib/src/architecture/mod.rs @@ -0,0 +1,5 @@ +mod ecp5; +mod types; + +pub use ecp5::ECP5Arch; +pub use types::{Architecture, Pip, PipLocation}; diff --git a/lib/src/architecture/types.rs b/lib/src/architecture/types.rs new file mode 100644 index 0000000..a22add9 --- /dev/null +++ b/lib/src/architecture/types.rs @@ -0,0 +1,28 @@ +use crate::decal; +use crate::gfx; + +#[derive(Clone)] +pub struct PipLocation { + pub x: i16, + pub y: i16, +} + +#[derive(Clone)] +pub struct Pip { + pub location: PipLocation, + pub name: String, +} + +pub trait Architecture { + fn get_decal_graphics(&self, decal: &DecalID) -> Vec; + fn get_bel_decals(&self) -> Vec>; + fn get_wire_decals(&self) -> Vec>; + fn get_pip_decals(&self) -> Vec>; + fn get_group_decals(&self) -> Vec>; + fn find_pip_decal_by_loc_from_to( + &self, + location: &PipLocation, + from: &Pip, + to: &Pip, + ) -> Option>; +} diff --git a/lib/src/chipdb/ecp5-impl.chipdb.ts b/lib/src/chipdb/ecp5-impl.chipdb.ts deleted file mode 100644 index 2f3444a..0000000 --- a/lib/src/chipdb/ecp5-impl.chipdb.ts +++ /dev/null @@ -1,750 +0,0 @@ -import { - BelInfoPOD, - BelPortPOD, - BelWirePOD, - CellPropDelayPOD, - CellSetupHoldPOD, - CellTimingPOD, - ChipInfoPOD, - GlobalInfoPOD, - LocationPOD, - LocationTypePOD, - PIOInfoPOD, - PackageInfoPOD, - PackagePinPOD, - PipDelayPOD, - PipInfoPOD, - PipLocatorPOD, - SpeedGradePOD, - TileInfoPOD, - TileNamePOD, - WireInfoPOD -} from './ecp5.chipdb'; -import {RelInt32Arr, RelSlice, RelString, RelStringArr} from './relslice'; - -export class LocationPODImpl implements LocationPOD { - private _x: number; - private _y: number; - - constructor(private _dataview: DataView) { - this._x = this._dataview.getInt16(0, true); - this._y = this._dataview.getInt16(2, true); - } - - public get x(): number { - return this._x; - } - - public get y(): number { - return this._y; - } -} - -export class BelWirePODImpl implements BelWirePOD { - public static readonly PODSize = 16; - - private _rel_wire_loc: LocationPOD; - private _wire_index: number; - private _port: number; - private _type: number; - - constructor(private _dataview: DataView) { - this._rel_wire_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._wire_index = this._dataview.getInt32(4, true); - this._port = this._dataview.getInt32(8, true); - this._type = this._dataview.getInt32(12, true); - } - - public get rel_wire_loc(): LocationPOD { - return this._rel_wire_loc; - } - - public get wire_index(): number { - return this._wire_index; - } - - public get port(): number { - return this._port; - } - - public get type(): number { - return this._type; - } -} - -export class BelInfoPODImpl implements BelInfoPOD { - public static readonly PODSize = 20; - - private _name: string; - private _type: number; - private _z: number; - private _bel_wires: Array; - - constructor(private _dataview: DataView) { - this._name = RelString.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._type = this._dataview.getInt32(4, true); - this._z = this._dataview.getInt32(8, true); - const rs = new RelSlice(BelWirePODImpl); - this._bel_wires = rs.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 12)); - } - - public get name(): string { - return this._name; - } - - public get type(): number { - return this._type; - } - - public get z(): number { - return this._z; - } - - public get bel_wires(): Array { - return this._bel_wires; - } -} - -export class BelPortPODImpl implements BelPortPOD { - public static readonly PODSize = 12; - - private _rel_bel_loc: LocationPOD; - private _bel_index: number; - private _port: number; - - constructor(private _dataview: DataView) { - this._rel_bel_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._bel_index = this._dataview.getInt32(4, true); - this._port = this._dataview.getInt32(8, true); - } - - public get rel_bel_loc(): LocationPOD { - return this._rel_bel_loc; - } - - public get bel_index(): number { - return this._bel_index; - } - - public get port(): number { - return this._port; - } -} - -export class PipInfoPODImpl implements PipInfoPOD { - public static readonly PODSize = 20; - - private _rel_src_loc: LocationPOD; - private _rel_dst_loc: LocationPOD; - private _src_idx: number; - private _dst_idx: number; - private _timing_class: number; - private _tile_type: number; - private _pip_type: number; - private _lutperm_flags: number; - private _padding: number; - - constructor(private _dataview: DataView) { - this._rel_src_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._rel_dst_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 4)); - this._src_idx = this._dataview.getInt16(8, true); - this._dst_idx = this._dataview.getInt16(10, true); - this._timing_class = this._dataview.getInt16(12, true); - this._tile_type = this._dataview.getInt8(14); - this._pip_type = this._dataview.getInt8(15); - this._lutperm_flags = this._dataview.getInt16(16); - this._padding = this._dataview.getInt16(18); - } - - public get rel_src_loc(): LocationPOD { - return this._rel_src_loc; - } - - public get rel_dst_loc(): LocationPOD { - return this._rel_dst_loc; - } - - public get src_idx(): number { - return this._src_idx; - } - - public get dst_idx(): number { - return this._dst_idx; - } - - public get timing_class(): number { - return this._timing_class; - } - - public get tile_type(): number { - return this._tile_type; - } - - public get pip_type(): number { - return this._pip_type; - } - - public get lutperm_flags(): number { - return this._lutperm_flags; - } - - public get padding(): number { - return this._padding; - } -} - -export class PipLocatorPODImpl implements PipLocatorPOD { - public static readonly PODSize = 8; - - private _rel_loc: LocationPOD; - private _index: number; - - constructor(private _dataview: DataView) { - this._rel_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._index = this._dataview.getInt32(4, true); - } - - public get rel_loc(): LocationPOD { - return this._rel_loc; - } - - public get index(): number { - return this._index; - } -} - -export class WireInfoPODImpl implements WireInfoPOD { - public static readonly PODSize = 32; - - private _name: string; - private _type: number; - private _tile_wire: number; - private _pips_uphill?: Array = undefined; - private _pips_downhill?: Array = undefined; - private _bel_pins: Array; - - constructor(private _dataview: DataView) { - this._name = RelString.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._type = this._dataview.getInt16(4, true); - this._tile_wire = this._dataview.getInt16(6, true); - - /* - * These are lazily evaluated in the getter for performance reasons - * - const rsPip = new RelSlice(PipLocatorPODImpl); - - this._pips_uphill = rsPip.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 8)); - this._pips_downhill = rsPip.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 16)); - */ - - const rsBel = new RelSlice(BelPortPODImpl); - - this._bel_pins = rsBel.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 24)); - } - - public get name(): string { - return this._name; - } - - public get type(): number { - return this._type; - } - - public get tile_wire(): number { - return this._tile_wire; - } - - public get pips_uphill(): Array { - if (this._pips_uphill == undefined) { - const rsPip = new RelSlice(PipLocatorPODImpl); - - this._pips_uphill = rsPip.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 8)); - } - return this._pips_uphill; - } - - public get pips_downhill(): Array { - if (this._pips_downhill == undefined) { - const rsPip = new RelSlice(PipLocatorPODImpl); - - this._pips_downhill = rsPip.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 16) - ); - } - return this._pips_downhill; - } - - public get bel_pins(): Array { - return this._bel_pins; - } -} - -export class LocationTypePODImpl implements LocationTypePOD { - public static readonly PODSize = 24; - - private _bel_data: Array; - private _wire_data: Array; - private _pip_data: Array; - - constructor(private _dataview: DataView) { - const rsBel = new RelSlice(BelInfoPODImpl); - - this._bel_data = rsBel.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - - const rsWire = new RelSlice(WireInfoPODImpl); - - this._wire_data = rsWire.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 8)); - - const rsPip = new RelSlice(PipInfoPODImpl); - - this._pip_data = rsPip.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 16)); - } - - public get bel_data(): Array { - return this._bel_data; - } - - public get wire_data(): Array { - return this._wire_data; - } - - public get pip_data(): Array { - return this._pip_data; - } -} - -export class PIOInfoPODImpl implements PIOInfoPOD { - public static readonly PODSize = 16; - - private _abs_loc: LocationPOD; - private _bel_index: number; - private _function_name: string; - private _bank: number; - private _dqsgroup: number; - - constructor(private _dataview: DataView) { - this._abs_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._bel_index = this._dataview.getInt32(4, true); - this._function_name = RelString.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 8) - ); - this._bank = this._dataview.getInt16(12, true); - this._dqsgroup = this._dataview.getInt16(14, true); - } - - public get abs_loc(): LocationPOD { - return this._abs_loc; - } - - public get bel_index(): number { - return this._bel_index; - } - - public get function_name(): string { - return this._function_name; - } - - public get bank(): number { - return this._bank; - } - - public get dqsgroup(): number { - return this._dqsgroup; - } -} - -export class PackagePinPODImpl implements PackagePinPOD { - public static readonly PODSize = 12; - - private _name: string; - private _abs_loc: LocationPOD; - private _bel_index: number; - - constructor(private _dataview: DataView) { - this._name = RelString.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._abs_loc = new LocationPODImpl(new DataView(this._dataview.buffer, this._dataview.byteOffset + 4)); - this._bel_index = this._dataview.getInt32(8, true); - } - - public get name(): string { - return this._name; - } - - public get abs_loc(): LocationPOD { - return this._abs_loc; - } - - public get bel_index(): number { - return this._bel_index; - } -} - -export class PackageInfoPODImpl implements PackageInfoPOD { - public static readonly PODSize = 12; - - private _name: string; - private _pin_data: Array; - - constructor(private _dataview: DataView) { - this._name = RelString.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - - const rs = new RelSlice(PackagePinPODImpl); - this._pin_data = rs.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 4)); - } - - public get name(): string { - return this._name; - } - - public get pin_data(): Array { - return this._pin_data; - } -} - -export class TileNamePODImpl implements TileNamePOD { - public static readonly PODSize = 8; - - private _name: string; - private _type_idx: number; - private _padding: number; - - constructor(private _dataview: DataView) { - this._name = RelString.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - this._type_idx = this._dataview.getInt16(4, true); - this._padding = this._dataview.getInt16(6, true); - } - - public get name(): string { - return this._name; - } - - public get type_idx(): number { - return this._type_idx; - } - - public get padding(): number { - return this._padding; - } -} - -export class TileInfoPODImpl implements TileInfoPOD { - public static readonly PODSize = 8; - - private _tile_names: Array; - - constructor(private _dataview: DataView) { - const rs = new RelSlice(TileNamePODImpl); - this._tile_names = rs.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 0)); - } - - public get tile_names(): Array { - return this._tile_names; - } -} - -export class GlobalInfoPODImpl implements GlobalInfoPOD { - public static readonly PODSize = 8; - - private _tap_col: number; - private _tap_dir: number; - private _quad: number; - private _spine_row: number; - private _spine_col: number; - - constructor(private _dataview: DataView) { - this._tap_col = this._dataview.getInt16(0, true); - this._tap_dir = this._dataview.getInt8(2); - this._quad = this._dataview.getInt8(3); - this._spine_row = this._dataview.getInt16(4, true); - this._spine_col = this._dataview.getInt16(6, true); - } - - public get tap_col(): number { - return this._tap_col; - } - - public get tap_dir(): number { - return this._tap_dir; - } - - public get quad(): number { - return this._quad; - } - - public get spine_row(): number { - return this._spine_row; - } - - public get spine_col(): number { - return this._spine_col; - } -} - -export class CellPropDelayPODImpl implements CellPropDelayPOD { - public static readonly PODSize = 16; - - private _from_port: number; - private _to_port: number; - private _min_delay: number; - private _max_delay: number; - - constructor(private _dataview: DataView) { - this._from_port = this._dataview.getInt32(0, true); - this._to_port = this._dataview.getInt32(4, true); - this._min_delay = this._dataview.getInt32(8, true); - this._max_delay = this._dataview.getInt32(12, true); - } - - public get from_port(): number { - return this._from_port; - } - - public get to_port(): number { - return this._to_port; - } - - public get min_delay(): number { - return this._min_delay; - } - - public get max_delay(): number { - return this._max_delay; - } -} - -export class CellSetupHoldPODImpl implements CellSetupHoldPOD { - public static readonly PODSize = 24; - - private _sig_port: number; - private _clock_port: number; - private _min_setup: number; - private _max_setup: number; - private _min_hold: number; - private _max_hold: number; - - constructor(private _dataview: DataView) { - this._sig_port = this._dataview.getInt32(0, true); - this._clock_port = this._dataview.getInt32(4, true); - this._min_setup = this._dataview.getInt32(8, true); - this._max_setup = this._dataview.getInt32(12, true); - this._min_hold = this._dataview.getInt32(16, true); - this._max_hold = this._dataview.getInt32(20, true); - } - - public get sig_port(): number { - return this._sig_port; - } - - public get clock_port(): number { - return this._clock_port; - } - - public get min_setup(): number { - return this._min_setup; - } - - public get max_setup(): number { - return this._max_setup; - } - - public get min_hold(): number { - return this._min_hold; - } - - public get max_hold(): number { - return this._max_hold; - } -} - -export class CellTimingPODImpl implements CellTimingPOD { - public static readonly PODSize = 20; - - private _cell_type: number; - private _prop_delays: Array; - private _setup_holds: Array; - - constructor(private _dataview: DataView) { - this._cell_type = this._dataview.getInt32(0, true); - - const rsPropDelay = new RelSlice(CellPropDelayPODImpl); - this._prop_delays = rsPropDelay.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 4) - ); - - const rsSetupHold = new RelSlice(CellSetupHoldPODImpl); - this._setup_holds = rsSetupHold.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 12) - ); - } - - public get cell_type(): number { - return this._cell_type; - } - - public get prop_delays(): Array { - return this._prop_delays; - } - - public get setup_holds(): Array { - return this._setup_holds; - } -} - -export class PipDelayPODImpl implements PipDelayPOD { - public static readonly PODSize = 16; - - private _min_base_delay: number; - private _max_base_delay: number; - private _min_fanout_adder: number; - private _max_fanout_adder: number; - - constructor(private _dataview: DataView) { - this._min_base_delay = this._dataview.getInt32(0, true); - this._max_base_delay = this._dataview.getInt32(4, true); - this._min_fanout_adder = this._dataview.getInt32(8, true); - this._max_fanout_adder = this._dataview.getInt32(12, true); - } - - public get min_base_delay(): number { - return this._min_base_delay; - } - - public get max_base_delay(): number { - return this._max_base_delay; - } - - public get min_fanout_adder(): number { - return this._min_fanout_adder; - } - - public get max_fanout_adder(): number { - return this._max_fanout_adder; - } -} - -export class SpeedGradePODImpl implements SpeedGradePOD { - public static readonly PODSize = 16; - - private _cell_timings: Array; - private _pip_classes: Array; - - constructor(private _dataview: DataView) { - const rsCellTiming = new RelSlice(CellTimingPODImpl); - this._cell_timings = rsCellTiming.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 0) - ); - - const rsPipClass = new RelSlice(PipDelayPODImpl); - this._pip_classes = rsPipClass.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 8)); - } - - public get cell_timings(): Array { - return this._cell_timings; - } - - public get pip_classes(): Array { - return this._pip_classes; - } -} - -export class ChipInfoPODImpl implements ChipInfoPOD { - private _width: number; - private _height: number; - private _num_tiles: number; - private _const_id_count: number; - private _locations: Array; - private _location_type: Array; - private _location_glbinfo: Array; - private _tiletype_names: Array; - private _package_info: Array; - private _pio_info: Array; - private _tile_info: Array; - private _speed_grades: Array; - - constructor(private _dataview: DataView) { - this._width = this._dataview.getInt32(0, true); - this._height = this._dataview.getInt32(4, true); - this._num_tiles = this._dataview.getInt32(8, true); - this._const_id_count = this._dataview.getInt32(12, true); - - const rsLocType = new RelSlice(LocationTypePODImpl); - this._locations = rsLocType.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 16)); - - this._location_type = RelInt32Arr.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 24) - ); - - const rsGlobalInfo = new RelSlice(GlobalInfoPODImpl); - this._location_glbinfo = rsGlobalInfo.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 32) - ); - - this._tiletype_names = RelStringArr.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 40) - ); - - const rsPackageInfo = new RelSlice(PackageInfoPODImpl); - this._package_info = rsPackageInfo.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 48) - ); - - const rsPIOInfo = new RelSlice(PIOInfoPODImpl); - this._pio_info = rsPIOInfo.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 56)); - - const rsTileInfo = new RelSlice(TileInfoPODImpl); - this._tile_info = rsTileInfo.fromDataView(new DataView(this._dataview.buffer, this._dataview.byteOffset + 64)); - - const rsSpeedGrade = new RelSlice(SpeedGradePODImpl); - this._speed_grades = rsSpeedGrade.fromDataView( - new DataView(this._dataview.buffer, this._dataview.byteOffset + 72) - ); - } - - public get width(): number { - return this._width; - } - - public get height(): number { - return this._height; - } - - public get num_tiles(): number { - return this._num_tiles; - } - - public get const_id_count(): number { - return this._const_id_count; - } - - public get locations(): Array { - return this._locations; - } - - public get location_type(): Array { - return this._location_type; - } - - public get location_glbinfo(): Array { - return this._location_glbinfo; - } - - public get tiletype_names(): Array { - return this._tiletype_names; - } - - public get package_info(): Array { - return this._package_info; - } - - public get pio_info(): Array { - return this._pio_info; - } - - public get tile_info(): Array { - return this._tile_info; - } - - public get speed_grades(): Array { - return this._speed_grades; - } -} diff --git a/lib/src/chipdb/ecp5.chipdb.ts b/lib/src/chipdb/ecp5.chipdb.ts deleted file mode 100644 index 4625bde..0000000 --- a/lib/src/chipdb/ecp5.chipdb.ts +++ /dev/null @@ -1,142 +0,0 @@ -export interface LocationPOD { - x: number; - y: number; -} - -export interface BelWirePOD { - rel_wire_loc: LocationPOD; - wire_index: number; - port: number; - type: number; -} - -export interface BelInfoPOD { - name: string; - type: number; - z: number; - bel_wires: Array; -} - -export interface BelPortPOD { - rel_bel_loc: LocationPOD; - bel_index: number; - port: number; -} - -export interface PipInfoPOD { - rel_src_loc: LocationPOD; - rel_dst_loc: LocationPOD; - src_idx: number; - dst_idx: number; - timing_class: number; - tile_type: number; - pip_type: number; - lutperm_flags: number; - padding: number; -} - -export interface PipLocatorPOD { - rel_loc: LocationPOD; - index: number; -} - -export interface WireInfoPOD { - name: string; - type: number; - tile_wire: number; - pips_uphill: Array; - pips_downhill: Array; - bel_pins: Array; -} - -export interface LocationTypePOD { - bel_data: Array; - wire_data: Array; - pip_data: Array; -} - -export interface PIOInfoPOD { - abs_loc: LocationPOD; - bel_index: number; - function_name: string; - bank: number; - dqsgroup: number; -} - -export interface PackagePinPOD { - name: string; - abs_loc: LocationPOD; - bel_index: number; -} - -export interface PackageInfoPOD { - name: string; - pin_data: Array; -} - -export interface TileNamePOD { - name: string; - type_idx: number; - padding: number; -} - -export interface TileInfoPOD { - tile_names: Array; -} - -export interface GlobalInfoPOD { - tap_col: number; - tap_dir: number; - quad: number; - spine_row: number; - spine_col: number; -} - -export interface CellPropDelayPOD { - from_port: number; - to_port: number; - min_delay: number; - max_delay: number; -} - -export interface CellSetupHoldPOD { - sig_port: number; - clock_port: number; - min_setup: number; - max_setup: number; - min_hold: number; - max_hold: number; -} - -export interface CellTimingPOD { - cell_type: number; - prop_delays: Array; - setup_holds: Array; -} - -export interface PipDelayPOD { - min_base_delay: number; - max_base_delay: number; - min_fanout_adder: number; - max_fanout_adder: number; -} - -export interface SpeedGradePOD { - cell_timings: Array; - pip_classes: Array; -} - -export interface ChipInfoPOD { - width: number; - height: number; - num_tiles: number; - const_id_count: number; - locations: Array; - location_type: Array; - location_glbinfo: Array; - tiletype_names: Array; - package_info: Array; - pio_info: Array; - tile_info: Array; - speed_grades: Array; -} diff --git a/lib/src/chipdb/ecp5/impl.rs b/lib/src/chipdb/ecp5/impl.rs new file mode 100644 index 0000000..2e25a5f --- /dev/null +++ b/lib/src/chipdb/ecp5/impl.rs @@ -0,0 +1,289 @@ +use std::{convert::TryFrom, io::Cursor}; + +use crate::chipdb::reltypes::{ + read_reli32arr, read_relslice, read_relstring, read_relstringarr, ByteArray, POD, +}; +use crate::gfx::ecp5::GfxTileWireId; +use crate::gfx::ConstId; + +use super::types::{ + BelInfoPOD, BelPortPOD, BelWirePOD, CellPropDelayPOD, CellSetupHoldPOD, CellTimingPOD, + ChipInfoPOD, GlobalInfoPOD, LocationPOD, LocationTypePOD, PIOInfoPOD, PackageInfoPOD, + PackagePinPOD, PipDelayPOD, PipInfoPOD, PipLocatorPOD, SpeedGradePOD, TileInfoPOD, TileNamePOD, + WireInfoPOD, +}; + +use anyhow::Result; +use byteorder::{BigEndian, LittleEndian, ReadBytesExt}; + +pub fn get_chipdb(chipdata: &[u8]) -> Result { + let mut cur = Cursor::new(chipdata); + + let offset = cur.read_u32::()?; + cur.set_position(offset as u64); + + return ChipInfoPOD::new(&mut cur); +} + +impl POD for LocationPOD { + // Size: 8 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + x: cur.read_i16::()?, + y: cur.read_i16::()?, + }) + } +} + +impl POD for BelWirePOD { + // Size: 16 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + rel_wire_loc: LocationPOD::new(cur)?, + wire_index: cur.read_i32::()?, + port: cur.read_i32::()?, + r#type: cur.read_i32::()?, + }) + } +} + +impl POD for BelInfoPOD { + // Size: 20 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + name: read_relstring(cur)?, + r#type: ConstId::try_from(cur.read_u32::()?)?, + z: cur.read_i32::()?, + bel_wires: read_relslice::(cur)?, + }) + } +} + +impl POD for BelPortPOD { + // Size: 12 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + rel_bel_loc: LocationPOD::new(cur)?, + bel_index: cur.read_i32::()?, + port: cur.read_i32::()?, + }) + } +} + +impl POD for PipInfoPOD { + // Size: 20 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + rel_src_loc: LocationPOD::new(cur)?, + rel_dst_loc: LocationPOD::new(cur)?, + src_idx: cur.read_i16::()?, + dst_idx: cur.read_i16::()?, + timing_class: cur.read_i16::()?, + tile_type: cur.read_i8()?, + pip_type: cur.read_i8()?, + lutperm_flags: cur.read_i16::()?, + padding: cur.read_i16::()?, + }) + } +} + +impl POD for PipLocatorPOD { + // Size: 8 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + rel_loc: LocationPOD::new(cur)?, + index: cur.read_i32::()?, + }) + } +} + +impl POD for WireInfoPOD { + // Size: 32 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + name: read_relstring(cur)?, + r#type: ConstId::try_from(cur.read_i16::()? as u32)?, + tile_wire: GfxTileWireId::try_from(cur.read_i16::()? as u32)?, + pips_uphill: read_relslice::(cur)?, + pips_downhill: read_relslice::(cur)?, + bel_pins: read_relslice::(cur)?, + }) + } +} + +impl POD for LocationTypePOD { + // Size: 24 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + bel_data: read_relslice::(cur)?, + wire_data: read_relslice::(cur)?, + pip_data: read_relslice::(cur)?, + }) + } +} + +impl POD for PIOInfoPOD { + // size: 16 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + abs_loc: LocationPOD::new(cur)?, + bel_index: cur.read_i32::()?, + function_name: read_relstring(cur)?, + bank: cur.read_i16::()?, + dqsgroup: cur.read_i16::()?, + }) + } +} + +impl POD for PackagePinPOD { + // Size: 12 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + name: read_relstring(cur)?, + abs_loc: LocationPOD::new(cur)?, + bel_index: cur.read_i32::()?, + }) + } +} + +impl POD for PackageInfoPOD { + // Size: 12 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + name: read_relstring(cur)?, + pin_data: read_relslice::(cur)?, + }) + } +} + +impl POD for TileNamePOD { + // Size: 8 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + name: read_relstring(cur)?, + type_idx: cur.read_i16::()?, + padding: cur.read_i16::()?, + }) + } +} + +impl POD for TileInfoPOD { + // Size: 8 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + tile_names: read_relslice::(cur)?, + }) + } +} + +impl POD for GlobalInfoPOD { + // Size: 8 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + tap_col: cur.read_i16::()?, + tap_dir: cur.read_i8()?, + quad: cur.read_i8()?, + spine_row: cur.read_i16::()?, + spine_col: cur.read_i16::()?, + }) + } +} + +impl POD for CellPropDelayPOD { + // Size: 16 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + from_port: cur.read_i32::()?, + to_port: cur.read_i32::()?, + min_delay: cur.read_i32::()?, + max_delay: cur.read_i32::()?, + }) + } +} + +impl POD for CellSetupHoldPOD { + // Size: 24 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + sig_port: cur.read_i32::()?, + clock_port: cur.read_i32::()?, + min_setup: cur.read_i32::()?, + max_setup: cur.read_i32::()?, + min_hold: cur.read_i32::()?, + max_hold: cur.read_i32::()?, + }) + } +} + +impl POD for CellTimingPOD { + // Size: 20 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + cell_type: cur.read_i32::()?, + prop_delays: read_relslice::(cur)?, + setup_holds: read_relslice::(cur)?, + }) + } +} + +impl POD for PipDelayPOD { + // Size: 16 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + min_base_delay: cur.read_i32::()?, + max_base_delay: cur.read_i32::()?, + min_fanout_adder: cur.read_i32::()?, + max_fanout_adder: cur.read_i32::()?, + }) + } +} + +impl POD for SpeedGradePOD { + // Size: 16 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + cell_timings: read_relslice::(cur)?, + pip_classes: read_relslice::(cur)?, + }) + } +} + +impl POD for ChipInfoPOD { + // Size: 80 + + fn new(cur: &mut Cursor) -> Result { + Ok(Self { + width: cur.read_i32::()?, + height: cur.read_i32::()?, + num_tiles: cur.read_i32::()?, + const_id_count: cur.read_i32::()?, + locations: read_relslice::(cur)?, + location_type: read_reli32arr(cur)?, + location_glbinfo: read_relslice::(cur)?, + tiletype_names: read_relstringarr(cur)?, + package_info: read_relslice::(cur)?, + pio_info: read_relslice::(cur)?, + tile_info: read_relslice::(cur)?, + speed_grades: read_relslice::(cur)?, + }) + } +} diff --git a/lib/src/chipdb/ecp5/mod.rs b/lib/src/chipdb/ecp5/mod.rs new file mode 100644 index 0000000..3824709 --- /dev/null +++ b/lib/src/chipdb/ecp5/mod.rs @@ -0,0 +1,5 @@ +mod r#impl; +mod types; + +pub use r#impl::get_chipdb; +pub use types::ChipInfoPOD; diff --git a/lib/src/chipdb/ecp5/types.rs b/lib/src/chipdb/ecp5/types.rs new file mode 100644 index 0000000..e268a52 --- /dev/null +++ b/lib/src/chipdb/ecp5/types.rs @@ -0,0 +1,146 @@ +#![allow(dead_code)] + +use crate::gfx; + +pub struct LocationPOD { + pub x: i16, + pub y: i16, +} + +pub struct BelWirePOD { + pub rel_wire_loc: LocationPOD, + pub wire_index: i32, + pub port: i32, + pub r#type: i32, +} + +pub struct BelInfoPOD { + pub name: String, + pub r#type: gfx::ConstId, + pub z: i32, + pub bel_wires: Vec, +} + +pub struct BelPortPOD { + pub rel_bel_loc: LocationPOD, + pub bel_index: i32, + pub port: i32, +} + +pub struct PipInfoPOD { + pub rel_src_loc: LocationPOD, + pub rel_dst_loc: LocationPOD, + pub src_idx: i16, + pub dst_idx: i16, + pub timing_class: i16, + pub tile_type: i8, + pub pip_type: i8, + pub lutperm_flags: i16, + pub padding: i16, +} + +pub struct PipLocatorPOD { + pub rel_loc: LocationPOD, + pub index: i32, +} + +pub struct WireInfoPOD { + pub name: String, + pub r#type: gfx::ConstId, + pub tile_wire: gfx::ecp5::GfxTileWireId, + pub pips_uphill: Vec, + pub pips_downhill: Vec, + pub bel_pins: Vec, +} + +pub struct LocationTypePOD { + pub bel_data: Vec, + pub wire_data: Vec, + pub pip_data: Vec, +} + +pub struct PIOInfoPOD { + pub abs_loc: LocationPOD, + pub bel_index: i32, + pub function_name: String, + pub bank: i16, + pub dqsgroup: i16, +} + +pub struct PackagePinPOD { + pub name: String, + pub abs_loc: LocationPOD, + pub bel_index: i32, +} + +pub struct PackageInfoPOD { + pub name: String, + pub pin_data: Vec, +} + +pub struct TileNamePOD { + pub name: String, + pub type_idx: i16, + pub padding: i16, +} + +pub struct TileInfoPOD { + pub tile_names: Vec, +} + +pub struct GlobalInfoPOD { + pub tap_col: i16, + pub tap_dir: i8, + pub quad: i8, + pub spine_row: i16, + pub spine_col: i16, +} + +pub struct CellPropDelayPOD { + pub from_port: i32, + pub to_port: i32, + pub min_delay: i32, + pub max_delay: i32, +} + +pub struct CellSetupHoldPOD { + pub sig_port: i32, + pub clock_port: i32, + pub min_setup: i32, + pub max_setup: i32, + pub min_hold: i32, + pub max_hold: i32, +} + +pub struct CellTimingPOD { + pub cell_type: i32, + pub prop_delays: Vec, + pub setup_holds: Vec, +} + +pub struct PipDelayPOD { + pub min_base_delay: i32, + pub max_base_delay: i32, + pub min_fanout_adder: i32, + pub max_fanout_adder: i32, +} + +pub struct SpeedGradePOD { + pub cell_timings: Vec, + pub pip_classes: Vec, +} + +pub struct ChipInfoPOD { + pub width: i32, + pub height: i32, + pub num_tiles: i32, + pub const_id_count: i32, + pub locations: Vec, + pub location_type: Vec, + pub location_glbinfo: Vec, + pub tiletype_names: Vec, + pub package_info: Vec, + pub pio_info: Vec, + pub tile_info: Vec, + pub speed_grades: Vec, +} diff --git a/lib/src/chipdb/mod.rs b/lib/src/chipdb/mod.rs new file mode 100644 index 0000000..718950c --- /dev/null +++ b/lib/src/chipdb/mod.rs @@ -0,0 +1,2 @@ +pub mod ecp5; +mod reltypes; diff --git a/lib/src/chipdb/relslice.ts b/lib/src/chipdb/relslice.ts deleted file mode 100644 index 70a1bdc..0000000 --- a/lib/src/chipdb/relslice.ts +++ /dev/null @@ -1,70 +0,0 @@ -export class RelString { - static fromDataView(dataview: DataView): string { - const off = dataview.getInt32(0, true); - - if (dataview.byteOffset + off === -1) return ''; - - dataview = new DataView(dataview.buffer, dataview.byteOffset + off); - - let cur = 0; - let ret_str = ''; - let c; - while ((c = dataview.getUint8(cur)) != 0) { - ret_str += String.fromCharCode(c); - cur++; - } - - return ret_str; - } -} - -export class RelStringArr { - static fromDataView(dataview: DataView): Array { - const off = dataview.getInt32(0, true); - const len = dataview.getInt32(4, true); - - const range = (n: number) => [...Array(n).keys()]; - - return range(len).map((i) => - RelString.fromDataView(new DataView(dataview.buffer, dataview.byteOffset + off + i * 4)) - ); - } -} - -export class RelInt32Arr { - static fromDataView(dataview: DataView): Array { - const off = dataview.getInt32(0, true); - const len = dataview.getInt32(4, true); - - const range = (n: number) => [...Array(n).keys()]; - const dv = new DataView(dataview.buffer, dataview.byteOffset + off); - - return range(len).map((i) => dv.getInt32(i * 4, true)); - } -} - -export class RelPtr { - constructor(private _factory: {new (dataview: DataView): T}) {} - - fromDataView(dataview: DataView): T { - const off = dataview.getInt32(0, true); - - return new this._factory(new DataView(dataview.buffer, dataview.byteOffset + off)); - } -} - -export class RelSlice { - constructor(private _factory: {new (dataview: DataView): T; PODSize: number}) {} - - fromDataView(dataview: DataView): Array { - const off = dataview.getInt32(0, true); - const len = dataview.getInt32(4, true); - - const range = (n: number) => [...Array(n).keys()]; - - return range(len).map( - (i) => - new this._factory(new DataView(dataview.buffer, dataview.byteOffset + off + i * this._factory.PODSize)) - ); - } -} diff --git a/lib/src/chipdb/reltypes.rs b/lib/src/chipdb/reltypes.rs new file mode 100644 index 0000000..38eb2de --- /dev/null +++ b/lib/src/chipdb/reltypes.rs @@ -0,0 +1,88 @@ +use std::io::{Cursor, Result as StdResult, Seek}; + +use anyhow::{Ok, Result}; +use byteorder::{LittleEndian, ReadBytesExt}; + +pub type ByteArray<'a> = &'a [u8]; + +pub trait POD { + fn new(cur: &mut Cursor) -> Result + where + Self: Sized; +} + +fn seek_and_read( + cur: &mut Cursor, + relpos: i32, + func: impl Fn(&mut Cursor) -> Result, +) -> Result { + // Seek to pos + let old_pos = cur.position(); + + cur.seek_relative(relpos as i64)?; + + let res = func(cur); + + // Seek back to original position + cur.set_position(old_pos); + + return res; +} + +fn read_relarr( + cur: &mut Cursor, + func: impl Fn(&mut Cursor) -> Result, +) -> Result> { + // 8-byte header + let offset = cur.read_i32::()?; + let len = cur.read_i32::()?; + + if len == 0 { + return Ok(vec![]); + }; + + let res = seek_and_read(cur, offset - 8, |c| { + let mut res = Vec::with_capacity(len.try_into().unwrap()); + for _ in 0..len { + res.push(func(c)?); + } + return Ok::>(res); + })?; + return Ok(res); +} + +pub fn read_relstring(cur: &mut Cursor) -> Result { + // 4-byte header + let offset = cur.read_i32::()?; + + if offset - 4 + (cur.position() as i32) == -1 { + return Ok(String::new()); + } + + let res = seek_and_read(cur, offset - 4, |c| { + let mut res = String::new(); + while let StdResult::Ok(chr) = c.read_u8() { + if chr == 0 { + break; + } + + res.push(chr as char); + } + + return Ok::(res); + })?; + + return Ok(res); +} + +pub fn read_relslice(cur: &mut Cursor) -> Result> { + return read_relarr(cur, |c| T::new(c)); +} + +pub fn read_relstringarr(cur: &mut Cursor) -> Result> { + return read_relarr(cur, |c: &mut Cursor| read_relstring(c)); +} + +pub fn read_reli32arr(cur: &mut Cursor) -> Result> { + return read_relarr(cur, |c| Ok(c.read_i32::()?)); +} diff --git a/lib/src/decal/decal.ts b/lib/src/decal/decal.ts deleted file mode 100644 index 6b458df..0000000 --- a/lib/src/decal/decal.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class DecalXY { - constructor( - public decal: DecalID, - public x: number, - public y: number, - public id: string - ) {} -} diff --git a/lib/src/decal/ecp5.decalid.ts b/lib/src/decal/ecp5.decalid.ts deleted file mode 100644 index e7a3ac5..0000000 --- a/lib/src/decal/ecp5.decalid.ts +++ /dev/null @@ -1,19 +0,0 @@ -export enum ECP5DecalType { - TYPE_NONE, - TYPE_BEL, - TYPE_WIRE, - TYPE_PIP, - TYPE_GROUP -} - -export class ECP5DecalID { - constructor( - public type: ECP5DecalType, - public location: {x: number; y: number}, - public z: number - ) {} - - public static instance(): ECP5DecalID { - return new ECP5DecalID(ECP5DecalType.TYPE_NONE, {x: 0, y: 0}, 0); - } -} diff --git a/lib/src/decal/ecp5.rs b/lib/src/decal/ecp5.rs new file mode 100644 index 0000000..c239677 --- /dev/null +++ b/lib/src/decal/ecp5.rs @@ -0,0 +1,40 @@ +#[allow(non_camel_case_types)] +#[derive(PartialEq)] +pub enum ECP5DecalType { + TYPE_NONE, + TYPE_BEL, + TYPE_WIRE, + TYPE_PIP, + TYPE_GROUP, +} + +pub struct ECP5DecalLocation { + pub x: f64, + pub y: f64, +} + +pub struct ECP5DecalID { + pub r#type: ECP5DecalType, + pub location: ECP5DecalLocation, + pub z: f64, +} + +impl Default for ECP5DecalID { + fn default() -> Self { + ECP5DecalID { + r#type: ECP5DecalType::TYPE_NONE, + location: ECP5DecalLocation { x: 0.0, y: 0.0 }, + z: 0.0, + } + } +} + +impl ECP5DecalID { + pub fn new(r#type: ECP5DecalType, x: f64, y: f64, z: f64) -> Self { + ECP5DecalID { + r#type, + location: ECP5DecalLocation { x, y }, + z, + } + } +} diff --git a/lib/src/decal/mod.rs b/lib/src/decal/mod.rs new file mode 100644 index 0000000..ce3b58c --- /dev/null +++ b/lib/src/decal/mod.rs @@ -0,0 +1,16 @@ +mod ecp5; + +pub struct DecalXY { + pub decal: DecalID, + pub x: f64, + pub y: f64, + pub id: String, +} + +impl DecalXY { + pub fn new(decal: DecalID, x: f64, y: f64, id: String) -> Self { + Self { decal, x, y, id } + } +} + +pub use ecp5::{ECP5DecalID, ECP5DecalType}; diff --git a/lib/src/gfx/ecp5.constincs.ts b/lib/src/gfx/constids.rs similarity index 98% rename from lib/src/gfx/ecp5.constincs.ts rename to lib/src/gfx/constids.rs index c02cbc6..d9a7cc8 100644 --- a/lib/src/gfx/ecp5.constincs.ts +++ b/lib/src/gfx/constids.rs @@ -1,4 +1,25 @@ -export enum ConstIncs { +#![allow(dead_code, non_camel_case_types)] + +use std::convert::TryFrom; + +use anyhow::{Error, Result}; +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; + +impl TryFrom for ConstId { + type Error = Error; + + fn try_from(val: u32) -> Result { + return match FromPrimitive::from_u32(val) { + Some(res) => Ok(res), + None => Err(Error::msg("Could not derive ConstId from value")), + }; + } +} + +#[derive(PartialEq, FromPrimitive)] +#[repr(u32)] +pub enum ConstId { A0 = 1, B0, C0, @@ -1843,5 +1864,5 @@ export enum ConstIncs { WD, OFX, F, - CCU2_INJECT1 + CCU2_INJECT1, } diff --git a/lib/src/gfx/ecp5.gfx.constants.ts b/lib/src/gfx/ecp5.gfx.constants.ts deleted file mode 100644 index 6483ffb..0000000 --- a/lib/src/gfx/ecp5.gfx.constants.ts +++ /dev/null @@ -1,39 +0,0 @@ -export const switchbox_x1 = 0.51; -export const switchbox_x2 = 0.9; -export const switchbox_y1 = 0.51; -export const switchbox_y2 = 0.9; - -export const dll_cell_x1 = 0.2; -export const dll_cell_x2 = 0.8; -export const dll_cell_y1 = 0.2; -export const dll_cell_y2 = 0.8; - -export const io_cell_v_x1 = 0.76; -export const io_cell_v_x2 = 0.95; -export const io_cell_v_y1 = 0.05; -export const io_cell_gap = 0.1; -export const io_cell_h_x1 = 0.05; -export const io_cell_h_y1 = 0.05; -export const io_cell_h_y2 = 0.24; - -export const slice_x1 = 0.92; -export const slice_x2 = 0.94; -export const slice_x2_wide = 0.97; -export const slice_y1 = 0.71; -export const slice_y2 = 0.745 + 0.0068; -export const slice_pitch = 0.0374 + 0.0068; - -export const slice_comb_dx1 = 0.002; -export const slice_comb_w = 0.007; -export const slice_ff_dx1 = 0.011; -export const slice_ff_w = 0.007; -export const slice_comb_dy1 = 0.002; -export const slice_comb_h = 0.014; -export const slice_comb_dy2 = 0.021; - -export const wire_distance = 0.0017; -export const wire_distance_small = 0.00085; - -export const wire_length_lut = 0.01; -export const wire_length = 0.005; -export const wire_length_long = 0.015; diff --git a/lib/src/gfx/ecp5.gfx.ts b/lib/src/gfx/ecp5.gfx.ts deleted file mode 100644 index e7bab59..0000000 --- a/lib/src/gfx/ecp5.gfx.ts +++ /dev/null @@ -1,2738 +0,0 @@ -/* - * nextpnr -- Next Generation Place and Route - * - * Copyright (C) 2018 Claire Xenia Wolf - * Copyright (C) 2019 Miodrag Milanovic - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ -import {ConstIncs} from './ecp5.constincs'; -import * as gfxconstants from './ecp5.gfx.constants'; -import {GraphicElement} from './gfx'; -import {Style} from './styles'; -import {GfxTileWireId} from './tilewire.ecp5.gfx'; -import {Type} from './types'; - -let first = true; - -type WireId = { - location: {x: number; y: number}; -}; - -export class GFX { - public static tileBel( - x: number, - y: number, - z: number, - w: number, - h: number, - type: number, - style: Style - ): Array { - let ret = []; - let el = new GraphicElement(Type.Box, style); - - if (type === ConstIncs.DDRDLL) { - // DDRDLL - el.x1 = x + gfxconstants.dll_cell_x1; - el.x2 = x + gfxconstants.dll_cell_x2; - el.y1 = y + gfxconstants.dll_cell_y1; - el.y2 = y + gfxconstants.dll_cell_y2; - - ret.push(el.clone()); - } else if ( - type === ConstIncs.TRELLIS_IO || // TRELLIS_IO - type === ConstIncs.SIOLOGIC || // SIOLOGIC - type === ConstIncs.IOLOGIC || // IOLOGIC - type === ConstIncs.DQSBUFM - ) { - // DQSBUFM - const top_bottom: boolean = y === 0 || y === h - 1; - if (top_bottom) { - el.x1 = x + gfxconstants.io_cell_h_x1 + (z + 2) * gfxconstants.io_cell_gap; - el.x2 = x + gfxconstants.io_cell_h_x1 + (z + 2) * gfxconstants.io_cell_gap + 0.08; - if (y === h - 1) { - el.y1 = y + 1 - gfxconstants.io_cell_h_y1; - el.y2 = y + 1 - gfxconstants.io_cell_h_y2; - } else { - el.y1 = y + gfxconstants.io_cell_h_y1; - el.y2 = y + gfxconstants.io_cell_h_y2; - } - } else { - if (x === 0) { - el.x1 = x + 1 - gfxconstants.io_cell_v_x1; - el.x2 = x + 1 - gfxconstants.io_cell_v_x2; - } else { - el.x1 = x + gfxconstants.io_cell_v_x1; - el.x2 = x + gfxconstants.io_cell_v_x2; - } - el.y1 = y + gfxconstants.io_cell_v_y1 + z * gfxconstants.io_cell_gap; - el.y2 = y + gfxconstants.io_cell_v_y1 + z * gfxconstants.io_cell_gap + 0.08; - } - ret.push(el.clone()); - } else if (type === ConstIncs.DCCA) { - // DCCA - el.x1 = x + gfxconstants.switchbox_x1 + z * 0.025; - el.y1 = y + 0.14; - el.x2 = x + gfxconstants.switchbox_x1 + z * 0.025 + 0.02; - el.y2 = y + 0.18; - ret.push(el.clone()); - } else if (type === ConstIncs.TRELLIS_SLICE) { - // TRELLIS_SLICE - } else if (type === ConstIncs.EHXPLLL) { - // EHXPLLL - el.x1 = x + gfxconstants.slice_x1; - el.x2 = x + gfxconstants.slice_x2_wide; - el.y1 = y + gfxconstants.slice_y1; - el.y2 = y + gfxconstants.slice_y2; - ret.push(el.clone()); - } else if ( - type === ConstIncs.DP16KD || // DP16KD - type === ConstIncs.MULT18X18D || // MULT18X18D - type === ConstIncs.ALU54B - ) { - // ALU54B - el.x1 = x + gfxconstants.slice_x1; - el.x2 = x + gfxconstants.slice_x2_wide; - el.y1 = y + gfxconstants.slice_y1 - 1 * gfxconstants.slice_pitch; - el.y2 = y + gfxconstants.slice_y2 + 3 * gfxconstants.slice_pitch; - ret.push(el.clone()); - } else if (type === ConstIncs.DCSC) { - // DCSC - } else if ( - type === ConstIncs.DLLDELD || // DLLDELD - type === ConstIncs.CLKDIVF || // CLKDIVF - type === ConstIncs.ECLKSYNCB || // ECLKSYNCB - type === ConstIncs.TRELLIS_ECLKBUF || // TRELLIS_ECLKBUF - type === ConstIncs.ECLKBRIDGECS - ) { - // ECLKBRIDGECS - el.x1 = x + 0.1 + z * 0.05; - el.x2 = x + 0.14 + z * 0.05; - el.y1 = y + 0.475; - el.y2 = y + 0.525; - ret.push(el.clone()); - } else if ( - type === ConstIncs.GSR || // GSR - type === ConstIncs.JTAGG || // JTAGG - type === ConstIncs.OSCG || // OSCG - type === ConstIncs.SEDGA || // SEDGA - type === ConstIncs.DTR || // DTR - type === ConstIncs.PCSCLKDIV || // PCSCLKDIV - type === ConstIncs.USRMCLK || // USRMCLK - type === ConstIncs.EXTREFB - ) { - // EXTREFB - el.x1 = x + gfxconstants.slice_x1; - el.x2 = x + gfxconstants.slice_x2_wide; - el.y1 = y + gfxconstants.slice_y1 + z * gfxconstants.slice_pitch; - el.y2 = y + gfxconstants.slice_y2 + z * gfxconstants.slice_pitch; - ret.push(el.clone()); - } else if (type === ConstIncs.DCUA) { - // DCUA - el.x1 = x + gfxconstants.slice_x1; - el.x2 = x + gfxconstants.slice_x2_wide; - el.y1 = y + gfxconstants.slice_y2; - el.y2 = y + 0.25; - ret.push(el.clone()); - } else if (type === ConstIncs.TRELLIS_COMB) { - // TRELLIS_COMB - let lc: number = Math.floor(z / 4); - - el.x1 = x + gfxconstants.slice_x1 + gfxconstants.slice_comb_dx1; - el.x2 = el.x1 + gfxconstants.slice_comb_w; - el.y1 = - y + - gfxconstants.slice_y1 + - Math.floor(lc / 2) * gfxconstants.slice_pitch + - (lc % 2 ? gfxconstants.slice_comb_dy2 : gfxconstants.slice_comb_dy1); - el.y2 = el.y1 + gfxconstants.slice_comb_h; - ret.push(el.clone()); - - el.style = Style.Frame; - if (lc % 2 == 0) { - // SLICE frame - el.x1 = x + gfxconstants.slice_x1; - el.x2 = x + gfxconstants.slice_x2; - el.y1 = y + gfxconstants.slice_y1 + Math.floor(lc / 2) * gfxconstants.slice_pitch; - el.y2 = y + gfxconstants.slice_y2 + Math.floor(lc / 2) * gfxconstants.slice_pitch; - ret.push(el.clone()); - - // SLICE control set switchbox - el.x1 = x + gfxconstants.slice_x2 + 15 * gfxconstants.wire_distance; - el.x2 = el.x1 + gfxconstants.wire_distance; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_CLK3_SLICE - - GfxTileWireId.TILE_WIRE_DUMMY_D2 + - 5 + - (3 - Math.floor(lc / 2)) * 26) + - 3 * gfxconstants.slice_pitch - - 0.0007; - el.y2 = el.y1 + gfxconstants.wire_distance * 5; - ret.push(el.clone()); - } - - // LUT permutation switchbox - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length_lut; - el.x2 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - let start_wire = GfxTileWireId.TILE_WIRE_D7 + 24 * Math.floor(lc / 2) + 4 * (lc % 2); - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (start_wire - GfxTileWireId.TILE_WIRE_FCO + 1 + (lc / 2) * 2) + - 3 * gfxconstants.slice_pitch + - 0.25 * gfxconstants.wire_distance; - el.y1 = el.y2 - 3.5 * gfxconstants.wire_distance; - ret.push(el.clone()); - } else if (type === ConstIncs.TRELLIS_FF) { - // TRELLIS_FF - let lc = Math.floor(z / 4); - el.x1 = x + gfxconstants.slice_x1 + gfxconstants.slice_ff_dx1; - el.x2 = el.x1 + gfxconstants.slice_ff_w; - el.y1 = - y + - gfxconstants.slice_y1 + - Math.floor(lc / 2) * gfxconstants.slice_pitch + - (lc % 2 ? gfxconstants.slice_comb_dy2 : gfxconstants.slice_comb_dy1); - el.y2 = el.y1 + gfxconstants.slice_comb_h; - ret.push(el.clone()); - } else if (type === ConstIncs.TRELLIS_RAMW) { - // TRELLIS_RAMW - // do not draw - } else if (first) { - console.log(x, y, z, type); - first = false; - } - - return ret; - } - - public static tileWire( - x: number, - y: number, - w: number, - h: number, - type: number, - tilewire: GfxTileWireId, - style: Style - ): Array { - const ret: Array = []; - let el = new GraphicElement(Type.Line, style); - - if (type === ConstIncs.WIRE_TYPE_NONE) { - // WIRE_TYPE_NONE - if (tilewire >= GfxTileWireId.TILE_WIRE_NBOUNCE && tilewire <= GfxTileWireId.TILE_WIRE_SBOUNCE) { - el.x1 = x + gfxconstants.switchbox_x2 - gfxconstants.wire_distance * 4; - el.x2 = x + gfxconstants.switchbox_x2 - gfxconstants.wire_distance * 8; - if (tilewire == GfxTileWireId.TILE_WIRE_NBOUNCE) { - el.y1 = y + gfxconstants.switchbox_y2 + gfxconstants.wire_distance * 4; - el.y2 = el.y1; - } else { - el.y1 = y + gfxconstants.switchbox_y1 - gfxconstants.wire_distance * 4; - el.y2 = el.y1; - } - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_WBOUNCE && tilewire <= GfxTileWireId.TILE_WIRE_EBOUNCE) { - el.y1 = y + gfxconstants.switchbox_y1 + gfxconstants.wire_distance * 4; - el.y2 = y + gfxconstants.switchbox_y1 + gfxconstants.wire_distance * 8; - if (tilewire == GfxTileWireId.TILE_WIRE_WBOUNCE) { - el.x1 = x + gfxconstants.switchbox_x1 - gfxconstants.wire_distance * 4; - el.x2 = el.x1; - } else { - el.x1 = x + gfxconstants.switchbox_x2 + gfxconstants.wire_distance * 4; - el.x2 = el.x1; - } - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_CLK0 && tilewire <= GfxTileWireId.TILE_WIRE_LSR1) { - el.x1 = x + gfxconstants.switchbox_x2; - el.x2 = - x + - gfxconstants.slice_x2 + - 15 * gfxconstants.wire_distance + - (8 - (tilewire - GfxTileWireId.TILE_WIRE_CLK0)) * gfxconstants.wire_distance; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_CLK0 - 5) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - el.x1 = el.x2; - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (3 + (tilewire - GfxTileWireId.TILE_WIRE_CLK0)); - ret.push(el.clone()); - for (let i = 0; i < 4; i++) { - el.x1 = x + gfxconstants.slice_x2 + 15 * gfxconstants.wire_distance + gfxconstants.wire_distance; - el.x2 = - x + - gfxconstants.slice_x2 + - 15 * gfxconstants.wire_distance + - (8 - (tilewire - GfxTileWireId.TILE_WIRE_CLK0)) * gfxconstants.wire_distance; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_CLK3_SLICE - - GfxTileWireId.TILE_WIRE_DUMMY_D2 + - 1 + - tilewire - - GfxTileWireId.TILE_WIRE_CLK0) + - i * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } - if (tilewire == GfxTileWireId.TILE_WIRE_CLK1 || tilewire == GfxTileWireId.TILE_WIRE_LSR1) { - for (let i = 0; i < 2; i++) { - el.x1 = x + gfxconstants.slice_x2 + 3 * gfxconstants.wire_distance; - el.x2 = - x + - gfxconstants.slice_x2 + - 15 * gfxconstants.wire_distance + - (8 - (tilewire - GfxTileWireId.TILE_WIRE_CLK0)) * gfxconstants.wire_distance; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_CLK3_SLICE - - GfxTileWireId.TILE_WIRE_DUMMY_D2 - - 1 + - Math.floor((tilewire - GfxTileWireId.TILE_WIRE_CLK0) / 2)) + - i * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } - } - } - - // TRELLIS_IO wires - else if (tilewire >= GfxTileWireId.TILE_WIRE_JDIA && tilewire <= GfxTileWireId.TILE_WIRE_ECLKD) { - el.x1 = x + 0.5; - el.x2 = x + 0.5 + gfxconstants.wire_length; - const top: boolean = y == h - 1; - if (top) - el.y1 = - y + - 1 - - (gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch); - else - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_JCE0 && tilewire <= GfxTileWireId.TILE_WIRE_JQ7) { - el.x1 = x + gfxconstants.switchbox_x2; - el.x2 = x + gfxconstants.switchbox_x2 + gfxconstants.wire_length; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JCE0 + 1) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_FCO && tilewire <= GfxTileWireId.TILE_WIRE_FCI) { - const gap: number = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_FCO) / 24); - el.x1 = x + gfxconstants.switchbox_x2; - el.x2 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_FCO + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_MUXCLK3 && tilewire <= GfxTileWireId.TILE_WIRE_MUXLSR0) { - const gap: number = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_MUXCLK3) / 2); - const part: number = (tilewire - GfxTileWireId.TILE_WIRE_MUXCLK3) % 2; - el.x1 = x + gfxconstants.slice_x2 + 3 * gfxconstants.wire_distance; - el.x2 = x + gfxconstants.slice_x2 + 15 * gfxconstants.wire_distance; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_CLK3_SLICE - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + part + gap * 26) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_WD3 && tilewire <= GfxTileWireId.TILE_WIRE_WD0) { - const part: number = (tilewire - GfxTileWireId.TILE_WIRE_WD3) % 4; - const group: number = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_WD3) / 2); - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2 + gfxconstants.wire_length + gfxconstants.wire_distance * (4 - part); - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_WDO3C_SLICE - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + part + 14) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - - el.x1 = el.x2; - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_WD1B_SLICE - - GfxTileWireId.TILE_WIRE_DUMMY_D2 + - 1 + - (part & 1) + - 14 * 2) + - (3 - group) * gfxconstants.slice_pitch; - ret.push(el.clone()); - - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.y1 = el.y2; - ret.push(el.clone()); - } else if (tilewire >= GfxTileWireId.TILE_WIRE_WAD3 && tilewire <= GfxTileWireId.TILE_WIRE_WAD0) { - const part: number = (tilewire - GfxTileWireId.TILE_WIRE_WAD3) % 4; - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2 + gfxconstants.wire_length + gfxconstants.wire_distance * (8 - part); - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_WADO3C_SLICE - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + part + 14) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - - el.x1 = el.x2; - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_WAD3B_SLICE - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + part + 14 * 2) + - 2 * gfxconstants.slice_pitch; - ret.push(el.clone()); - - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.y1 = el.y2; - ret.push(el.clone()); - - // middle line - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2 + gfxconstants.wire_length + gfxconstants.wire_distance * (8 - part); - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * - (GfxTileWireId.TILE_WIRE_WAD3B_SLICE - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + part + 14 * 2) + - 3 * gfxconstants.slice_pitch; - el.y1 = el.y2; - ret.push(el.clone()); - } - } else if (type === ConstIncs.WIRE_TYPE_DDRDLL) { - // WIRE_TYPE_DDRDLL - const num = tilewire - GfxTileWireId.TILE_WIRE_DDRDEL_DDRDLL; - el.x1 = x + gfxconstants.io_cell_h_x1 + 0.2 + gfxconstants.wire_distance * (num + 1); - el.x2 = el.x1; - if (y == h - 1) { - el.y1 = y + gfxconstants.dll_cell_y1; - el.y2 = el.y1 - gfxconstants.wire_length_long; - } else { - el.y1 = y + gfxconstants.dll_cell_y2; - el.y2 = el.y1 + gfxconstants.wire_length_long; - } - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_OSC) { - // WIRE_TYPE_OSC - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_SEDSTDBY_OSC + 1) + - 2 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_V01) { - // WIRE_TYPE_V01 - if (tilewire >= GfxTileWireId.TILE_WIRE_V01N0001 && tilewire <= GfxTileWireId.TILE_WIRE_V01S0100) { - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (10 + tilewire - GfxTileWireId.TILE_WIRE_V01N0001); - el.x2 = el.x1; - if (y == h - 2) el.y1 = y + 1.1; - else el.y1 = y + gfxconstants.switchbox_y1 + 1; - - if (y == 0) el.y2 = y + 0.9; - else el.y2 = y + gfxconstants.switchbox_y2; - - ret.push(el.clone()); - } - } else if (type === ConstIncs.WIRE_TYPE_V02) { - // WIRE_TYPE_V02 - if (y == 0) el.y1 = 0.9; - else - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - el.y2 = el.y1; - el.x1 = x + gfxconstants.switchbox_x1; - el.x2 = - x + - gfxconstants.switchbox_x1 - - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - if (y != 0 && y != h - 1) ret.push(el.clone()); - - if (y == h - 2) el.y2 = y + 1 + 0.1; - else - el.y2 = - y + - 1 + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - el.x1 = el.x2; - if (y != h - 1) ret.push(el.clone()); - - el.y1 = el.y2; - el.x1 = x + gfxconstants.switchbox_x1; - if (y != h - 1 && y != h - 2) ret.push(el.clone()); - - if (y == h - 1) el.y1 = y + 0.1; - else - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - if (y == 1) el.y2 = y - 1 + 0.9; - else - el.y2 = - y - - 1 + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - el.x2 = - x + - gfxconstants.switchbox_x1 - - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (y % 3)); - el.x1 = el.x2; - if (y != 0) ret.push(el.clone()); - - el.y1 = el.y2; - el.x1 = x + gfxconstants.switchbox_x1; - if (y != 0 && y != 1) ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_V06) { - // WIRE_TYPE_V06 - if (y == 0) el.y1 = 0.9; - else - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - el.y2 = el.y1; - el.x1 = x + gfxconstants.switchbox_x1; - el.x2 = - x + - gfxconstants.switchbox_x1 - - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - if (y != 0 && y != h - 1) ret.push(el.clone()); - - if (y == h - 2 || y == h - 3 || y == h - 4) el.y2 = h - 1 + 0.1; - else - el.y2 = - y + - 3 + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - el.x1 = el.x2; - if (y != h - 1) ret.push(el.clone()); - - el.y1 = el.y2; - el.x1 = x + gfxconstants.switchbox_x1; - if (y != h - 1 && y != h - 2 && y != h - 3 && y != h - 4) ret.push(el.clone()); - - if (y == h - 1) el.y1 = y + 0.1; - else - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - if (y == 1 || y == 2 || y == 3) el.y2 = 0.9; - else - el.y2 = - y - - 3 + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - el.x2 = - x + - gfxconstants.switchbox_x1 - - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (y % 9)); - el.x1 = el.x2; - if (y != 0) ret.push(el.clone()); - - el.y1 = el.y2; - el.x1 = x + gfxconstants.switchbox_x1; - if (y != 0 && y != 1 && y != 2 && y != 3) ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_PIO) { - // WIRE_TYPE_PIO - const top_bottom: boolean = y == 0 || y == h - 1; - const gap = 3 - Math.floor((tilewire - GfxTileWireId.TILE_WIRE_PADDOD_PIO) / 7); - const num = (tilewire - GfxTileWireId.TILE_WIRE_PADDOD_PIO) % 7; - if (top_bottom) { - el.x1 = - x + - gfxconstants.io_cell_h_x1 + - (gap + 2) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - el.x2 = el.x1; - if (y == h - 1) { - el.y1 = y + 1 - gfxconstants.io_cell_h_y2; - el.y2 = el.y1 - gfxconstants.wire_length_long; - } else { - el.y1 = y + gfxconstants.io_cell_h_y2; - el.y2 = el.y1 + gfxconstants.wire_length_long; - } - } else { - if (x == 0) { - el.x1 = x + 1 - gfxconstants.io_cell_v_x1; - el.x2 = el.x1 + gfxconstants.wire_length_long; - } else { - el.x1 = x + gfxconstants.io_cell_v_x1; - el.x2 = el.x1 - gfxconstants.wire_length_long; - } - el.y1 = - y + - gfxconstants.io_cell_v_y1 + - gap * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - el.y2 = el.y1; - } - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_SIOLOGIC) { - // WIRE_TYPE_SIOLOGIC - const gap = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) / 20); - const num = (tilewire - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) % 20; - el.x1 = - x + - gfxconstants.io_cell_h_x1 + - (5 - gap) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - el.x2 = el.x1; - if (y == h - 1) { - el.y1 = y + 1 - gfxconstants.io_cell_h_y2; - el.y2 = el.y1 - gfxconstants.wire_length_long; - } else { - el.y1 = y + gfxconstants.io_cell_h_y2; - el.y2 = el.y1 + gfxconstants.wire_length_long; - } - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_H06) { - // WIRE_TYPE_H06 - if (x == 0) el.x1 = 0.9; - else - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - el.x2 = el.x1; - el.y1 = y + gfxconstants.switchbox_y1; - el.y2 = - y + - gfxconstants.switchbox_y1 - - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - if (x != 0 && x != w - 1) ret.push(el.clone()); - - if (x == w - 2 || x == w - 3 || x == w - 4) el.x2 = w - 1 + 0.1; - else - el.x2 = - x + - 3 + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - el.y1 = el.y2; - if (x != w - 1) ret.push(el.clone()); - - el.x1 = el.x2; - el.y1 = y + gfxconstants.switchbox_y1; - if (x != w - 1 && x != w - 2 && x != w - 3 && x != w - 4) ret.push(el.clone()); - - if (x == w - 1) el.x1 = x + 0.1; - else - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - if (x == 1 || x == 2 || x == 3) el.x2 = 0.9; - else - el.x2 = - x - - 3 + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - el.y2 = - y + - gfxconstants.switchbox_y1 - - gfxconstants.wire_distance * (96 + (tilewire - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (x % 9)); - el.y1 = el.y2; - if (x != 0) ret.push(el.clone()); - - el.x1 = el.x2; - el.y1 = y + gfxconstants.switchbox_y1; - if (x != 0 && x != 1 && x != 2 && x != 3) ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_H02) { - // WIRE_TYPE_H02 - if (x == 0) el.x1 = 0.9; - else - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - el.x2 = el.x1; - el.y1 = y + gfxconstants.switchbox_y1; - el.y2 = - y + - gfxconstants.switchbox_y1 - - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - if (x != 0 && x != w - 1) ret.push(el.clone()); - - if (x == w - 2) el.x2 = x + 1 + 0.1; - else - el.x2 = - x + - 1 + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - el.y1 = el.y2; - if (x != w - 1) ret.push(el.clone()); - - el.x1 = el.x2; - el.y1 = y + gfxconstants.switchbox_y1; - if (x != w - 1 && x != w - 2) ret.push(el.clone()); - - if (x == w - 1) el.x1 = x + 0.1; - else - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - if (x == 1) el.x2 = x - 1 + 0.9; - else - el.x2 = - x - - 1 + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - el.y2 = - y + - gfxconstants.switchbox_y1 - - gfxconstants.wire_distance * (20 + (tilewire - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (x % 3)); - el.y1 = el.y2; - if (x != 0) ret.push(el.clone()); - - el.x1 = el.x2; - el.y1 = y + gfxconstants.switchbox_y1; - if (x != 0 && x != 1) ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_H01) { - // WIRE_TYPE_H01 - if (tilewire >= GfxTileWireId.TILE_WIRE_H01E0001 && tilewire <= GfxTileWireId.TILE_WIRE_HL7W0001) { - if (x == w - 1) el.x1 = x + 0.1; - else el.x1 = x + gfxconstants.switchbox_x1; - if (x == 1) el.x2 = x - 0.1; - else el.x2 = x + gfxconstants.switchbox_x2 - 1; - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (10 + tilewire - GfxTileWireId.TILE_WIRE_H01E0001); - el.y2 = el.y1; - ret.push(el.clone()); - } - } else if (type === ConstIncs.WIRE_TYPE_G_HPBX) { - // WIRE_TYPE_G_HPBX - el.x1 = x; - el.x2 = x + 1; - el.y1 = y + 0.1 + gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_G_HPBX0000 + 1); - el.y2 = el.y1; - ret.push(el.clone()); - - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (200 + (tilewire - GfxTileWireId.TILE_WIRE_G_HPBX0000)); - el.x2 = el.x1; - el.y2 = y + gfxconstants.switchbox_y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_H00) { - // WIRE_TYPE_H00 - const group = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_H00L0000) / 2); - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (8 - ((tilewire - GfxTileWireId.TILE_WIRE_H00L0000) % 2) * 4); - el.y2 = el.y1; - - if (group) { - el.x1 = x + gfxconstants.switchbox_x2 + gfxconstants.wire_distance * 4; - el.x2 = x + gfxconstants.switchbox_x2; - } else { - el.x1 = x + gfxconstants.switchbox_x1 - gfxconstants.wire_distance * 4; - el.x2 = x + gfxconstants.switchbox_x1; - } - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_V00) { - // WIRE_TYPE_V00 - const group = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_V00T0000) / 2); - el.x1 = - x + - gfxconstants.switchbox_x2 - - gfxconstants.wire_distance * (8 - ((tilewire - GfxTileWireId.TILE_WIRE_V00T0000) % 2) * 4); - el.x2 = el.x1; - if (group) { - el.y1 = y + gfxconstants.switchbox_y1; - el.y2 = y + gfxconstants.switchbox_y1 - gfxconstants.wire_distance * 4; - } else { - el.y1 = y + gfxconstants.switchbox_y2; - el.y2 = y + gfxconstants.switchbox_y2 + gfxconstants.wire_distance * 4; - } - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_G_VPTX) { - // WIRE_TYPE_G_VPTX - el.x1 = x + 0.1 + gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_G_VPTX0000 + 1); - el.x2 = el.x1; - el.y1 = y; - el.y2 = y + 1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_L_HPBX) { - // WIRE_TYPE_L_HPBX - el.x1 = x - 3; - el.x2 = x + 0.08; - el.y1 = - y + - gfxconstants.wire_distance + - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_L_HPBX0000 + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === 1301) { - el.x1 = x + 0.2; - el.x2 = x + 3; - el.y1 = - y + - gfxconstants.wire_distance + - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_R_HPBX0000 + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === 1271 && tilewire != GfxTileWireId.TILE_WIRE_NONE) { - if (tilewire >= GfxTileWireId.TILE_WIRE_FCO_SLICE && tilewire <= GfxTileWireId.TILE_WIRE_FCI_SLICE) { - const gap = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE) / 24); - const item = (tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE) % 24; - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - // FX to F connection - top - if (item == GfxTileWireId.TILE_WIRE_FXD_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE) { - el.x2 = el.x1; - el.y2 = el.y1 - gfxconstants.wire_distance; - ret.push(el.clone()); - } - // F5 to F connection - bottom - if (item == GfxTileWireId.TILE_WIRE_F5D_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE) { - el.x2 = el.x1; - el.y2 = el.y1 + gfxconstants.wire_distance; - ret.push(el.clone()); - } - // connection between slices - if ( - item == GfxTileWireId.TILE_WIRE_FCID_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE && - tilewire != GfxTileWireId.TILE_WIRE_FCI_SLICE - ) { - el.x2 = el.x1; - el.y2 = el.y1 - gfxconstants.wire_distance * 3; - ret.push(el.clone()); - } - } - if (tilewire >= GfxTileWireId.TILE_WIRE_DUMMY_D2 && tilewire <= GfxTileWireId.TILE_WIRE_WAD0A_SLICE) { - const gap = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_DUMMY_D2) / 12); - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + gap * 14) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } - } else if (type === ConstIncs.WIRE_TYPE_IOLOGIC) { - // WIRE_TYPE_IOLOGIC - const gap = 7 - Math.floor((tilewire - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) / 42); - const num = (tilewire - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) % 42; - if (x == 0) { - el.x1 = x + 1 - gfxconstants.io_cell_v_x1; - el.x2 = el.x1 + gfxconstants.wire_length_long; - } else { - el.x1 = x + gfxconstants.io_cell_v_x1; - el.x2 = el.x1 - gfxconstants.wire_length_long; - } - el.y1 = - y + gfxconstants.io_cell_v_y1 + gap * gfxconstants.io_cell_gap + gfxconstants.wire_distance * (num + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_DQS) { - // WIRE_TYPE_DQS - const num = tilewire - GfxTileWireId.TILE_WIRE_DDRDEL_DQS; - if (x == 0) { - el.x1 = x + 1 - gfxconstants.io_cell_v_x1; - el.x2 = el.x1 + gfxconstants.wire_length_long; - } else { - el.x1 = x + gfxconstants.io_cell_v_x1; - el.x2 = el.x1 - gfxconstants.wire_length_long; - } - el.y1 = - y + gfxconstants.io_cell_v_y1 + 8 * gfxconstants.io_cell_gap + gfxconstants.wire_distance * (num + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_MULT18) { - // WIRE_TYPE_MULT18 - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance_small * (tilewire - GfxTileWireId.TILE_WIRE_JCLK0_MULT18 + 1) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_ALU54) { - // WIRE_TYPE_ALU54 - const num = (tilewire - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) % 225; - const group = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) / 225); - if (group == 0) { - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - } else { - el.x1 = x + gfxconstants.slice_x2_wide + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2_wide; - } - el.y1 = - y + gfxconstants.slice_y2 - gfxconstants.wire_distance_small * (num + 1) + 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_EBR) { - // WIRE_TYPE_EBR - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JADA0_EBR + 1) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_PLL) { - // WIRE_TYPE_PLL - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_CLKI_PLL + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_SED) { - // WIRE_TYPE_SED - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_SEDSTDBY_SED + 1) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_JTAG) { - // WIRE_TYPE_JTAG - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JJCE1_JTAG + 1) + - 1 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_GSR) { - // WIRE_TYPE_GSR - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JCLK_GSR + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_DTR) { - // WIRE_TYPE_DTR - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_JSTARTPULSE_DTR + 1); - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_PCSCLKDIV) { - // WIRE_TYPE_PCSCLKDIV - const num = (tilewire - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) % 7; - const group = 1 - Math.floor((tilewire - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) / 7); - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + gfxconstants.slice_y2 - gfxconstants.wire_distance * (num + 1) + group * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_CCLK) { - // WIRE_TYPE_CCLK - const num = tilewire - GfxTileWireId.TILE_WIRE_JPADDI_CCLK; - el.x1 = x + gfxconstants.slice_x1 + gfxconstants.wire_distance * (num + 1); - el.x2 = el.x1; - el.y1 = y + gfxconstants.slice_y2 - 1 * gfxconstants.slice_pitch; - el.y2 = el.y1 - gfxconstants.wire_length_long; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_DCU) { - // WIRE_TYPE_DCU - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_CH0_RX_REFCLK_DCU + 1) + - 0 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_EXTREF) { - // WIRE_TYPE_EXTREF - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_REFCLKP_EXTREF + 1) + - 1 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } else if (type === ConstIncs.WIRE_TYPE_SLICE) { - // WIRE_TYPE_SLICE - if (tilewire >= GfxTileWireId.TILE_WIRE_FCO_SLICE && tilewire <= GfxTileWireId.TILE_WIRE_FCI_SLICE) { - const gap = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE) / 24); - const item = (tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE) % 24; - el.x1 = x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x1; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_FCO_SLICE + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - // FX to F connection - top - if (item == GfxTileWireId.TILE_WIRE_FXD_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE) { - el.x2 = el.x1; - el.y2 = el.y1 - gfxconstants.wire_distance; - ret.push(el.clone()); - } - // F5 to F connection - bottom - if (item == GfxTileWireId.TILE_WIRE_F5D_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE) { - el.x2 = el.x1; - el.y2 = el.y1 + gfxconstants.wire_distance; - ret.push(el.clone()); - } - // connection between slices - if ( - item == GfxTileWireId.TILE_WIRE_FCID_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE && - tilewire != GfxTileWireId.TILE_WIRE_FCI_SLICE - ) { - el.x2 = el.x1; - el.y2 = el.y1 - gfxconstants.wire_distance * 3; - ret.push(el.clone()); - } - } - if (tilewire >= GfxTileWireId.TILE_WIRE_DUMMY_D2 && tilewire <= GfxTileWireId.TILE_WIRE_WAD0A_SLICE) { - const gap = Math.floor((tilewire - GfxTileWireId.TILE_WIRE_DUMMY_D2) / 12); - el.x1 = x + gfxconstants.slice_x2 + gfxconstants.wire_length; - el.x2 = x + gfxconstants.slice_x2; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (tilewire - GfxTileWireId.TILE_WIRE_DUMMY_D2 + 1 + gap * 14) + - 3 * gfxconstants.slice_pitch; - el.y2 = el.y1; - ret.push(el.clone()); - } - } else if (first) { - console.log(x, y, type); - first = false; - } - - return ret; - } - - private static setSource( - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId - ) { - if (src_type == ConstIncs.WIRE_TYPE_H00) { - const group: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_H00L0000) / 2); - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (8 - ((src_id - GfxTileWireId.TILE_WIRE_H00L0000) % 2) * 4); - - if (group) { - el.x1 = x + gfxconstants.switchbox_x2; - } else { - el.x1 = x + gfxconstants.switchbox_x1; - } - } - if (src_type == ConstIncs.WIRE_TYPE_H01) { - if (x == src.location.x) el.x1 = x + gfxconstants.switchbox_x1; - else el.x1 = x + gfxconstants.switchbox_x2; - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (10 + src_id - GfxTileWireId.TILE_WIRE_H01E0001); - } - if (src_type == ConstIncs.WIRE_TYPE_H02) { - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * - (20 + (src_id - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (src.location.x % 3)); - el.y1 = y + gfxconstants.switchbox_y1; - } - if (src_type == ConstIncs.WIRE_TYPE_H06) { - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * - (96 + (src_id - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (src.location.x % 9)); - el.y1 = y + gfxconstants.switchbox_y1; - } - if (src_type == ConstIncs.WIRE_TYPE_V00) { - const group: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_V00T0000) / 2); - el.x1 = - x + - gfxconstants.switchbox_x2 - - gfxconstants.wire_distance * (8 - ((src_id - GfxTileWireId.TILE_WIRE_V00T0000) % 2) * 4); - if (group) { - el.y1 = y + gfxconstants.switchbox_y1; - } else { - el.y1 = y + gfxconstants.switchbox_y2; - } - } - if (src_type == ConstIncs.WIRE_TYPE_V01) { - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (10 + src_id - GfxTileWireId.TILE_WIRE_V01N0001); - if (y == src.location.y) el.y1 = y + gfxconstants.switchbox_y2; - else el.y1 = y + gfxconstants.switchbox_y1; - } - if (src_type == ConstIncs.WIRE_TYPE_V02) { - el.x1 = x + gfxconstants.switchbox_x1; - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * - (20 + (src_id - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (src.location.y % 3)); - } - if (src_type == ConstIncs.WIRE_TYPE_V06) { - el.x1 = x + gfxconstants.switchbox_x1; - el.y1 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * - (96 + (src_id - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (src.location.y % 9)); - } - if (src_type == ConstIncs.WIRE_TYPE_NONE) { - if (src_id >= GfxTileWireId.TILE_WIRE_CLK0 && src_id <= GfxTileWireId.TILE_WIRE_LSR1) { - el.x1 = x + gfxconstants.switchbox_x2; - el.y1 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_CLK0 - 5) + - 3 * gfxconstants.slice_pitch; - } - if (src_id >= GfxTileWireId.TILE_WIRE_FCO && src_id <= GfxTileWireId.TILE_WIRE_FCI) { - const gap: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_FCO) / 24); - el.x1 = src.location.x + gfxconstants.switchbox_x2; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_FCO + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - } - if (src_id >= GfxTileWireId.TILE_WIRE_JCE0 && src_id <= GfxTileWireId.TILE_WIRE_JQ7) { - el.x1 = src.location.x + gfxconstants.switchbox_x2 + gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JCE0 + 1) + - 3 * gfxconstants.slice_pitch; - } - if (src_id >= GfxTileWireId.TILE_WIRE_JDIA && src_id <= GfxTileWireId.TILE_WIRE_ECLKD) { - const top: boolean = src.location.y == h - 1; - el.x1 = src.location.x + 0.5 + gfxconstants.wire_length; - if (top) - el.y1 = - src.location.y + - 1 - - (gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch); - else - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch; - } - } - if (src_type == ConstIncs.WIRE_TYPE_IOLOGIC) { - const gap: number = 7 - Math.floor((src_id - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) / 42); - const num: number = (src_id - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) % 42; - if (src.location.x == 0) { - el.x1 = src.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x1 = src.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y1 = - src.location.y + - gfxconstants.io_cell_v_y1 + - gap * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - if (src_type == ConstIncs.WIRE_TYPE_SIOLOGIC) { - const gap: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) / 20); - const num: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) % 20); - el.x1 = - src.location.x + - gfxconstants.io_cell_h_x1 + - (5 - gap) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - if (src.location.y == h - 1) { - el.y1 = src.location.y + 1 - gfxconstants.io_cell_h_y2 - gfxconstants.wire_length_long; - } else { - el.y1 = src.location.y + gfxconstants.io_cell_h_y2 + gfxconstants.wire_length_long; - } - } - if (src_type == ConstIncs.WIRE_TYPE_PIO) { - const top_bottom: boolean = src.location.y == 0 || src.location.y == h - 1; - const gap: number = 3 - Math.floor((src_id - GfxTileWireId.TILE_WIRE_PADDOD_PIO) / 7); - const num: number = (src_id - GfxTileWireId.TILE_WIRE_PADDOD_PIO) % 7; - if (top_bottom) { - el.x1 = - src.location.x + - gfxconstants.io_cell_h_x1 + - (gap + 2) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - if (src.location.y == h - 1) { - el.y1 = src.location.y + 1 - gfxconstants.io_cell_h_y2 - gfxconstants.wire_length_long; - } else { - el.y1 = src.location.y + 1 - gfxconstants.io_cell_h_y2 + gfxconstants.wire_length_long; - } - } else { - if (x == 0) { - el.x1 = src.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x1 = src.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y1 = - src.location.y + - gfxconstants.io_cell_v_y1 + - gap * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - } - if (src_type == ConstIncs.WIRE_TYPE_EBR) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JADA0_EBR + 1) + - 3 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_MULT18) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance_small * (src_id - GfxTileWireId.TILE_WIRE_JCLK0_MULT18 + 1) + - 3 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_ALU54) { - const num: number = (src_id - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) % 225; - const group: number = Math.floor((src_id - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) / 225); - if (group == 0) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - } else { - el.x1 = src.location.x + gfxconstants.slice_x2_wide + gfxconstants.wire_length; - } - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance_small * (num + 1) + - 3 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_PLL) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_CLKI_PLL + 1); - } - if (src_type == ConstIncs.WIRE_TYPE_GSR) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JCLK_GSR + 1); - } - if (src_type == ConstIncs.WIRE_TYPE_JTAG) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JJCE1_JTAG + 1) + - 1 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_OSC) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_SEDSTDBY_OSC + 1) + - 2 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_SED) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_SEDSTDBY_SED + 1) + - 3 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_DTR) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_JSTARTPULSE_DTR + 1); - } - if (src_type == ConstIncs.WIRE_TYPE_EXTREF) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_REFCLKP_EXTREF + 1) + - 1 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_DCU) { - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_CH0_RX_REFCLK_DCU + 1) + - 0 * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_PCSCLKDIV) { - const num: number = (src_id - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) % 7; - const group: number = 1 - Math.floor((src_id - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) / 7); - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (num + 1) + - group * gfxconstants.slice_pitch; - } - if (src_type == ConstIncs.WIRE_TYPE_DQS) { - const num: number = src_id - GfxTileWireId.TILE_WIRE_DDRDEL_DQS; - if (src.location.x == 0) { - el.x1 = src.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x1 = src.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y1 = - src.location.y + - gfxconstants.io_cell_v_y1 + - 8 * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - if (src_type == ConstIncs.WIRE_TYPE_DDRDLL) { - const num: number = src_id - GfxTileWireId.TILE_WIRE_DDRDEL_DDRDLL; - el.x1 = - src.location.x + - gfxconstants.io_cell_h_x1 + - gfxconstants.dll_cell_x1 + - gfxconstants.wire_distance * (num + 1); - if (src.location.y == h - 1) { - el.y1 = src.location.y + gfxconstants.dll_cell_y1 - gfxconstants.wire_length_long; - } else { - el.y1 = src.location.y + gfxconstants.dll_cell_y2 + gfxconstants.wire_length_long; - } - } - if (src_type == ConstIncs.WIRE_TYPE_CCLK) { - const num: number = src_id - GfxTileWireId.TILE_WIRE_JPADDI_CCLK; - el.x1 = src.location.x + gfxconstants.slice_x1 + gfxconstants.wire_distance * (num + 1); - el.y1 = - src.location.y + gfxconstants.slice_y2 - 1 * gfxconstants.slice_pitch - gfxconstants.wire_length_long; - } - if (src_type == ConstIncs.WIRE_TYPE_G_HPBX) { - el.x1 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (200 + (src_id - GfxTileWireId.TILE_WIRE_G_HPBX0000)); - el.y1 = y + gfxconstants.switchbox_y1; - } - } - - private static setDestination( - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId - ) { - if (dst_type == ConstIncs.WIRE_TYPE_H00) { - const group: number = Math.floor((dst_id - GfxTileWireId.TILE_WIRE_H00L0000) / 2); - el.y2 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (8 - ((dst_id - GfxTileWireId.TILE_WIRE_H00L0000) % 2) * 4); - - if (group) { - el.x2 = x + gfxconstants.switchbox_x2; - } else { - el.x2 = x + gfxconstants.switchbox_x1; - } - } - if (dst_type == ConstIncs.WIRE_TYPE_H01) { - if (x == dst.location.x) el.x2 = x + gfxconstants.switchbox_x1; - else el.x2 = x + gfxconstants.switchbox_x2; - el.y2 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * (10 + dst_id - GfxTileWireId.TILE_WIRE_H01E0001); - } - if (dst_type == ConstIncs.WIRE_TYPE_H02) { - el.x2 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * - (20 + (dst_id - GfxTileWireId.TILE_WIRE_H02W0701) + 20 * (dst.location.x % 3)); - el.y2 = y + gfxconstants.switchbox_y1; - } - if (dst_type == ConstIncs.WIRE_TYPE_H06) { - el.x2 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * - (96 + (dst_id - GfxTileWireId.TILE_WIRE_H06W0303) + 10 * (dst.location.x % 9)); - el.y2 = y + gfxconstants.switchbox_y1; - } - if (dst_type == ConstIncs.WIRE_TYPE_V00) { - const group: number = Math.floor((dst_id - GfxTileWireId.TILE_WIRE_V00T0000) / 2); - el.x2 = - x + - gfxconstants.switchbox_x2 - - gfxconstants.wire_distance * (8 - ((dst_id - GfxTileWireId.TILE_WIRE_V00T0000) % 2) * 4); - if (group) { - el.y2 = y + gfxconstants.switchbox_y1; - } else { - el.y2 = y + gfxconstants.switchbox_y2; - } - } - if (dst_type == ConstIncs.WIRE_TYPE_V01) { - el.x2 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (10 + dst_id - GfxTileWireId.TILE_WIRE_V01N0001); - if (y == dst.location.y) el.y2 = y + gfxconstants.switchbox_y2; - else el.y2 = y + gfxconstants.switchbox_y1; - } - if (dst_type == ConstIncs.WIRE_TYPE_V02) { - el.x2 = x + gfxconstants.switchbox_x1; - el.y2 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * - (20 + (dst_id - GfxTileWireId.TILE_WIRE_V02N0701) + 20 * (dst.location.y % 3)); - } - if (dst_type == ConstIncs.WIRE_TYPE_V06) { - el.x2 = x + gfxconstants.switchbox_x1; - el.y2 = - y + - gfxconstants.switchbox_y1 + - gfxconstants.wire_distance * - (96 + (dst_id - GfxTileWireId.TILE_WIRE_V06N0303) + 10 * (dst.location.y % 9)); - } - - if (dst_type == ConstIncs.WIRE_TYPE_NONE) { - if (dst_id >= GfxTileWireId.TILE_WIRE_CLK0 && dst_id <= GfxTileWireId.TILE_WIRE_LSR1) { - el.x2 = x + gfxconstants.switchbox_x2; - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_CLK0 - 5) + - 3 * gfxconstants.slice_pitch; - } - if (dst_id >= GfxTileWireId.TILE_WIRE_FCO && dst_id <= GfxTileWireId.TILE_WIRE_FCI) { - const gap: number = Math.floor((dst_id - GfxTileWireId.TILE_WIRE_FCO) / 24); - el.x2 = x + gfxconstants.switchbox_x2; - el.y2 = - y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_FCO + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - } - if (dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && dst_id <= GfxTileWireId.TILE_WIRE_JQ7) { - el.x2 = dst.location.x + gfxconstants.switchbox_x2; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JCE0 + 1) + - 3 * gfxconstants.slice_pitch; - } - if (dst_id >= GfxTileWireId.TILE_WIRE_JDIA && dst_id <= GfxTileWireId.TILE_WIRE_ECLKD) { - const top: boolean = dst.location.y == h - 1; - el.x2 = dst.location.x + 0.5; - if (top) - el.y2 = - dst.location.y + - 1 - - (gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch); - else - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JDIA + 1) + - 3 * gfxconstants.slice_pitch; - } - } - - if (dst_type == ConstIncs.WIRE_TYPE_IOLOGIC) { - const gap: number = 7 - Math.floor((dst_id - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) / 42); - const num: number = (dst_id - GfxTileWireId.TILE_WIRE_JLOADND_IOLOGIC) % 42; - if (dst.location.x == 0) { - el.x2 = dst.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x2 = dst.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y2 = - dst.location.y + - gfxconstants.io_cell_v_y1 + - gap * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - if (dst_type == ConstIncs.WIRE_TYPE_SIOLOGIC) { - const gap: number = Math.floor((dst_id - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) / 20); - const num: number = (dst_id - GfxTileWireId.TILE_WIRE_JLOADNB_SIOLOGIC) % 20; - el.x2 = - dst.location.x + - gfxconstants.io_cell_h_x1 + - (5 - gap) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - if (dst.location.y == h - 1) { - el.y2 = dst.location.y + 1 - gfxconstants.io_cell_h_y2 - gfxconstants.wire_length_long; - } else { - el.y2 = dst.location.y + gfxconstants.io_cell_h_y2 + gfxconstants.wire_length_long; - } - } - if (dst_type == ConstIncs.WIRE_TYPE_PIO) { - const top_bottom: boolean = dst.location.y == 0 || dst.location.y == h - 1; - const gap: number = 3 - Math.floor((dst_id - GfxTileWireId.TILE_WIRE_PADDOD_PIO) / 7); - const num: number = (dst_id - GfxTileWireId.TILE_WIRE_PADDOD_PIO) % 7; - if (top_bottom) { - el.x2 = - dst.location.x + - gfxconstants.io_cell_h_x1 + - (gap + 2) * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - if (dst.location.y == h - 1) { - el.y2 = dst.location.y + 1 - gfxconstants.io_cell_h_y2 - gfxconstants.wire_length_long; - } else { - el.y2 = dst.location.y + 1 - gfxconstants.io_cell_h_y2 + gfxconstants.wire_length_long; - } - } else { - if (x == 0) { - el.x2 = dst.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x2 = dst.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y2 = - dst.location.y + - gfxconstants.io_cell_v_y1 + - gap * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - } - if (dst_type == ConstIncs.WIRE_TYPE_EBR) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JADA0_EBR + 1) + - 3 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_MULT18) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance_small * (dst_id - GfxTileWireId.TILE_WIRE_JCLK0_MULT18 + 1) + - 3 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_ALU54) { - const num: number = (dst_id - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) % 225; - const group: number = Math.floor((dst_id - GfxTileWireId.TILE_WIRE_JCLK0_ALU54) / 225); - if (group == 0) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - } else { - el.x2 = dst.location.x + gfxconstants.slice_x2_wide + gfxconstants.wire_length; - } - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance_small * (num + 1) + - 3 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_PLL) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_CLKI_PLL + 1); - } - if (dst_type == ConstIncs.WIRE_TYPE_GSR) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JCLK_GSR + 1); - } - if (dst_type == ConstIncs.WIRE_TYPE_JTAG) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JJCE1_JTAG + 1) + - 1 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_OSC) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_SEDSTDBY_OSC + 1) + - 2 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_SED) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_SEDSTDBY_SED + 1) + - 3 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_DTR) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_JSTARTPULSE_DTR + 1); - } - if (dst_type == ConstIncs.WIRE_TYPE_EXTREF) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_REFCLKP_EXTREF + 1) + - 1 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_DCU) { - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_CH0_RX_REFCLK_DCU + 1) + - 0 * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_PCSCLKDIV) { - const num: number = (dst_id - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) % 7; - const group: number = 1 - Math.floor((dst_id - GfxTileWireId.TILE_WIRE_CLKI_PCSCLKDIV1) / 7); - el.x2 = dst.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - dst.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (num + 1) + - group * gfxconstants.slice_pitch; - } - if (dst_type == ConstIncs.WIRE_TYPE_DQS) { - const num: number = dst_id - GfxTileWireId.TILE_WIRE_DDRDEL_DQS; - if (dst.location.x == 0) { - el.x2 = dst.location.x + 1 - gfxconstants.io_cell_v_x1 + gfxconstants.wire_length_long; - } else { - el.x2 = dst.location.x + gfxconstants.io_cell_v_x1 - gfxconstants.wire_length_long; - } - el.y2 = - dst.location.y + - gfxconstants.io_cell_v_y1 + - 8 * gfxconstants.io_cell_gap + - gfxconstants.wire_distance * (num + 1); - } - if (dst_type == ConstIncs.WIRE_TYPE_DDRDLL) { - const num: number = dst_id - GfxTileWireId.TILE_WIRE_DDRDEL_DDRDLL; - el.x2 = - dst.location.x + - gfxconstants.io_cell_h_x1 + - gfxconstants.dll_cell_x1 + - gfxconstants.wire_distance * (num + 1); - if (dst.location.y == h - 1) { - el.y2 = dst.location.y + gfxconstants.dll_cell_y1 - gfxconstants.wire_length_long; - } else { - el.y2 = dst.location.y + gfxconstants.dll_cell_y2 + gfxconstants.wire_length_long; - } - } - if (dst_type == ConstIncs.WIRE_TYPE_CCLK) { - const num: number = dst_id - GfxTileWireId.TILE_WIRE_JPADDI_CCLK; - el.x2 = dst.location.x + gfxconstants.slice_x1 + gfxconstants.wire_distance * (num + 1); - el.y2 = - dst.location.y + gfxconstants.slice_y2 - 1 * gfxconstants.slice_pitch - gfxconstants.wire_length_long; - } - if (dst_type == ConstIncs.WIRE_TYPE_G_HPBX) { - el.x2 = - x + - gfxconstants.switchbox_x1 + - gfxconstants.wire_distance * (200 + (dst_id - GfxTileWireId.TILE_WIRE_G_HPBX0000)); - el.y2 = y + gfxconstants.switchbox_y1; - } - } - - private static toSameSideV1Ver( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style, - idx: number - ) { - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - el.x2 = el.x1; - el.y2 = - y + - gfxconstants.switchbox_y1 + - (gfxconstants.switchbox_y2 - gfxconstants.switchbox_y1) / 2 - - gfxconstants.wire_distance * idx; - g.push(el.clone()); - - const el2 = new GraphicElement(Type.ARROW, style); - GFX.setDestination(el2, x, y, w, h, dst, dst_type, dst_id); - - el.x1 = el2.x2; - el.y1 = el.y2; - g.push(el.clone()); - - el2.x1 = el.x1; - el2.y1 = el.y1; - g.push(el2.clone()); - } - - private static toSameSideH1Ver( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style, - idx: number - ) { - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - el.x2 = - x + - gfxconstants.switchbox_x1 + - (gfxconstants.switchbox_x2 - gfxconstants.switchbox_x1) / 2 - - gfxconstants.wire_distance * idx; - el.y2 = el.y1; - g.push(el.clone()); - - const el2 = new GraphicElement(Type.ARROW, style); - GFX.setDestination(el2, x, y, w, h, dst, dst_type, dst_id); - - el.x1 = el.x2; - el.y1 = el2.y2; - g.push(el.clone()); - - el2.x1 = el.x1; - el2.y1 = el.y1; - g.push(el2.clone()); - } - - private static toSameSideVer( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style, - idx: number - ) { - const sign: number = src_type == dst_type ? 1 : -1; - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - el.x2 = - x + - gfxconstants.switchbox_x1 + - (gfxconstants.switchbox_x2 - gfxconstants.switchbox_x1) / 2 + - sign * gfxconstants.wire_distance * idx; - el.y2 = el.y1; - g.push(el.clone()); - - const el2 = new GraphicElement(Type.ARROW, style); - GFX.setDestination(el2, x, y, w, h, dst, dst_type, dst_id); - - el.x1 = el.x2; - el.y1 = el2.y2; - g.push(el.clone()); - - el2.x1 = el.x1; - el2.y1 = el.y1; - g.push(el2.clone()); - } - - private static lutPermPip( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId - ) { - let gap = Math.floor((src_id - GfxTileWireId.TILE_WIRE_FCO) / 24); - el.x1 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length_lut; - el.y1 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (src_id - GfxTileWireId.TILE_WIRE_FCO + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - el.x2 = src.location.x + gfxconstants.slice_x1 - gfxconstants.wire_length; - el.y2 = - src.location.y + - gfxconstants.slice_y2 - - gfxconstants.wire_distance * (dst_id - GfxTileWireId.TILE_WIRE_FCO_SLICE + 1 + gap * 2) + - 3 * gfxconstants.slice_pitch; - g.push(el.clone()); - } - - private static toSameSideH1Hor( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style, - idx: number - ) { - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - - const el2 = new GraphicElement(Type.ARROW, style); - GFX.setDestination(el2, x, y, w, h, dst, dst_type, dst_id); - if ( - dst_type == ConstIncs.WIRE_TYPE_H01 || - src_type == ConstIncs.WIRE_TYPE_V01 || - dst_type == ConstIncs.WIRE_TYPE_H00 - ) { - el.x2 = el.x1; - el.y2 = el2.y2; - g.push(el.clone()); - } else { - el.x2 = el2.x2; - el.y2 = el.y1; - g.push(el.clone()); - } - - el2.x1 = el.x2; - el2.y1 = el.y2; - g.push(el2.clone()); - } - - private static toSameSideHor( - g: GraphicElement[], - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style, - idx: number - ) { - const sign: number = src_type == dst_type ? 1 : -1; - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - el.x2 = el.x1; - el.y2 = - y + - gfxconstants.switchbox_y1 + - Math.floor((gfxconstants.switchbox_y2 - gfxconstants.switchbox_y1) / 2) + - sign * gfxconstants.wire_distance * idx; - g.push(el.clone()); - - const el2 = new GraphicElement(Type.ARROW, style); - GFX.setDestination(el2, x, y, w, h, dst, dst_type, dst_id); - - el.x1 = el2.x2; - el.y1 = el.y2; - g.push(el.clone()); - - el2.x1 = el.x1; - el2.y1 = el.y1; - g.push(el2.clone()); - } - - private static straightLine( - el: GraphicElement, - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId - ) { - GFX.setSource(el, x, y, w, h, src, src_type, src_id); - GFX.setDestination(el, x, y, w, h, dst, dst_type, dst_id); - } - - public static tilePip( - x: number, - y: number, - w: number, - h: number, - src: WireId, - src_type: ConstIncs, - src_id: GfxTileWireId, - dst: WireId, - dst_type: ConstIncs, - dst_id: GfxTileWireId, - style: Style - ): Array { - const ret: Array = []; - let el = new GraphicElement(Type.Line, style); - el.type = Type.ARROW; - el.style = style; - - // To H00 - if (src_type == ConstIncs.WIRE_TYPE_V02 && dst_type == ConstIncs.WIRE_TYPE_H00) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H00L0000 + 30 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_H02 && dst_type == ConstIncs.WIRE_TYPE_H00) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - // To H01 - if (src_type == ConstIncs.WIRE_TYPE_H06 && dst_type == ConstIncs.WIRE_TYPE_H01) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H01E0001 - ); - } - - // To H02 - if (src_type == ConstIncs.WIRE_TYPE_H01 && dst_type == ConstIncs.WIRE_TYPE_H02) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H02W0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_H02 && dst_type == ConstIncs.WIRE_TYPE_H02) { - GFX.toSameSideHor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_H02W0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_H06 && dst_type == ConstIncs.WIRE_TYPE_H02) { - GFX.toSameSideHor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_H06W0303 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V01 && dst_type == ConstIncs.WIRE_TYPE_H02) { - if (y == src.location.y) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } else { - GFX.toSameSideV1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H02W0701 - ); - } - } - if (src_type == ConstIncs.WIRE_TYPE_V02 && dst_type == ConstIncs.WIRE_TYPE_H02) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if (src_type == ConstIncs.WIRE_TYPE_V06 && dst_type == ConstIncs.WIRE_TYPE_H02) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - // To H06 - if (src_type == ConstIncs.WIRE_TYPE_H01 && dst_type == ConstIncs.WIRE_TYPE_H06) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H06W0303 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_H02 && dst_type == ConstIncs.WIRE_TYPE_H06) { - GFX.toSameSideHor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_H02W0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_H06 && dst_type == ConstIncs.WIRE_TYPE_H06) { - GFX.toSameSideHor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_H06W0303 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V01 && dst_type == ConstIncs.WIRE_TYPE_H06) { - if (y == src.location.y) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } else { - GFX.toSameSideV1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_H06W0303 - ); - } - } - if (src_type == ConstIncs.WIRE_TYPE_V06 && dst_type == ConstIncs.WIRE_TYPE_H06) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - // To V00 - if (src_type == ConstIncs.WIRE_TYPE_V02 && dst_type == ConstIncs.WIRE_TYPE_V00) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if (src_type == ConstIncs.WIRE_TYPE_H02 && dst_type == ConstIncs.WIRE_TYPE_V00) { - GFX.toSameSideV1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_H02W0701 + 20 - ); - } - - // To V01 - if (src_type == ConstIncs.WIRE_TYPE_V06 && dst_type == ConstIncs.WIRE_TYPE_V01) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_V01N0001 - ); - } - - // To V02 - if (src_type == ConstIncs.WIRE_TYPE_H01 && dst_type == ConstIncs.WIRE_TYPE_V02) { - if (x == src.location.x) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_V02N0701 - ); - } else { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - } - if (src_type == ConstIncs.WIRE_TYPE_H02 && dst_type == ConstIncs.WIRE_TYPE_V02) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if (src_type == ConstIncs.WIRE_TYPE_H06 && dst_type == ConstIncs.WIRE_TYPE_V02) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if (src_type == ConstIncs.WIRE_TYPE_V01 && dst_type == ConstIncs.WIRE_TYPE_V02) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_V02N0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V02 && dst_type == ConstIncs.WIRE_TYPE_V02) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_V02N0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V06 && dst_type == ConstIncs.WIRE_TYPE_V02) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_V06N0303 - ); - } - - // To V06 - if (src_type == ConstIncs.WIRE_TYPE_H01 && dst_type == ConstIncs.WIRE_TYPE_V06) { - if (x == src.location.x) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_V06N0303 - ); - } else { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - } - if (src_type == ConstIncs.WIRE_TYPE_H06 && dst_type == ConstIncs.WIRE_TYPE_V06) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if (src_type == ConstIncs.WIRE_TYPE_V01 && dst_type == ConstIncs.WIRE_TYPE_V06) { - GFX.toSameSideH1Hor( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_V06N0303 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V02 && dst_type == ConstIncs.WIRE_TYPE_V06) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_V02N0701 - ); - } - if (src_type == ConstIncs.WIRE_TYPE_V06 && dst_type == ConstIncs.WIRE_TYPE_V06) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_V06N0303 - ); - } - - if ( - src_type == ConstIncs.WIRE_TYPE_H00 && - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_FCO && - dst_id <= GfxTileWireId.TILE_WIRE_FCI - ) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_FCO - ); - } - if ( - src_type == ConstIncs.WIRE_TYPE_H00 && - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && - dst_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_JCE0 - ); - } - if ( - src_type == ConstIncs.WIRE_TYPE_H01 && - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_FCO && - dst_id <= GfxTileWireId.TILE_WIRE_FCI - ) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_FCO - ); - } - if ( - src_type == ConstIncs.WIRE_TYPE_H01 && - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && - dst_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.toSameSideH1Ver( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - dst_id - GfxTileWireId.TILE_WIRE_JCE0 - ); - } - - if ( - (src_type == ConstIncs.WIRE_TYPE_H02 || - src_type == ConstIncs.WIRE_TYPE_V00 || - src_type == ConstIncs.WIRE_TYPE_V01 || - src_type == ConstIncs.WIRE_TYPE_V02) && - dst_type == ConstIncs.WIRE_TYPE_NONE && - ((dst_id >= GfxTileWireId.TILE_WIRE_FCO && dst_id <= GfxTileWireId.TILE_WIRE_FCI) || - (dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && dst_id <= GfxTileWireId.TILE_WIRE_JQ7)) - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - (dst_type == ConstIncs.WIRE_TYPE_H02 || - dst_type == ConstIncs.WIRE_TYPE_V00 || - dst_type == ConstIncs.WIRE_TYPE_V01 || - dst_type == ConstIncs.WIRE_TYPE_V02) && - src_type == ConstIncs.WIRE_TYPE_NONE && - ((src_id >= GfxTileWireId.TILE_WIRE_FCO && src_id <= GfxTileWireId.TILE_WIRE_FCI) || - (src_id >= GfxTileWireId.TILE_WIRE_JCE0 && src_id <= GfxTileWireId.TILE_WIRE_JQ7)) - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_FCO && - dst_id <= GfxTileWireId.TILE_WIRE_FCI && - src_type == ConstIncs.WIRE_TYPE_NONE && - src_id >= GfxTileWireId.TILE_WIRE_FCO && - src_id <= GfxTileWireId.TILE_WIRE_FCI - ) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_FCO - ); - } - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && - dst_id <= GfxTileWireId.TILE_WIRE_JCE0 && - src_type == ConstIncs.WIRE_TYPE_NONE && - src_id >= GfxTileWireId.TILE_WIRE_JCE0 && - src_id <= GfxTileWireId.TILE_WIRE_JCE0 - ) { - GFX.toSameSideVer( - ret, - el, - x, - y, - w, - h, - src, - src_type, - src_id, - dst, - dst_type, - dst_id, - style, - src_id - GfxTileWireId.TILE_WIRE_JCE0 - ); - } - - if (dst_type == ConstIncs.WIRE_TYPE_SLICE && src_type == ConstIncs.WIRE_TYPE_NONE) { - if ( - src_id >= GfxTileWireId.TILE_WIRE_FCO && - src_id <= GfxTileWireId.TILE_WIRE_FCI && - dst_id >= GfxTileWireId.TILE_WIRE_FCO_SLICE && - dst_id <= GfxTileWireId.TILE_WIRE_FCI_SLICE - ) { - // LUT permutation pseudo-pip - let src_purpose = (src_id - GfxTileWireId.TILE_WIRE_FCO) % 24; - let dst_purpose = (dst_id - GfxTileWireId.TILE_WIRE_FCO_SLICE) % 24; - if ( - src_purpose >= GfxTileWireId.TILE_WIRE_D7 - GfxTileWireId.TILE_WIRE_FCO && - src_purpose <= GfxTileWireId.TILE_WIRE_A6 - GfxTileWireId.TILE_WIRE_FCO && - dst_purpose >= GfxTileWireId.TILE_WIRE_D7_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE && - dst_purpose <= GfxTileWireId.TILE_WIRE_A6_SLICE - GfxTileWireId.TILE_WIRE_FCO_SLICE - ) { - // lutPermPip(g, el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - } - } - } - - if ( - src_type == ConstIncs.WIRE_TYPE_NONE && - (dst_type == ConstIncs.WIRE_TYPE_PLL || - dst_type == ConstIncs.WIRE_TYPE_GSR || - dst_type == ConstIncs.WIRE_TYPE_JTAG || - dst_type == ConstIncs.WIRE_TYPE_OSC || - dst_type == ConstIncs.WIRE_TYPE_SED || - dst_type == ConstIncs.WIRE_TYPE_DTR || - dst_type == ConstIncs.WIRE_TYPE_EXTREF || - dst_type == ConstIncs.WIRE_TYPE_DCU || - dst_type == ConstIncs.WIRE_TYPE_PCSCLKDIV || - dst_type == ConstIncs.WIRE_TYPE_DDRDLL || - dst_type == ConstIncs.WIRE_TYPE_CCLK || - dst_type == ConstIncs.WIRE_TYPE_DQS || - dst_type == ConstIncs.WIRE_TYPE_IOLOGIC || - dst_type == ConstIncs.WIRE_TYPE_SIOLOGIC || - dst_type == ConstIncs.WIRE_TYPE_EBR || - dst_type == ConstIncs.WIRE_TYPE_MULT18 || - dst_type == ConstIncs.WIRE_TYPE_ALU54) && - src_id >= GfxTileWireId.TILE_WIRE_JCE0 && - src_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - (src_type == ConstIncs.WIRE_TYPE_PLL || - src_type == ConstIncs.WIRE_TYPE_GSR || - src_type == ConstIncs.WIRE_TYPE_JTAG || - src_type == ConstIncs.WIRE_TYPE_OSC || - src_type == ConstIncs.WIRE_TYPE_SED || - src_type == ConstIncs.WIRE_TYPE_DTR || - src_type == ConstIncs.WIRE_TYPE_EXTREF || - src_type == ConstIncs.WIRE_TYPE_DCU || - src_type == ConstIncs.WIRE_TYPE_PCSCLKDIV || - src_type == ConstIncs.WIRE_TYPE_DDRDLL || - src_type == ConstIncs.WIRE_TYPE_CCLK || - src_type == ConstIncs.WIRE_TYPE_DQS || - src_type == ConstIncs.WIRE_TYPE_IOLOGIC || - src_type == ConstIncs.WIRE_TYPE_SIOLOGIC || - src_type == ConstIncs.WIRE_TYPE_EBR || - src_type == ConstIncs.WIRE_TYPE_MULT18 || - src_type == ConstIncs.WIRE_TYPE_ALU54) && - dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && - dst_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - if ( - src_type == ConstIncs.WIRE_TYPE_NONE && - (dst_type == ConstIncs.WIRE_TYPE_IOLOGIC || - dst_type == ConstIncs.WIRE_TYPE_SIOLOGIC || - dst_type == ConstIncs.WIRE_TYPE_PIO) && - src_id >= GfxTileWireId.TILE_WIRE_JDIA && - src_id <= GfxTileWireId.TILE_WIRE_ECLKD - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - (src_type == ConstIncs.WIRE_TYPE_IOLOGIC || - src_type == ConstIncs.WIRE_TYPE_SIOLOGIC || - src_type == ConstIncs.WIRE_TYPE_PIO) && - dst_id >= GfxTileWireId.TILE_WIRE_JDIA && - dst_id <= GfxTileWireId.TILE_WIRE_ECLKD - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - src_type == ConstIncs.WIRE_TYPE_NONE && - dst_type == ConstIncs.WIRE_TYPE_NONE && - src_id >= GfxTileWireId.TILE_WIRE_JDIA && - src_id <= GfxTileWireId.TILE_WIRE_ECLKD && - dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && - dst_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - src_type == ConstIncs.WIRE_TYPE_NONE && - dst_id >= GfxTileWireId.TILE_WIRE_JDIA && - dst_id <= GfxTileWireId.TILE_WIRE_ECLKD && - src_id >= GfxTileWireId.TILE_WIRE_JCE0 && - src_id <= GfxTileWireId.TILE_WIRE_JQ7 - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - if ( - dst_type == ConstIncs.WIRE_TYPE_NONE && - src_type == ConstIncs.WIRE_TYPE_G_HPBX && - ((dst_id >= GfxTileWireId.TILE_WIRE_JCE0 && dst_id <= GfxTileWireId.TILE_WIRE_JQ7) || - (dst_id >= GfxTileWireId.TILE_WIRE_CLK0 && dst_id <= GfxTileWireId.TILE_WIRE_FCI)) - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - if ( - (dst_type == ConstIncs.WIRE_TYPE_H01 || dst_type == ConstIncs.WIRE_TYPE_V01) && - src_type == ConstIncs.WIRE_TYPE_G_HPBX - ) { - GFX.straightLine(el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id); - ret.push(el.clone()); - } - - return ret; - } -} diff --git a/lib/src/gfx/ecp5/consts.rs b/lib/src/gfx/ecp5/consts.rs new file mode 100644 index 0000000..d3716a9 --- /dev/null +++ b/lib/src/gfx/ecp5/consts.rs @@ -0,0 +1,40 @@ +#![allow(dead_code, non_upper_case_globals)] +pub const switchbox_x1: f64 = 0.51; +pub const switchbox_x2: f64 = 0.9; +pub const switchbox_y1: f64 = 0.51; +pub const switchbox_y2: f64 = 0.9; + +pub const dll_cell_x1: f64 = 0.2; +pub const dll_cell_x2: f64 = 0.8; +pub const dll_cell_y1: f64 = 0.2; +pub const dll_cell_y2: f64 = 0.8; + +pub const io_cell_v_x1: f64 = 0.76; +pub const io_cell_v_x2: f64 = 0.95; +pub const io_cell_v_y1: f64 = 0.05; +pub const io_cell_gap: f64 = 0.1; +pub const io_cell_h_x1: f64 = 0.05; +pub const io_cell_h_y1: f64 = 0.05; +pub const io_cell_h_y2: f64 = 0.24; + +pub const slice_x1: f64 = 0.92; +pub const slice_x2: f64 = 0.94; +pub const slice_x2_wide: f64 = 0.97; +pub const slice_y1: f64 = 0.71; +pub const slice_y2: f64 = 0.745 + 0.0068; +pub const slice_pitch: f64 = 0.0374 + 0.0068; + +pub const slice_comb_dx1: f64 = 0.002; +pub const slice_comb_w: f64 = 0.007; +pub const slice_ff_dx1: f64 = 0.011; +pub const slice_ff_w: f64 = 0.007; +pub const slice_comb_dy1: f64 = 0.002; +pub const slice_comb_h: f64 = 0.014; +pub const slice_comb_dy2: f64 = 0.021; + +pub const wire_distance: f64 = 0.0017; +pub const wire_distance_small: f64 = 0.00085; + +pub const wire_length_lut: f64 = 0.01; +pub const wire_length: f64 = 0.005; +pub const wire_length_long: f64 = 0.015; diff --git a/lib/src/gfx/ecp5/gfx.rs b/lib/src/gfx/ecp5/gfx.rs new file mode 100644 index 0000000..1eb1036 --- /dev/null +++ b/lib/src/gfx/ecp5/gfx.rs @@ -0,0 +1,2787 @@ +/* +* nextpnr -- Next Generation Place and Route +* +* Copyright (C) 2018 Claire Xenia Wolf +* Copyright (C) 2019 Miodrag Milanovic +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +* +* Source: https://github.com/YosysHQ/nextpnr/blob/9c2d96f86ed56b77c9c325041b67654f26308270/ecp5/gfx.cc +*/ +#![allow(non_upper_case_globals)] + +use super::consts; +use super::tilewire; +use crate::gfx; + +const slice_x1: f64 = 0.92; +const slice_x2: f64 = 0.94; +const slice_x2_wide: f64 = 0.97; +const slice_y1: f64 = 0.71; +const slice_y2: f64 = 0.745 + 0.0068; +const slice_pitch: f64 = 0.0374 + 0.0068; + +const slice_comb_dx1: f64 = 0.002; +const slice_comb_w: f64 = 0.007; +const slice_ff_dx1: f64 = 0.011; +const slice_ff_w: f64 = 0.007; +const slice_comb_dy1: f64 = 0.002; +const slice_comb_h: f64 = 0.014; +const slice_comb_dy2: f64 = 0.021; + +const io_cell_v_x1: f64 = 0.76; +const io_cell_v_x2: f64 = 0.95; +const io_cell_v_y1: f64 = 0.05; +const io_cell_gap: f64 = 0.10; +const io_cell_h_x1: f64 = 0.05; +const io_cell_h_y1: f64 = 0.05; +const io_cell_h_y2: f64 = 0.24; + +const wire_distance: f64 = 0.0017; +const wire_distance_small: f64 = 0.00085; + +const wire_length_lut: f64 = 0.01; +const wire_length: f64 = 0.005; +const wire_length_long: f64 = 0.015; + +const dll_cell_x1: f64 = 0.2; +const dll_cell_x2: f64 = 0.8; +const dll_cell_y1: f64 = 0.2; +const dll_cell_y2: f64 = 0.8; + +const lc_idx_shift: i32 = 2; + +pub struct WireId { + pub location: Location, +} + +pub struct Location { + pub x: f64, + pub y: f64, +} + +pub fn tile_bel( + x: f64, + y: f64, + z: i32, + _w: i32, + h: i32, + bel_type: &gfx::ConstId, + style: &gfx::Style, +) -> Vec { + let mut g = vec![]; + let mut el = gfx::GraphicElement::new(gfx::Type::Box, style.clone()); + + if bel_type == &gfx::ConstId::TRELLIS_COMB { + let lc = z >> lc_idx_shift; + + el.x1 = x + slice_x1 + slice_comb_dx1; + el.x2 = el.x1 + slice_comb_w; + el.y1 = y + + slice_y1 + + (lc / 2) as f64 * slice_pitch + + (if lc % 2 != 0 { + slice_comb_dy2 + } else { + slice_comb_dy1 + }); + el.y2 = el.y1 + slice_comb_h; + g.push(el); + + el.style = gfx::Style::Frame; + + if (lc % 2) == 0 { + // SLICE frame + el.x1 = x + slice_x1; + el.x2 = x + slice_x2; + el.y1 = y + slice_y1 + (lc / 2) as f64 * slice_pitch; + el.y2 = y + slice_y2 + (lc / 2) as f64 * slice_pitch; + g.push(el); + + // SLICE control set switchbox + el.x1 = x + slice_x2 + 15.0 * wire_distance; + el.x2 = el.x1 + wire_distance; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_CLK3_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 5 + + (3 - (lc / 2)) * 26) as f64 + + 3.0 * slice_pitch + - 0.0007; + el.y2 = el.y1 + wire_distance * 5.0; + g.push(el); + } + + // LUT permutation switchbox + el.x1 = x + slice_x1 - wire_length_lut; + el.x2 = x + slice_x1 - wire_length; + let start_wire = + tilewire::GfxTileWireId::TILE_WIRE_D7 as i32 + 24 * (lc / 2) + 4 * (lc % 2); + el.y2 = y + slice_y2 + - wire_distance + * (start_wire - tilewire::GfxTileWireId::TILE_WIRE_FCO as i32 + 1 + (lc / 2) * 2) + as f64 + + 3.0 * slice_pitch + + 0.25 * wire_distance; + el.y1 = el.y2 - 3.5 * wire_distance; + g.push(el); + } else if bel_type == &gfx::ConstId::TRELLIS_FF { + let lc = z >> lc_idx_shift; + el.x1 = x + slice_x1 + slice_ff_dx1; + el.x2 = el.x1 + slice_ff_w; + el.y1 = y + + slice_y1 + + (lc / 2) as f64 * slice_pitch + + (if lc % 2 != 0 { + slice_comb_dy2 + } else { + slice_comb_dy1 + }); + el.y2 = el.y1 + slice_comb_h; + g.push(el); + } else if bel_type == &gfx::ConstId::TRELLIS_IO + || bel_type == &gfx::ConstId::IOLOGIC + || bel_type == &gfx::ConstId::SIOLOGIC + || bel_type == &gfx::ConstId::DQSBUFM + { + let top_bottom = y as i32 == 0 || y as i32 == (h - 1); + if top_bottom { + el.x1 = x + io_cell_h_x1 + (z + 2) as f64 * io_cell_gap; + el.x2 = x + io_cell_h_x1 + (z + 2) as f64 * io_cell_gap + 0.08; + if y as i32 == h - 1 { + el.y1 = y + 1.0 - io_cell_h_y1; + el.y2 = y + 1.0 - io_cell_h_y2; + } else { + el.y1 = y + io_cell_h_y1; + el.y2 = y + io_cell_h_y2; + } + } else { + if x as i32 == 0 { + el.x1 = x as f64 + 1.0 - io_cell_v_x1; + el.x2 = x as f64 + 1.0 - io_cell_v_x2; + } else { + el.x1 = x + io_cell_v_x1; + el.x2 = x + io_cell_v_x2; + } + el.y1 = y + io_cell_v_y1 + z as f64 * io_cell_gap; + el.y2 = y + io_cell_v_y1 + z as f64 * io_cell_gap + 0.08; + } + g.push(el); + } else if bel_type == &gfx::ConstId::DCCA { + el.x1 = x + consts::switchbox_x1 + z as f64 * 0.025; + el.y1 = y + 0.14; + el.x2 = x + consts::switchbox_x1 + z as f64 * 0.025 + 0.020; + el.y2 = y + 0.18; + g.push(el); + } else if bel_type == &gfx::ConstId::DP16KD + || bel_type == &gfx::ConstId::MULT18X18D + || bel_type == &gfx::ConstId::ALU54B + { + el.x1 = x + slice_x1; + el.x2 = x + slice_x2_wide; + el.y1 = y + slice_y1 - 1.0 * slice_pitch; + el.y2 = y + slice_y2 + 3.0 * slice_pitch; + g.push(el); + } else if bel_type == &gfx::ConstId::EHXPLLL { + el.x1 = x + slice_x1; + el.x2 = x + slice_x2_wide; + el.y1 = y + slice_y1; + el.y2 = y + slice_y2; + g.push(el); + } else if bel_type == &gfx::ConstId::DCUA { + el.x1 = x + slice_x1; + el.x2 = x + slice_x2_wide; + el.y1 = y + slice_y2; + el.y2 = y + 0.25; + g.push(el); + } else if bel_type == &gfx::ConstId::EXTREFB + || bel_type == &gfx::ConstId::PCSCLKDIV + || bel_type == &gfx::ConstId::DTR + || bel_type == &gfx::ConstId::USRMCLK + || bel_type == &gfx::ConstId::SEDGA + || bel_type == &gfx::ConstId::GSR + || bel_type == &gfx::ConstId::JTAGG + || bel_type == &gfx::ConstId::OSCG + { + el.x1 = x + slice_x1; + el.x2 = x + slice_x2_wide; + el.y1 = y + slice_y1 + z as f64 * slice_pitch; + el.y2 = y + slice_y2 + z as f64 * slice_pitch; + g.push(el); + } else if bel_type == &gfx::ConstId::DDRDLL { + el.x1 = x + dll_cell_x1; + el.x2 = x + dll_cell_x2; + el.y1 = y + dll_cell_y1; + el.y2 = y + dll_cell_y2; + g.push(el); + } else if bel_type == &gfx::ConstId::DLLDELD + || bel_type == &gfx::ConstId::CLKDIVF + || bel_type == &gfx::ConstId::ECLKSYNCB + || bel_type == &gfx::ConstId::TRELLIS_ECLKBUF + || bel_type == &gfx::ConstId::ECLKBRIDGECS + { + el.x1 = x + 0.1 + z as f64 * 0.05; + el.x2 = x + 0.14 + z as f64 * 0.05; + el.y1 = y + 0.475; + el.y2 = y + 0.525; + g.push(el); + } + + return g; +} + +pub fn tile_wire( + x: f64, + y: f64, + w: i32, + h: i32, + wire_type: &gfx::ConstId, + tilewire: &tilewire::GfxTileWireId, + style: &gfx::Style, +) -> Vec { + let mut g: Vec = vec![]; + let mut el = gfx::GraphicElement::new(gfx::Type::Line, style.clone()); + + if wire_type == &gfx::ConstId::WIRE_TYPE_SLICE + && tilewire != &tilewire::GfxTileWireId::TILE_WIRE_NONE + { + if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_FCI_SLICE + { + let gap = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) / 24; + let item = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) % 24; + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE + 1 + gap * 2) + as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + // FX to F connection - top + if item + == (tilewire::GfxTileWireId::TILE_WIRE_FXD_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) + { + el.x2 = el.x1; + el.y2 = el.y1 - wire_distance; + g.push(el); + } + // F5 to F connection - bottom + if item + == (tilewire::GfxTileWireId::TILE_WIRE_F5D_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) + { + el.x2 = el.x1; + el.y2 = el.y1 + wire_distance; + g.push(el); + } + // connection between slices + if item + == (tilewire::GfxTileWireId::TILE_WIRE_FCID_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) + && tilewire != &tilewire::GfxTileWireId::TILE_WIRE_FCI_SLICE + { + el.x2 = el.x1; + el.y2 = el.y1 - wire_distance * 3.0; + g.push(el); + } + } + if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_WAD0A_SLICE + { + let gap = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2) / 12; + el.x1 = x + slice_x2 + wire_length; + el.x2 = x + slice_x2; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + 1 + gap * 14) + as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_H02 { + if x as i32 == 0 { + el.x1 = 0.9; + } else { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + } + el.x2 = el.x1; + el.y1 = y + consts::switchbox_y1; + el.y2 = y + consts::switchbox_y1 + - wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + if x as i32 != 0 && x as i32 != w - 1 { + g.push(el); + } + + if x as i32 == w - 2 { + el.x2 = x + 1.0 + 0.1; + } else { + el.x2 = x + + 1.0 + + consts::switchbox_x1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + } + el.y1 = el.y2; + if x as i32 != w - 1 { + g.push(el); + } + + el.x1 = el.x2; + el.y1 = y + consts::switchbox_y1; + if x as i32 != w - 1 && x as i32 != w - 2 { + g.push(el); + } + + if x as i32 == w - 1 { + el.x1 = x + 0.1; + } else { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + } + if x as i32 == 1 { + el.x2 = x - 1.0 + 0.9; + } else { + el.x2 = x - 1.0 + + consts::switchbox_x1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + } + el.y2 = y + consts::switchbox_y1 + - wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) as f64 + + 20.0 * (x as i32 % 3) as f64); + el.y1 = el.y2; + if x as i32 != 0 { + g.push(el); + } + + el.x1 = el.x2; + el.y1 = y + consts::switchbox_y1; + if x as i32 != 0 && x as i32 != 1 { + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_V02 { + if y as i32 == 0 { + el.y1 = 0.9; + } else { + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + } + el.y2 = el.y1; + el.x1 = x + consts::switchbox_x1; + el.x2 = x + consts::switchbox_x1 + - wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + if y as i32 != 0 && y as i32 != h - 1 { + g.push(el); + } + + if y as i32 == h - 2 { + el.y2 = y + 1.0 + 0.1; + } else { + el.y2 = y + + 1.0 + + consts::switchbox_y1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + } + el.x1 = el.x2; + if y as i32 != h - 1 { + g.push(el); + } + + el.y1 = el.y2; + el.x1 = x + consts::switchbox_x1; + if y as i32 != h - 1 && y as i32 != h - 2 { + g.push(el); + } + + if y as i32 == h - 1 { + el.y1 = y + 0.1; + } else { + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + } + if y as i32 == 1 { + el.y2 = y - 1.0 + 0.9; + } else { + el.y2 = y - 1.0 + + consts::switchbox_y1 + + wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + } + el.x2 = x + consts::switchbox_x1 + - wire_distance + * (20.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) as f64 + + 20.0 * (y as i32 % 3) as f64); + el.x1 = el.x2; + if y as i32 != 0 { + g.push(el); + } + + el.y1 = el.y2; + el.x1 = x + consts::switchbox_x1; + if y as i32 != 0 && y as i32 != 1 { + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_H06 { + if x as i32 == 0 { + el.x1 = 0.9; + } else { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + } + el.x2 = el.x1; + el.y1 = y + consts::switchbox_y1; + el.y2 = y + consts::switchbox_y1 + - wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + if x as i32 != 0 && x as i32 != w - 1 { + g.push(el); + } + + if x as i32 == w - 2 || x as i32 == w - 3 || x as i32 == w - 4 { + el.x2 = w as f64 - 1.0 + 0.1; + } else { + el.x2 = x + + 3.0 + + consts::switchbox_x1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + } + el.y1 = el.y2; + if x as i32 != w - 1 { + g.push(el); + } + + el.x1 = el.x2; + el.y1 = y + consts::switchbox_y1; + if x as i32 != w - 1 && x as i32 != w - 2 && x as i32 != w - 3 && x as i32 != w - 4 { + g.push(el); + } + + if x as i32 == w - 1 { + el.x1 = x + 0.1; + } else { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + } + if x as i32 == 1 || x as i32 == 2 || x as i32 == 3 { + el.x2 = 0.9; + } else { + el.x2 = x - 3.0 + + consts::switchbox_x1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + } + el.y2 = y + consts::switchbox_y1 + - wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) as f64 + + 10.0 * (x as i32 % 9) as f64); + el.y1 = el.y2; + if x as i32 != 0 { + g.push(el); + } + + el.x1 = el.x2; + el.y1 = y + consts::switchbox_y1; + if x as i32 != 0 && x as i32 != 1 && x as i32 != 2 && x as i32 != 3 { + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_V06 { + if y as i32 == 0 { + el.y1 = 0.9; + } else { + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + } + el.y2 = el.y1; + el.x1 = x + consts::switchbox_x1; + el.x2 = x + consts::switchbox_x1 + - wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + if y as i32 != 0 && y as i32 != h - 1 { + g.push(el); + } + + if y as i32 == h - 2 || y as i32 == h - 3 || y as i32 == h - 4 { + el.y2 = h as f64 - 1.0 + 0.1; + } else { + el.y2 = y + + 3.0 + + consts::switchbox_y1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + } + el.x1 = el.x2; + if y as i32 != h - 1 { + g.push(el); + } + + el.y1 = el.y2; + el.x1 = x + consts::switchbox_x1; + if y as i32 != h - 1 && y as i32 != h - 2 && y as i32 != h - 3 && y as i32 != h - 4 { + g.push(el); + } + + if y as i32 == h - 1 { + el.y1 = y + 0.1; + } else { + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + } + if y as i32 == 1 || y as i32 == 2 || y as i32 == 3 { + el.y2 = 0.9; + } else { + el.y2 = y - 3.0 + + consts::switchbox_y1 + + wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + } + el.x2 = x + consts::switchbox_x1 + - wire_distance + * (96.0 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) as f64 + + 10.0 * (y as i32 % 9) as f64); + el.x1 = el.x2; + if y as i32 != 0 { + g.push(el); + } + + el.y1 = el.y2; + el.x1 = x + consts::switchbox_x1; + if y as i32 != 0 && y as i32 != 1 && y as i32 != 2 && y as i32 != 3 { + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_V01 { + if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_V01N0001 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_V01S0100 + { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (10 + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V01N0001)) as f64; + el.x2 = el.x1; + if y as i32 == h - 2 { + el.y1 = y + 1.1; + } else { + el.y1 = y + consts::switchbox_y1 + 1.0; + } + + if y as i32 == 0 { + el.y2 = y + 0.9; + } else { + el.y2 = y + consts::switchbox_y2; + } + + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_H01 { + if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_H01E0001 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_HL7W0001 + { + if x as i32 == w - 1 { + el.x1 = x + 0.1; + } else { + el.x1 = x + consts::switchbox_x1; + } + if x as i32 == 1 { + el.x2 = x - 0.1; + } else { + el.x2 = x + consts::switchbox_x2 - 1.0; + } + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (10 + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H01E0001)) as f64; + el.y2 = el.y1; + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_V00 { + let group = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) / 2; + el.x1 = x + consts::switchbox_x2 + - wire_distance + * (8 - ((tilewire - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) % 2) * 4) as f64; + el.x2 = el.x1; + if group != 0 { + el.y1 = y + consts::switchbox_y1; + el.y2 = y + consts::switchbox_y1 - wire_distance * 4.0; + } else { + el.y1 = y + consts::switchbox_y2; + el.y2 = y + consts::switchbox_y2 + wire_distance * 4.0; + } + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_H00 { + let group = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) / 2; + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (8 - ((tilewire - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) % 2) * 4) as f64; + el.y2 = el.y1; + + if group != 0 { + el.x1 = x + consts::switchbox_x2 + wire_distance * 4.0; + el.x2 = x + consts::switchbox_x2; + } else { + el.x1 = x + consts::switchbox_x1 - wire_distance * 4.0; + el.x2 = x + consts::switchbox_x1; + } + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_NONE { + if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_NBOUNCE + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_SBOUNCE + { + el.x1 = x + consts::switchbox_x2 - wire_distance * 4.0; + el.x2 = x + consts::switchbox_x2 - wire_distance * 8.0; + if tilewire == &tilewire::GfxTileWireId::TILE_WIRE_NBOUNCE { + el.y1 = y + consts::switchbox_y2 + wire_distance * 4.0; + el.y2 = el.y1; + } else { + el.y1 = y + consts::switchbox_y1 - wire_distance * 4.0; + el.y2 = el.y1; + } + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_WBOUNCE + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_EBOUNCE + { + el.y1 = y + consts::switchbox_y1 + wire_distance * 4.0; + el.y2 = y + consts::switchbox_y1 + wire_distance * 8.0; + if tilewire == &tilewire::GfxTileWireId::TILE_WIRE_WBOUNCE { + el.x1 = x + consts::switchbox_x1 - wire_distance * 4.0; + el.x2 = el.x1; + } else { + el.x1 = x + consts::switchbox_x2 + wire_distance * 4.0; + el.x2 = el.x1; + } + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_CLK0 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_LSR1 + { + el.x1 = x + consts::switchbox_x2; + el.x2 = x + + slice_x2 + + 15.0 * wire_distance + + (8.0 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0) as f64) + * wire_distance; + el.y1 = y + slice_y2 + - wire_distance * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0 - 5) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + el.x1 = el.x2; + el.y2 = y + slice_y2 + - wire_distance + * (3.0 + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0) as f64); + g.push(el); + for i in 0..4 { + el.x1 = x + slice_x2 + 15.0 * wire_distance + wire_distance; + el.x2 = x + + slice_x2 + + 15.0 * wire_distance + + (8.0 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0) as f64) + * wire_distance; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_CLK3_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0)) + as f64 + + i as f64 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } + if tilewire == &tilewire::GfxTileWireId::TILE_WIRE_CLK1 + || tilewire == &tilewire::GfxTileWireId::TILE_WIRE_LSR1 + { + for i in 0..2 { + el.x1 = x + slice_x2 + 3.0 * wire_distance; + el.x2 = x + + slice_x2 + + 15.0 * wire_distance + + (8.0 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0) as f64) + * wire_distance; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_CLK3_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + - 1 + + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLK0) / 2) + as f64 + + i as f64 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } + } + } + // TRELLIS_IO wires + else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD + { + el.x1 = x + 0.5; + el.x2 = x + 0.5 + wire_length; + let top = y as i32 == (h - 1); + if top { + el.y1 = y + 1.0 + - (slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch); + } else { + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch; + } + el.y2 = el.y1; + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7 + { + el.x1 = x + consts::switchbox_x2; + el.x2 = x + consts::switchbox_x2 + wire_length; + el.y1 = y + slice_y2 + - wire_distance * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + 1) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_FCI + { + let gap = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO) / 24; + let purpose = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO) % 24; + el.x1 = x + consts::switchbox_x2; + if purpose + >= (tilewire::GfxTileWireId::TILE_WIRE_D7 - tilewire::GfxTileWireId::TILE_WIRE_FCO) + && purpose + <= (tilewire::GfxTileWireId::TILE_WIRE_A6 + - tilewire::GfxTileWireId::TILE_WIRE_FCO) + { + // Space for the LUT permutation switchbox + el.x2 = x + slice_x1 - wire_length_lut; + } else { + el.x2 = x + slice_x1 - wire_length; + } + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_FCO + 1 + gap * 2) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_MUXCLK3 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_MUXLSR0 + { + let gap = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_MUXCLK3) / 2; + let part = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_MUXCLK3) % 2; + el.x1 = x + slice_x2 + 3.0 * wire_distance; + el.x2 = x + slice_x2 + 15.0 * wire_distance; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_CLK3_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + part + + gap * 26) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_WD3 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_WD0 + { + let part = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_WD3) % 4; + let group = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_WD3) / 2; + el.x1 = x + slice_x2 + wire_length; + el.x2 = x + slice_x2 + wire_length + wire_distance * (4 - part) as f64; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_WDO3C_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + part + + 14) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + + el.x1 = el.x2; + el.y2 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_WD1B_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + (part & 1) + + 14 * 2) as f64 + + (3 - group) as f64 * slice_pitch; + g.push(el); + + el.x1 = x + slice_x2 + wire_length; + el.y1 = el.y2; + g.push(el); + } else if tilewire >= &tilewire::GfxTileWireId::TILE_WIRE_WAD3 + && tilewire <= &tilewire::GfxTileWireId::TILE_WIRE_WAD0 + { + let part = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_WAD3) % 4; + el.x1 = x + slice_x2 + wire_length; + el.x2 = x + slice_x2 + wire_length + wire_distance * (8 - part) as f64; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_WADO3C_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + part + + 14) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + + el.x1 = el.x2; + el.y2 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_WAD3B_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + part + + 14 * 2) as f64 + + 2.0 * slice_pitch; + g.push(el); + + el.x1 = x + slice_x2 + wire_length; + el.y1 = el.y2; + g.push(el); + + // middle line + el.x1 = x + slice_x2 + wire_length; + el.x2 = x + slice_x2 + wire_length + wire_distance * (8 - part) as f64; + el.y2 = y + slice_y2 + - wire_distance + * (tilewire::GfxTileWireId::TILE_WIRE_WAD3B_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_DUMMY_D2 + + 1 + + part + + 14 * 2) as f64 + + 3.0 * slice_pitch; + el.y1 = el.y2; + g.push(el); + } + } else if wire_type == &gfx::ConstId::WIRE_TYPE_G_HPBX { + el.x1 = x; + el.x2 = x + 1.0; + el.y1 = y + + 0.1 + + wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_G_HPBX0000 + 1) as f64; + el.y2 = el.y1; + g.push(el); + + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (200 + (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_G_HPBX0000)) as f64; + el.x2 = el.x1; + el.y2 = y + consts::switchbox_y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_G_VPTX { + el.x1 = x + + 0.1 + + wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_G_VPTX0000 + 1) as f64; + el.x2 = el.x1; + el.y1 = y; + el.y2 = y + 1.0; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_L_HPBX { + el.x1 = x - 3.0; + el.x2 = x + 0.08; + el.y1 = y + + wire_distance + + wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_L_HPBX0000 + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_R_HPBX { + el.x1 = x + 0.2; + el.x2 = x + 3.0; + el.y1 = y + + wire_distance + + wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_R_HPBX0000 + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_PIO { + let top_bottom = y as i32 == 0 || y as i32 == (h - 1); + let gap = 3 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) / 7; + let num = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) % 7; + if top_bottom { + el.x1 = x + + io_cell_h_x1 + + (gap + 2) as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + el.x2 = el.x1; + if y as i32 == h - 1 { + el.y1 = y + 1.0 - io_cell_h_y2; + el.y2 = el.y1 - wire_length_long; + } else { + el.y1 = y + io_cell_h_y2; + el.y2 = el.y1 + wire_length_long; + } + } else { + if x as i32 == 0 { + el.x1 = x + 1.0 - io_cell_v_x1; + el.x2 = el.x1 + wire_length_long; + } else { + el.x1 = x + io_cell_v_x1; + el.x2 = el.x1 - wire_length_long; + } + el.y1 = y + io_cell_v_y1 + gap as f64 * io_cell_gap + wire_distance * (num + 1) as f64; + el.y2 = el.y1; + } + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_DDRDLL { + let num = tilewire - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DDRDLL; + el.x1 = x + io_cell_h_x1 + 0.2 + wire_distance * (num + 1) as f64; + el.x2 = el.x1; + if y as i32 == h - 1 { + el.y1 = y + dll_cell_y1; + el.y2 = el.y1 - wire_length_long; + } else { + el.y1 = y + dll_cell_y2; + el.y2 = el.y1 + wire_length_long; + } + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_CCLK { + let num = tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JPADDI_CCLK; + el.x1 = x + slice_x1 + wire_distance * (num + 1) as f64; + el.x2 = el.x1; + el.y1 = y + slice_y2 - 1.0 * slice_pitch; + el.y2 = el.y1 - wire_length_long; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC { + let gap = 7 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) / 42; + let num = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) % 42; + if x as i32 == 0 { + el.x1 = x + 1.0 - io_cell_v_x1; + el.x2 = el.x1 + wire_length_long; + } else { + el.x1 = x + io_cell_v_x1; + el.x2 = el.x1 - wire_length_long; + } + el.y1 = y + io_cell_v_y1 + gap as f64 * io_cell_gap + wire_distance * (num + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC { + let gap = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) / 20; + let num = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) % 20; + el.x1 = + x + io_cell_h_x1 + (5 - gap) as f64 * io_cell_gap + wire_distance * (num + 1) as f64; + el.x2 = el.x1; + if y as i32 == h - 1 { + el.y1 = y + 1.0 - io_cell_h_y2; + el.y2 = el.y1 - wire_length_long; + } else { + el.y1 = y + io_cell_h_y2; + el.y2 = el.y1 + wire_length_long; + } + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_DQS { + let num = tilewire - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DQS; + if x as i32 == 0 { + el.x1 = x + 1.0 - io_cell_v_x1; + el.x2 = el.x1 + wire_length_long; + } else { + el.x1 = x + io_cell_v_x1; + el.x2 = el.x1 - wire_length_long; + } + el.y1 = y + io_cell_v_y1 + 8.0 * io_cell_gap + wire_distance * (num + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_EBR { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JADA0_EBR + 1) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_MULT18 { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance_small + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_MULT18 + 1) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_ALU54 { + let num = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) % 225; + let group = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) / 225; + if group == 0 { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + } else { + el.x1 = x + slice_x2_wide + wire_length; + el.x2 = x + slice_x2_wide; + } + el.y1 = y + slice_y2 - wire_distance_small * (num + 1) as f64 + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_PLL { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PLL + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_GSR { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JCLK_GSR + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_JTAG { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JJCE1_JTAG + 1) as f64 + + 1.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_OSC { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_OSC + 1) as f64 + + 2.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_SED { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_SED + 1) as f64 + + 3.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_DTR { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_JSTARTPULSE_DTR + 1) as f64; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_EXTREF { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_REFCLKP_EXTREF + 1) as f64 + + 1.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_DCU { + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 + - wire_distance + * (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CH0_RX_REFCLK_DCU + 1) as f64 + + 0.0 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } else if wire_type == &gfx::ConstId::WIRE_TYPE_PCSCLKDIV { + let num = (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) % 7; + let group = 1 - (tilewire - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) / 7; + el.x1 = x + slice_x1 - wire_length; + el.x2 = x + slice_x1; + el.y1 = y + slice_y2 - wire_distance * (num + 1) as f64 + group as f64 * slice_pitch; + el.y2 = el.y1; + g.push(el); + } + + return g; +} + +fn set_source( + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + _w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, +) { + if src_type == &gfx::ConstId::WIRE_TYPE_H00 { + let group = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) / 2; + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (8 - ((src_id - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) % 2) * 4) as f64; + + if group != 0 { + el.x1 = x + consts::switchbox_x2; + } else { + el.x1 = x + consts::switchbox_x1; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_H01 { + if x as i32 == src.location.x as i32 { + el.x1 = x + consts::switchbox_x1; + } else { + el.x1 = x + consts::switchbox_x2; + } + el.y1 = y + + consts::switchbox_y1 + + wire_distance * (10 + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_H01E0001)) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (20 + + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) + + 20 * (src.location.x as i32 % 3)) as f64; + el.y1 = y + consts::switchbox_y1; + } + if src_type == &gfx::ConstId::WIRE_TYPE_H06 { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (96 + + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) + + 10 * (src.location.x as i32 % 9)) as f64; + el.y1 = y + consts::switchbox_y1; + } + if src_type == &gfx::ConstId::WIRE_TYPE_V00 { + let group = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) / 2; + el.x1 = x + consts::switchbox_x2 + - wire_distance + * (8 - ((src_id - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) % 2) * 4) as f64; + if group != 0 { + el.y1 = y + consts::switchbox_y1; + } else { + el.y1 = y + consts::switchbox_y2; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_V01 { + el.x1 = x + + consts::switchbox_x1 + + wire_distance * (10 + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_V01N0001)) as f64; + if y as i32 == src.location.y as i32 { + el.y1 = y + consts::switchbox_y2; + } else { + el.y1 = y + consts::switchbox_y1; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_V02 { + el.x1 = x + consts::switchbox_x1; + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (20 + + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) + + 20 * (src.location.y as i32 % 3)) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_V06 { + el.x1 = x + consts::switchbox_x1; + el.y1 = y + + consts::switchbox_y1 + + wire_distance + * (96 + + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) + + 10 * (src.location.y as i32 % 9)) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_NONE { + if src_id >= &tilewire::GfxTileWireId::TILE_WIRE_CLK0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_LSR1 + { + el.x1 = x + consts::switchbox_x2; + el.y1 = y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_CLK0 - 5) as f64 + + 3.0 * slice_pitch; + } + if src_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI + { + let gap = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO) / 24; + el.x1 = src.location.x + consts::switchbox_x2; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO + 1 + gap * 2) as f64 + + 3.0 * slice_pitch; + } + if src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7 + { + el.x1 = src.location.x + consts::switchbox_x2 + wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + 1) as f64 + + 3.0 * slice_pitch; + } + if src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD + { + let top = src.location.y as i32 == (h - 1); + el.x1 = src.location.x + 0.5 + wire_length; + if top { + el.y1 = src.location.y + 1.0 + - (slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch); + } else { + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch; + } + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC { + let gap = 7 - (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) / 42; + let num = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) % 42; + if src.location.x as i32 == 0 { + el.x1 = src.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x1 = src.location.x + io_cell_v_x1 - wire_length_long; + } + el.y1 = src.location.y + + io_cell_v_y1 + + gap as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC { + let gap = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) / 20; + let num = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) % 20; + el.x1 = src.location.x + + io_cell_h_x1 + + (5 - gap) as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + if src.location.y as i32 == h - 1 { + el.y1 = src.location.y + 1.0 - io_cell_h_y2 - wire_length_long; + } else { + el.y1 = src.location.y + io_cell_h_y2 + wire_length_long; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_PIO { + let top_bottom = src.location.y as i32 == 0 || src.location.y as i32 == (h - 1); + let gap = 3 - (src_id - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) / 7; + let num = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) % 7; + if top_bottom { + el.x1 = src.location.x + + io_cell_h_x1 + + (gap + 2) as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + if src.location.y as i32 == h - 1 { + el.y1 = src.location.y + 1.0 - io_cell_h_y2 - wire_length_long; + } else { + el.y1 = src.location.y + 1.0 - io_cell_h_y2 + wire_length_long; + } + } else { + if x as i32 == 0 { + el.x1 = src.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x1 = src.location.x + io_cell_v_x1 - wire_length_long; + } + el.y1 = src.location.y + + io_cell_v_y1 + + gap as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_EBR { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JADA0_EBR + 1) as f64 + + 3.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_MULT18 { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance_small + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_MULT18 + 1) as f64 + + 3.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_ALU54 { + let num = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) % 225; + let group = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) / 225; + if group == 0 { + el.x1 = src.location.x + slice_x1 - wire_length; + } else { + el.x1 = src.location.x + slice_x2_wide + wire_length; + } + el.y1 = + src.location.y + slice_y2 - wire_distance_small * (num + 1) as f64 + 3.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_PLL { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PLL + 1) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_GSR { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK_GSR + 1) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_JTAG { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JJCE1_JTAG + 1) as f64 + + 1.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_OSC { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_OSC + 1) as f64 + + 2.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_SED { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_SED + 1) as f64 + + 3.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_DTR { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_JSTARTPULSE_DTR + 1) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_EXTREF { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_REFCLKP_EXTREF + 1) as f64 + + 1.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_DCU { + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 + - wire_distance + * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_CH0_RX_REFCLK_DCU + 1) as f64 + + 0.0 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_PCSCLKDIV { + let num = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) % 7; + let group = 1 - (src_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) / 7; + el.x1 = src.location.x + slice_x1 - wire_length; + el.y1 = src.location.y + slice_y2 - wire_distance * (num + 1) as f64 + + group as f64 * slice_pitch; + } + if src_type == &gfx::ConstId::WIRE_TYPE_DQS { + let num = src_id - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DQS; + if src.location.x as i32 == 0 { + el.x1 = src.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x1 = src.location.x + io_cell_v_x1 - wire_length_long; + } + el.y1 = + src.location.y + io_cell_v_y1 + 8.0 * io_cell_gap + wire_distance * (num + 1) as f64; + } + if src_type == &gfx::ConstId::WIRE_TYPE_DDRDLL { + let num = src_id - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DDRDLL; + el.x1 = src.location.x + io_cell_h_x1 + dll_cell_x1 + wire_distance * (num + 1) as f64; + if src.location.y as i32 == h - 1 { + el.y1 = src.location.y + dll_cell_y1 - wire_length_long; + } else { + el.y1 = src.location.y + dll_cell_y2 + wire_length_long; + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_CCLK { + let num = src_id - &tilewire::GfxTileWireId::TILE_WIRE_JPADDI_CCLK; + el.x1 = src.location.x + slice_x1 + wire_distance * (num + 1) as f64; + el.y1 = src.location.y + slice_y2 - 1.0 * slice_pitch - wire_length_long; + } + if src_type == &gfx::ConstId::WIRE_TYPE_G_HPBX { + el.x1 = x + + consts::switchbox_x1 + + wire_distance + * (200 + (src_id - &tilewire::GfxTileWireId::TILE_WIRE_G_HPBX0000)) as f64; + el.y1 = y + consts::switchbox_y1; + } +} + +fn set_destination( + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + _w: i32, + h: i32, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, +) { + if dst_type == &gfx::ConstId::WIRE_TYPE_H00 { + let group = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) / 2; + el.y2 = y + + consts::switchbox_y1 + + wire_distance + * (8 - ((dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000) % 2) * 4) as f64; + + if group != 0 { + el.x2 = x + consts::switchbox_x2; + } else { + el.x2 = x + consts::switchbox_x1; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_H01 { + if x == dst.location.x { + el.x2 = x + consts::switchbox_x1; + } else { + el.x2 = x + consts::switchbox_x2; + } + el.y2 = y + + consts::switchbox_y1 + + wire_distance * (10 + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H01E0001)) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + el.x2 = x + + consts::switchbox_x1 + + wire_distance + * (20 + + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701) + + 20 * (dst.location.x as i32 % 3)) as f64; + el.y2 = y + consts::switchbox_y1; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + el.x2 = x + + consts::switchbox_x1 + + wire_distance + * (96 + + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303) + + 10 * (dst.location.x as i32 % 9)) as f64; + el.y2 = y + consts::switchbox_y1; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_V00 { + let group = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) / 2; + el.x2 = x + consts::switchbox_x2 + - wire_distance + * (8 - ((dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V00T0000) % 2) * 4) as f64; + if group != 0 { + el.y2 = y + consts::switchbox_y1; + } else { + el.y2 = y + consts::switchbox_y2; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_V01 { + el.x2 = x + + consts::switchbox_x1 + + wire_distance * (10 + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V01N0001)) as f64; + if y as i32 == dst.location.y as i32 { + el.y2 = y + consts::switchbox_y2; + } else { + el.y2 = y + consts::switchbox_y1; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + el.x2 = x + consts::switchbox_x1; + el.y2 = y + + consts::switchbox_y1 + + wire_distance + * (20 + + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701) + + 20 * (dst.location.y as i32 % 3)) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + el.x2 = x + consts::switchbox_x1; + el.y2 = y + + consts::switchbox_y1 + + wire_distance + * (96 + + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303) + + 10 * (dst.location.y as i32 % 9)) as f64; + } + + if dst_type == &gfx::ConstId::WIRE_TYPE_NONE { + if dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_CLK0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_LSR1 + { + el.x2 = x + consts::switchbox_x2; + el.y2 = y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_CLK0 - 5) as f64 + + 3.0 * slice_pitch; + } + if dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI + { + let gap = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO) / 24; + el.x2 = x + consts::switchbox_x2; + el.y2 = y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO + 1 + gap * 2) as f64 + + 3.0 * slice_pitch; + } + if dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7 + { + el.x2 = dst.location.x + consts::switchbox_x2; + el.y2 = dst.location.y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + 1) as f64 + + 3.0 * slice_pitch; + } + if dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD + { + let top = dst.location.y as i32 == (h - 1); + el.x2 = dst.location.x + 0.5; + if top { + el.y2 = dst.location.y + 1.0 + - (slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch); + } else { + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JDIA + 1) as f64 + + 3.0 * slice_pitch; + } + } + } + + if dst_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC { + let gap = 7 - (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) / 42; + let num = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADND_IOLOGIC) % 42; + if dst.location.x as i32 == 0 { + el.x2 = dst.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x2 = dst.location.x + io_cell_v_x1 - wire_length_long; + } + el.y2 = dst.location.y + + io_cell_v_y1 + + gap as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC { + let gap = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) / 20; + let num = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JLOADNB_SIOLOGIC) % 20; + el.x2 = dst.location.x + + io_cell_h_x1 + + (5 - gap) as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + if dst.location.y as i32 == h - 1 { + el.y2 = dst.location.y + 1.0 - io_cell_h_y2 - wire_length_long; + } else { + el.y2 = dst.location.y + io_cell_h_y2 + wire_length_long; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_PIO { + let top_bottom = dst.location.y as i32 == 0 || dst.location.y as i32 == (h - 1); + let gap = 3 - (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) / 7; + let num = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_PADDOD_PIO) % 7; + if top_bottom { + el.x2 = dst.location.x + + io_cell_h_x1 + + (gap + 2) as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + if dst.location.y as i32 == h - 1 { + el.y2 = dst.location.y + 1.0 - io_cell_h_y2 - wire_length_long; + } else { + el.y2 = dst.location.y + 1.0 - io_cell_h_y2 + wire_length_long; + } + } else { + if x as i32 == 0 { + el.x2 = dst.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x2 = dst.location.x + io_cell_v_x1 - wire_length_long; + } + el.y2 = dst.location.y + + io_cell_v_y1 + + gap as f64 * io_cell_gap + + wire_distance * (num + 1) as f64; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_EBR { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JADA0_EBR + 1) as f64 + + 3.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_MULT18 { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance_small + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_MULT18 + 1) as f64 + + 3.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_ALU54 { + let num = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) % 225; + let group = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK0_ALU54) / 225; + if group == 0 { + el.x2 = dst.location.x + slice_x1 - wire_length; + } else { + el.x2 = dst.location.x + slice_x2_wide + wire_length; + } + el.y2 = + dst.location.y + slice_y2 - wire_distance_small * (num + 1) as f64 + 3.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_PLL { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PLL + 1) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_GSR { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCLK_GSR + 1) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_JTAG { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JJCE1_JTAG + 1) as f64 + + 1.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_OSC { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_OSC + 1) as f64 + + 2.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_SED { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_SEDSTDBY_SED + 1) as f64 + + 3.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_DTR { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JSTARTPULSE_DTR + 1) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_EXTREF { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_REFCLKP_EXTREF + 1) as f64 + + 1.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_DCU { + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_CH0_RX_REFCLK_DCU + 1) as f64 + + 0.0 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_PCSCLKDIV { + let num = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) % 7; + let group = 1 - (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_CLKI_PCSCLKDIV1) / 7; + el.x2 = dst.location.x + slice_x1 - wire_length; + el.y2 = dst.location.y + slice_y2 - wire_distance * (num + 1) as f64 + + group as f64 * slice_pitch; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_DQS { + let num = dst_id - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DQS; + if dst.location.x as i32 == 0 { + el.x2 = dst.location.x + 1.0 - io_cell_v_x1 + wire_length_long; + } else { + el.x2 = dst.location.x + io_cell_v_x1 - wire_length_long; + } + el.y2 = + dst.location.y + io_cell_v_y1 + 8.0 * io_cell_gap + wire_distance * (num + 1) as f64; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_DDRDLL { + let num = dst_id - &tilewire::GfxTileWireId::TILE_WIRE_DDRDEL_DDRDLL; + el.x2 = dst.location.x + io_cell_h_x1 + dll_cell_x1 + wire_distance * (num + 1) as f64; + if dst.location.y as i32 == h - 1 { + el.y2 = dst.location.y + dll_cell_y1 - wire_length_long; + } else { + el.y2 = dst.location.y + dll_cell_y2 + wire_length_long; + } + } + if dst_type == &gfx::ConstId::WIRE_TYPE_CCLK { + let num = dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JPADDI_CCLK; + el.x2 = dst.location.x + slice_x1 + wire_distance * (num + 1) as f64; + el.y2 = dst.location.y + slice_y2 - 1.0 * slice_pitch - wire_length_long; + } + if dst_type == &gfx::ConstId::WIRE_TYPE_G_HPBX { + el.x2 = x + + consts::switchbox_x1 + + wire_distance + * (200 + (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_G_HPBX0000)) as f64; + el.y2 = y + consts::switchbox_y1; + } +} + +fn straight_line( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, +) { + set_source(el, x, y, w, h, src, src_type, src_id); + set_destination(el, x, y, w, h, dst, dst_type, dst_id); + g.push(*el); +} + +fn lut_perm_pip( + g: &mut Vec, + el: &mut gfx::GraphicElement, + _x: f64, + _y: f64, + _w: i32, + _h: i32, + src: &WireId, + _src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + _dst: &WireId, + _dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, +) { + let gap = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO) / 24; + el.x1 = src.location.x + slice_x1 - wire_length_lut; + el.y1 = src.location.y + slice_y2 + - wire_distance * (src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO + 1 + gap * 2) as f64 + + 3.0 * slice_pitch; + el.x2 = src.location.x + slice_x1 - wire_length; + el.y2 = src.location.y + slice_y2 + - wire_distance + * (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE + 1 + gap * 2) as f64 + + 3.0 * slice_pitch; + g.push(*el); +} + +fn to_same_side_hor( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, + idx: i32, +) { + let sign = if src_type == dst_type { 1 } else { -1 }; + set_source(el, x, y, w, h, src, src_type, src_id); + el.x2 = el.x1; + el.y2 = y + + consts::switchbox_y1 + + (consts::switchbox_y2 - consts::switchbox_y1) / 2.0 + + sign as f64 * wire_distance * idx as f64; + g.push(*el); + + let mut el2 = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + set_destination(&mut el2, x, y, w, h, dst, dst_type, dst_id); + + el.x1 = el2.x2; + el.y1 = el.y2; + g.push(*el); + + el2.x1 = el.x1; + el2.y1 = el.y1; + g.push(el2); +} + +fn to_same_side_ver( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, + idx: i32, +) { + let sign = if src_type == dst_type { 1 } else { -1 }; + set_source(el, x, y, w, h, src, src_type, src_id); + el.x2 = x + + consts::switchbox_x1 + + (consts::switchbox_x2 - consts::switchbox_x1) / 2.0 + + sign as f64 * wire_distance * idx as f64; + el.y2 = el.y1; + g.push(*el); + + let mut el2 = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + set_destination(&mut el2, x, y, w, h, dst, dst_type, dst_id); + + el.x1 = el.x2; + el.y1 = el2.y2; + g.push(*el); + + el2.x1 = el.x1; + el2.y1 = el.y1; + g.push(el2); +} + +fn to_same_side_h1_ver( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, + idx: i32, +) { + set_source(el, x, y, w, h, src, src_type, src_id); + el.x2 = x + consts::switchbox_x1 + (consts::switchbox_x2 - consts::switchbox_x1) / 2.0 + - wire_distance * idx as f64; + el.y2 = el.y1; + g.push(*el); + + let mut el2 = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + set_destination(&mut el2, x, y, w, h, dst, dst_type, dst_id); + + el.x1 = el.x2; + el.y1 = el2.y2; + g.push(*el); + + el2.x1 = el.x1; + el2.y1 = el.y1; + g.push(el2); +} + +fn to_same_side_h1_hor( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, + _idx: i32, +) { + set_source(el, x, y, w, h, src, src_type, src_id); + + let mut el2 = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + set_destination(&mut el2, x, y, w, h, dst, dst_type, dst_id); + if dst_type == &gfx::ConstId::WIRE_TYPE_H01 + || src_type == &gfx::ConstId::WIRE_TYPE_V01 + || dst_type == &gfx::ConstId::WIRE_TYPE_H00 + { + el.x2 = el.x1; + el.y2 = el2.y2; + g.push(*el); + } else { + el.x2 = el2.x2; + el.y2 = el.y1; + g.push(*el); + } + + el2.x1 = el.x2; + el2.y1 = el.y2; + g.push(el2); +} + +fn to_same_side_v1_ver( + g: &mut Vec, + el: &mut gfx::GraphicElement, + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, + idx: i32, +) { + set_source(el, x, y, w, h, src, src_type, src_id); + el.x2 = el.x1; + el.y2 = y + consts::switchbox_y1 + (consts::switchbox_y2 - consts::switchbox_y1) / 2.0 + - wire_distance * idx as f64; + g.push(*el); + + let mut el2 = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + set_destination(&mut el2, x, y, w, h, dst, dst_type, dst_id); + + el.x1 = el2.x2; + el.y1 = el.y2; + g.push(*el); + + el2.x1 = el.x1; + el2.y1 = el.y1; + g.push(el2); +} + +pub fn tile_pip( + x: f64, + y: f64, + w: i32, + h: i32, + src: &WireId, + src_type: &gfx::ConstId, + src_id: &tilewire::GfxTileWireId, + dst: &WireId, + dst_type: &gfx::ConstId, + dst_id: &tilewire::GfxTileWireId, + style: &gfx::Style, +) -> Vec { + let mut g: Vec = vec![]; + let mut el = gfx::GraphicElement::new(gfx::Type::Arrow, style.clone()); + + // To H00 + if src_type == &gfx::ConstId::WIRE_TYPE_V02 && dst_type == &gfx::ConstId::WIRE_TYPE_H00 { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H00L0000 + 30, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 && dst_type == &gfx::ConstId::WIRE_TYPE_H00 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + // To H01 + if src_type == &gfx::ConstId::WIRE_TYPE_H06 && dst_type == &gfx::ConstId::WIRE_TYPE_H01 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H01E0001, + ); + } + + // To H02 + if src_type == &gfx::ConstId::WIRE_TYPE_H01 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + to_same_side_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H06 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + to_same_side_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V01 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + if y == src.location.y { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } else { + to_same_side_v1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701, + ); + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_V02 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V06 && dst_type == &gfx::ConstId::WIRE_TYPE_H02 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + // To H06 + if src_type == &gfx::ConstId::WIRE_TYPE_H01 && dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 && dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + to_same_side_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H06 && dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + to_same_side_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V01 && dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + if y == src.location.y { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } else { + to_same_side_v1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_H06W0303, + ); + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_V06 && dst_type == &gfx::ConstId::WIRE_TYPE_H06 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + // To V00 + if src_type == &gfx::ConstId::WIRE_TYPE_V02 && dst_type == &gfx::ConstId::WIRE_TYPE_V00 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 && dst_type == &gfx::ConstId::WIRE_TYPE_V00 { + to_same_side_v1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_H02W0701 + 20, + ); + } + + // To V01 + if src_type == &gfx::ConstId::WIRE_TYPE_V06 && dst_type == &gfx::ConstId::WIRE_TYPE_V01 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V01N0001, + ); + } + + // To V02 + if src_type == &gfx::ConstId::WIRE_TYPE_H01 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + if x == src.location.x { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701, + ); + } else { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_H02 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H06 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V01 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V02 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V06 && dst_type == &gfx::ConstId::WIRE_TYPE_V02 { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303, + ); + } + + // To V06 + if src_type == &gfx::ConstId::WIRE_TYPE_H01 && dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + if x == src.location.x { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303, + ); + } else { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + } + if src_type == &gfx::ConstId::WIRE_TYPE_H06 && dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V01 && dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + to_same_side_h1_hor( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V02 && dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_V02N0701, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_V06 && dst_type == &gfx::ConstId::WIRE_TYPE_V06 { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_V06N0303, + ); + } + + if src_type == &gfx::ConstId::WIRE_TYPE_H00 + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H00 + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCE0, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H01 + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_H01 + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + to_same_side_h1_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + dst_id - &tilewire::GfxTileWireId::TILE_WIRE_JCE0, + ); + } + + if (src_type == &gfx::ConstId::WIRE_TYPE_H02 + || src_type == &gfx::ConstId::WIRE_TYPE_V00 + || src_type == &gfx::ConstId::WIRE_TYPE_V01 + || src_type == &gfx::ConstId::WIRE_TYPE_V02) + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && ((dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + || (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7)) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if (dst_type == &gfx::ConstId::WIRE_TYPE_H02 + || dst_type == &gfx::ConstId::WIRE_TYPE_V00 + || dst_type == &gfx::ConstId::WIRE_TYPE_V01 + || dst_type == &gfx::ConstId::WIRE_TYPE_V02) + && src_type == &gfx::ConstId::WIRE_TYPE_NONE + && ((src_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + || (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7)) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + if dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + && src_type == &gfx::ConstId::WIRE_TYPE_NONE + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI) + { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO, + ); + } + if dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JCE0) + && src_type == &gfx::ConstId::WIRE_TYPE_NONE + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_JCE0) + { + to_same_side_ver( + &mut g, + &mut el, + x, + y, + w, + h, + src, + src_type, + src_id, + dst, + dst_type, + dst_id, + style, + src_id - &tilewire::GfxTileWireId::TILE_WIRE_JCE0, + ); + } + + if dst_type == &gfx::ConstId::WIRE_TYPE_SLICE && src_type == &gfx::ConstId::WIRE_TYPE_NONE { + if src_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI + && dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI_SLICE + { + // LUT permutation pseudo-pip + let src_purpose = (src_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO) % 24; + let dst_purpose = (dst_id - &tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) % 24; + if src_purpose + >= (tilewire::GfxTileWireId::TILE_WIRE_D7 - tilewire::GfxTileWireId::TILE_WIRE_FCO) + && src_purpose + <= (tilewire::GfxTileWireId::TILE_WIRE_A6 + - tilewire::GfxTileWireId::TILE_WIRE_FCO) + && dst_purpose + >= (tilewire::GfxTileWireId::TILE_WIRE_D7_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) + && dst_purpose + <= (tilewire::GfxTileWireId::TILE_WIRE_A6_SLICE + - tilewire::GfxTileWireId::TILE_WIRE_FCO_SLICE) + { + lut_perm_pip( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + } + } + + if (src_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_type == &gfx::ConstId::WIRE_TYPE_PLL + || dst_type == &gfx::ConstId::WIRE_TYPE_GSR + || dst_type == &gfx::ConstId::WIRE_TYPE_JTAG + || dst_type == &gfx::ConstId::WIRE_TYPE_OSC + || dst_type == &gfx::ConstId::WIRE_TYPE_SED + || dst_type == &gfx::ConstId::WIRE_TYPE_DTR + || dst_type == &gfx::ConstId::WIRE_TYPE_EXTREF + || dst_type == &gfx::ConstId::WIRE_TYPE_DCU + || dst_type == &gfx::ConstId::WIRE_TYPE_PCSCLKDIV + || dst_type == &gfx::ConstId::WIRE_TYPE_DDRDLL + || dst_type == &gfx::ConstId::WIRE_TYPE_CCLK + || dst_type == &gfx::ConstId::WIRE_TYPE_DQS + || dst_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC + || dst_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC + || dst_type == &gfx::ConstId::WIRE_TYPE_EBR + || dst_type == &gfx::ConstId::WIRE_TYPE_MULT18 + || dst_type == &gfx::ConstId::WIRE_TYPE_ALU54)) + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if (dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (src_type == &gfx::ConstId::WIRE_TYPE_PLL + || src_type == &gfx::ConstId::WIRE_TYPE_GSR + || src_type == &gfx::ConstId::WIRE_TYPE_JTAG + || src_type == &gfx::ConstId::WIRE_TYPE_OSC + || src_type == &gfx::ConstId::WIRE_TYPE_SED + || src_type == &gfx::ConstId::WIRE_TYPE_DTR + || src_type == &gfx::ConstId::WIRE_TYPE_EXTREF + || src_type == &gfx::ConstId::WIRE_TYPE_DCU + || src_type == &gfx::ConstId::WIRE_TYPE_PCSCLKDIV + || src_type == &gfx::ConstId::WIRE_TYPE_DDRDLL + || src_type == &gfx::ConstId::WIRE_TYPE_CCLK + || src_type == &gfx::ConstId::WIRE_TYPE_DQS + || src_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC + || src_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC + || src_type == &gfx::ConstId::WIRE_TYPE_EBR + || src_type == &gfx::ConstId::WIRE_TYPE_MULT18 + || src_type == &gfx::ConstId::WIRE_TYPE_ALU54)) + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + if (src_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC + || dst_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC + || dst_type == &gfx::ConstId::WIRE_TYPE_PIO)) + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if (dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (src_type == &gfx::ConstId::WIRE_TYPE_IOLOGIC + || src_type == &gfx::ConstId::WIRE_TYPE_SIOLOGIC + || src_type == &gfx::ConstId::WIRE_TYPE_PIO)) + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if src_type == &gfx::ConstId::WIRE_TYPE_NONE + && dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD) + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && src_type == &gfx::ConstId::WIRE_TYPE_NONE + && (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JDIA + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_ECLKD) + && (src_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && src_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + if dst_type == &gfx::ConstId::WIRE_TYPE_NONE + && src_type == &gfx::ConstId::WIRE_TYPE_G_HPBX + && ((dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_JCE0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_JQ7) + || (dst_id >= &tilewire::GfxTileWireId::TILE_WIRE_CLK0 + && dst_id <= &tilewire::GfxTileWireId::TILE_WIRE_FCI)) + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + if (dst_type == &gfx::ConstId::WIRE_TYPE_H01 || dst_type == &gfx::ConstId::WIRE_TYPE_V01) + && src_type == &gfx::ConstId::WIRE_TYPE_G_HPBX + { + straight_line( + &mut g, &mut el, x, y, w, h, src, src_type, src_id, dst, dst_type, dst_id, + ); + } + + return g; +} diff --git a/lib/src/gfx/ecp5/mod.rs b/lib/src/gfx/ecp5/mod.rs new file mode 100644 index 0000000..23c0810 --- /dev/null +++ b/lib/src/gfx/ecp5/mod.rs @@ -0,0 +1,7 @@ +mod gfx; +mod tilewire; + +pub mod consts; + +pub use gfx::{tile_bel, tile_pip, tile_wire, Location, WireId}; +pub use tilewire::GfxTileWireId; diff --git a/lib/src/gfx/tilewire.ecp5.gfx.ts b/lib/src/gfx/ecp5/tilewire.rs similarity index 99% rename from lib/src/gfx/tilewire.ecp5.gfx.ts rename to lib/src/gfx/ecp5/tilewire.rs index 7810c1c..b986ac9 100644 --- a/lib/src/gfx/tilewire.ecp5.gfx.ts +++ b/lib/src/gfx/ecp5/tilewire.rs @@ -1,5 +1,42 @@ -export enum GfxTileWireId { - TILE_WIRE_NONE, +#![allow(non_camel_case_types)] +use std::{convert::TryFrom, ops::Sub}; + +use anyhow::{Error, Result}; +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; + +impl Sub for &GfxTileWireId { + type Output = i32; + + fn sub(self, rhs: Self) -> Self::Output { + (*self as Self::Output) - (*rhs as Self::Output) + } +} + +impl Sub for GfxTileWireId { + type Output = i32; + + fn sub(self, rhs: Self) -> Self::Output { + (self as Self::Output) - (rhs as Self::Output) + } +} + +impl TryFrom for GfxTileWireId { + type Error = Error; + + fn try_from(val: u32) -> Result { + return match FromPrimitive::from_u32(val) { + Some(res) => Ok(res), + None => Err(Error::msg("Could not derive GfxTileWireId from value")), + }; + } +} + +#[derive(Clone, Copy, PartialEq, PartialOrd, FromPrimitive)] +#[repr(u32)] +#[allow(dead_code)] +pub enum GfxTileWireId { + TILE_WIRE_NONE = 0, TILE_WIRE_FCO_SLICE, TILE_WIRE_D7_SLICE, @@ -3665,5 +3702,5 @@ export enum GfxTileWireId { TILE_WIRE_RXREFCLK1, TILE_WIRE_SYNCECLK0, TILE_WIRE_SYNCECLK1, - TILE_WIRE_Z_DLLDEL + TILE_WIRE_Z_DLLDEL, } diff --git a/lib/src/gfx/gfx.ts b/lib/src/gfx/gfx.ts deleted file mode 100644 index 8c37f93..0000000 --- a/lib/src/gfx/gfx.ts +++ /dev/null @@ -1,31 +0,0 @@ -import {Style} from './styles'; -import {Type} from './types'; - -export class GraphicElement { - constructor( - public type: Type = Type.Box, - public style: Style = Style.Inactive, - public color: string | null = null, - public x1: number = 0, - public x2: number = 0, - public y1: number = 0, - public y2: number = 0, - public z: number = 0, - - public text: string = '' - ) {} - - public clone(): GraphicElement { - return new GraphicElement( - this.type, - this.style, - this.color, - this.x1, - this.x2, - this.y1, - this.y2, - this.z, - this.text - ); - } -} diff --git a/lib/src/gfx/mod.rs b/lib/src/gfx/mod.rs new file mode 100644 index 0000000..7d53928 --- /dev/null +++ b/lib/src/gfx/mod.rs @@ -0,0 +1,7 @@ +mod constids; +pub mod ecp5; +mod types; + +pub use types::{Color, GraphicElement, Style, Type}; + +pub use constids::ConstId; diff --git a/lib/src/gfx/styles.ts b/lib/src/gfx/styles.ts deleted file mode 100644 index 9a7889e..0000000 --- a/lib/src/gfx/styles.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum Style { - Active, - Inactive, - Frame, - Hidden -} diff --git a/lib/src/gfx/types.rs b/lib/src/gfx/types.rs new file mode 100644 index 0000000..4164350 --- /dev/null +++ b/lib/src/gfx/types.rs @@ -0,0 +1,107 @@ +/* + * nextpnr -- Next Generation Place and Route + * + * Copyright (C) 2018 Claire Xenia Wolf + * Copyright (C) 2018 Serge Bazanski + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Source: https://github.com/YosysHQ/nextpnr/blob/9c2d96f86ed56b77c9c325041b67654f26308270/common/kernel/nextpnr_base_types.h + */ + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] +#[allow(dead_code)] +pub enum Type { + None, + Line, + Arrow, + Box, + FilledBox, + Circle, + Label, + LocalArrow, // Located entirely within the cell boundaries, coordinates in the range [0., 1.] + LocalLine, +} + +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] +#[allow(dead_code)] +pub enum Style { + Grid, + Frame, // Static "frame". Contrast between Inactive and Active + Hidden, // Only display when object is selected or highlighted + Inactive, // Render using low-contrast color + Active, // Render using high-contrast color + + // UI highlight groups + Highlighted0, + Highlighted1, + Highlighted2, + Highlighted3, + Highlighted4, + Highlighted5, + Highlighted6, + Highlighted7, + + Selected, + Hover, +} + +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +pub struct Color { + pub r: u8, + pub g: u8, + pub b: u8, +} + +impl Color { + pub fn float_r(&self) -> f32 { + return f32::max(0.0, f32::min(255.0, self.r as f32)) / 255.0; + } + + pub fn float_g(&self) -> f32 { + return f32::max(0.0, f32::min(255.0, self.g as f32)) / 255.0; + } + + pub fn float_b(&self) -> f32 { + return f32::max(0.0, f32::min(255.0, self.b as f32)) / 255.0; + } +} + +#[derive(Debug, Clone, Copy)] +pub struct GraphicElement { + pub r#type: Type, + pub style: Style, + pub color: Option, + pub x1: f64, + pub y1: f64, + pub x2: f64, + pub y2: f64, + pub z: f64, +} + +impl GraphicElement { + pub fn new(r#type: Type, style: Style) -> Self { + GraphicElement { + r#type, + style, + color: None, + x1: 0.0, + y1: 0.0, + x2: 0.0, + y2: 0.0, + z: 0.0, + } + } +} diff --git a/lib/src/gfx/types.ts b/lib/src/gfx/types.ts deleted file mode 100644 index fb166fb..0000000 --- a/lib/src/gfx/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum Type { - Box, - FilledBox, - Line, - ARROW, - LOCAL_LINE, - LOCAL_ARROW -} diff --git a/lib/src/index.ts b/lib/src/index.ts index acc46e6..ba55b47 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -1,4 +1,244 @@ -import {NextPNRViewer} from './viewer'; -import {ViewerConfig} from './viewer.interface'; +import wasmInit, {Color, ViewerECP5, ColorConfig as RendererColorConfig, NextpnrJson, CellColorConfig} from 'nextpnr-renderer'; -export default (div: HTMLDivElement, config: Partial) => new NextPNRViewer(div, config); +export {NextpnrJson}; + +// **** Auxiliary types **** +export const SUPPORTED_DEVICES = { + ecp5: ['25k', '45k', '85k'], +}; +export type SupportedFamily = keyof typeof SUPPORTED_DEVICES; + +interface Chip { + family: Family; + device: typeof SUPPORTED_DEVICES[Family][number]; +} +export type SupportedChip = Chip; + + +// **** Config **** +type ColorConfig = { + active: string; + inactive: string; + frame: string; + background: string; +}; + +export type ViewerConfig = { + width: number; + height: number; + createToggles: boolean; + colors: ColorConfig; + cellColors: Record; + chip: SupportedChip; +}; + +export const defaultConfig: ViewerConfig = { + width: 1280, + height: 720, + createToggles: true, + colors: { + active: '#F8F8F2', + inactive: '#6272A4', + frame: '#BD93F9', + background: '#282A36' + }, + cellColors: {}, + chip: { + family: 'ecp5', + device: '25k' + } +}; + + +// **** Internal functions **** +type ChipDatabases = { + [Family in SupportedFamily]: { + [Device in typeof SUPPORTED_DEVICES[Family][number]]: URL; + }; +}; +const CHIP_DBS: ChipDatabases = { + "ecp5": { + "25k": new URL(`../static/chipdb/ecp5/25k.bin`, import.meta.url), + "45k": new URL(`../static/chipdb/ecp5/45k.bin`, import.meta.url), + "85k": new URL(`../static/chipdb/ecp5/85k.bin`, import.meta.url), + } +} + +function getChipDbUrl(chip: SupportedChip) { + const url = (CHIP_DBS[chip.family] ?? {})[chip.device]; + if (url === undefined) { + throw new Error(`Could not find chip database for ${chip.family}:${chip.device}!`) + } + + return url; +} + +async function getChipDb(url: URL): Promise { + let chipdb = await fetch(url).then((resp) => resp.arrayBuffer()); + return new Uint8Array(chipdb); +} + +let colCanvas: CanvasRenderingContext2D | null; +function fromCssColor(colorStr: string): Color { + if (!colCanvas) { + colCanvas = document.createElement('canvas').getContext('2d'); + } + if (!colCanvas) throw new Error('Could not create canvas to convert color'); + + + colCanvas.fillStyle = colorStr; + const col = colCanvas.fillStyle.replace('#', ''); + + const rstr = col.slice(0,2); + const gstr = col.slice(2,4); + const bstr = col.slice(4,6); + + return {r: parseInt(rstr, 16), g: parseInt(gstr, 16), b: parseInt(bstr, 16)}; +} + +let animFrameId: number | null = null; +function doInAnimFrame(f: () => void) { + if (animFrameId != null) window.cancelAnimationFrame(animFrameId); + + animFrameId = window.requestAnimationFrame(() => { + f(); + + animFrameId = null; + }) +} + +type Viewer = ViewerECP5; +const VIEWERS = { + 'ecp5': ViewerECP5 +} +function getViewer(family: Family): typeof VIEWERS[Family] { + let viewer = VIEWERS[family]; + if (viewer === undefined) { + throw new Error(`Could not find suitable viewer for ${family}`); + } + + return viewer; +} + +let initialized = false; +async function init() { + if (!initialized) { + await wasmInit(); + initialized = true; + } +} + +// **** External API **** +export function isSupported(family: Family, device: typeof SUPPORTED_DEVICES[Family][number]): boolean { + const devices = SUPPORTED_DEVICES[family] ?? []; + return devices.includes(device); +} + +export class NextPNRViewer { + private config: ViewerConfig; + private viewer: Promise; + + private container: HTMLDivElement; + private canvas: HTMLCanvasElement; + + constructor(container: HTMLDivElement, config?: Partial) { + this.config = {...defaultConfig, ...config}; + + // Separate functions so we can throw an error prematurely instead of in the promise + const url = getChipDbUrl(this.config.chip); + const viewer = getViewer(this.config.chip.family); + const colors: RendererColorConfig = { + active: fromCssColor(this.config.colors.active), + inactive: fromCssColor(this.config.colors.inactive), + frame: fromCssColor(this.config.colors.frame), + background: fromCssColor(this.config.colors.background) + }; + const cellColors: CellColorConfig = Object.fromEntries( + Object.entries(this.config.cellColors).map( + ([cell, colorStr]) => [cell, fromCssColor(colorStr)] + ) + ); + + this.container = container; + this.canvas = this._createCanvas(container); + + this.viewer = init().then(() => getChipDb(url).then((db) => new viewer(this.canvas, db, colors, cellColors))); + this.viewer.then(() => this._addEventListeners(this.canvas)); + }; + + async render() { + const viewer = await this.viewer; + + viewer.render(); + } + + async showJson(json: NextpnrJson) { + json = (typeof json === 'string') ? JSON.parse(json) : json; + + const viewer = await this.viewer; + + viewer.show_json(json); + } + + async resize(width: number, height: number) { + this.canvas.width = width; + this.canvas.height = height; + + await this.render(); + } + + private _createCanvas(container: HTMLDivElement): HTMLCanvasElement { + const elem = document.createElement('canvas'); + elem.style.width = '100%'; + elem.style.height = '100%'; + elem.style.aspectRatio = '16 / 9'; + + elem.width = this.config.width; + elem.height = this.config.height; + + container.innerHTML = ''; + container.appendChild(elem); + + return elem; + } + + private async _addEventListeners(canvas: HTMLCanvasElement) { + const viewer = await this.viewer; + + let down = false; + let firstEvent = true; + let oldx = 0; + let oldy = 0; + + // Zoom + canvas.addEventListener('wheel', (e) => { + e.preventDefault(); + if (e.deltaY === 0) return; + doInAnimFrame(() => viewer.zoom( + e.deltaY > 0 ? 0.05 : -0.05, + e.clientX - canvas.offsetLeft, + e.clientY - canvas.offsetTop + )); + }); + + // Pan + canvas.addEventListener('mousedown', (_) => { + down = true; + firstEvent = true; + }); + canvas.addEventListener('mouseup', (_) => { + down = false; + }); + canvas.addEventListener('mousemove', (e) => doInAnimFrame(() => { + if (down) { + if (!firstEvent) { + viewer.pan(e.clientX - oldx, e.clientY - oldy); + } + + firstEvent = false; + oldx = e.clientX; + oldy = e.clientY; + } + })); + } +} diff --git a/lib/src/lib.rs b/lib/src/lib.rs new file mode 100644 index 0000000..45234c6 --- /dev/null +++ b/lib/src/lib.rs @@ -0,0 +1,18 @@ +mod architecture; +mod chipdb; +mod decal; +mod gfx; +mod pnrjson; +mod renderer; +mod utils; +mod viewer; +mod webgl; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(start)] +fn start() { + utils::set_panic_hook(); +} + +pub use viewer::ViewerECP5; diff --git a/lib/src/pnr-json/pnr-json.ts b/lib/src/pnr-json/pnr-json.ts deleted file mode 100644 index 860dc17..0000000 --- a/lib/src/pnr-json/pnr-json.ts +++ /dev/null @@ -1,85 +0,0 @@ -type RoutingPart = { - wire: string; - pip: string; - strength: number; -}; - -type BEL = { - nextpnrBel: string; - cellType: string | undefined; -}; - -type ElementNames = { - wire: string[]; - group: string[]; - bel: BEL[]; - pip: ReturnType[]; -}; - -export class NextpnrJSON { - public static load(json: object): ElementNames { - const cells = (json as any).modules.top.cells; - const netnames = (json as any).modules.top.netnames; - - const bels = Object.keys(cells).map((v) => ({ - nextpnrBel: cells[v].attributes.NEXTPNR_BEL, - cellType: cells[v].attributes.cellType - })); - - const routings = Object.keys(netnames) - .map((v) => netnames[v].attributes.ROUTING) - .map(NextpnrJSON.parseRouting); - - return { - wire: routings.map((r) => r.wire).flat(), - group: [], - bel: bels, - pip: routings.map((r) => r.pip.map(this.parsePip)).flat() - }; - } - - static parseRouting = (routing: string) => { - const strs = routing.split(';'); - - const routingParts: RoutingPart[] = []; - - for (let i = 0; i < Math.floor(strs.length / 3); ++i) { - const wire = strs[i * 3]; - const pip = strs[i * 3 + 1]; - const strength = parseInt(strs[i * 3 + 2], 10); - - routingParts.push({wire, pip, strength}); - } - - return { - wire: routingParts.map((part) => part.wire), - pip: routingParts.map((part) => part.pip).filter((s) => s.length !== 0) - }; - }; - - static parsePip = (pip: string) => { - let [x_str, y_str, pip_str] = pip.split('/'); - x_str = x_str.slice(1); - y_str = y_str.slice(1); - - const [pip_from, pip_to] = pip_str.split('->'); - - const parseFromTo = (s: string) => { - const [x, y, ...rest] = s.split('_'); - return { - location: {x: parseInt(x, 10), y: parseInt(y, 10)}, - name: rest.join('_') - }; - }; - - return { - location: { - x: parseInt(x_str, 10), - y: parseInt(y_str, 10) - }, - pip_from: parseFromTo(pip_from), - pip_to: parseFromTo(pip_to), - pip_name: pip - }; - }; -} diff --git a/lib/src/pnrjson/mod.rs b/lib/src/pnrjson/mod.rs new file mode 100644 index 0000000..04582d1 --- /dev/null +++ b/lib/src/pnrjson/mod.rs @@ -0,0 +1,128 @@ +mod types_rs; +mod types_ts; + +use types_rs::Netname; + +use anyhow::{Error, Result}; + +pub use types_rs::NextpnrJson; +pub use types_ts::INextpnrJSON; + +use crate::architecture::{Pip, PipLocation}; + +pub struct NextpnrBel<'a> { + pub nextpnr_bel: &'a String, + pub cell_type: &'a Option, +} + +pub struct NextpnrElements<'a> { + pub wires: Vec, + pub groups: Vec, + pub bels: Vec>, + pub pips: Vec, +} + +pub struct RoutingPart { + wire_id: String, + pip: PipFromTo, +} + +#[derive(Clone)] +pub struct PipFromTo { + pub location: PipLocation, + pub from: Pip, + pub to: Pip, + pub name: String, +} + +fn parse_pip(s: String) -> Option { + let parts: Vec<_> = s.splitn(3, '_').collect(); + return Some(Pip { + location: PipLocation { + x: parts.get(0)?.parse().ok()?, + y: parts.get(1)?.parse().ok()?, + }, + name: parts.get(2)?.to_string(), + }); +} + +fn parse_pip_from_to(s: String) -> Option { + let parts: Vec<_> = s.splitn(3, '/').collect(); + let x = match parts.get(0)? { + &"" => return None, + x_str => x_str[1..].parse().ok()?, + }; + let y = match parts.get(1)? { + &"" => return None, + y_str => y_str[1..].parse().ok()?, + }; + + let pip_parts: Vec<_> = parts.get(2)?.splitn(2, "->").collect(); + let pip_from = parse_pip(pip_parts.get(0)?.to_string())?; + let pip_to = parse_pip(pip_parts.get(1)?.to_string())?; + + return Some(PipFromTo { + location: PipLocation { x, y }, + from: pip_from, + to: pip_to, + name: s, + }); +} + +impl Netname { + pub fn get_routing(&self) -> Vec { + let parts: Vec<&str> = self.attributes.ROUTING.split(';').collect(); + return parts + .chunks(3) + .filter_map(|c| { + Some(RoutingPart { + wire_id: c.get(0)?.to_string(), + pip: parse_pip_from_to(c.get(1)?.to_string())?, + }) + }) + .collect(); + } +} + +impl NextpnrJson { + pub fn from_jsobj(val: INextpnrJSON) -> Result { + match serde_wasm_bindgen::from_value(val.into()) { + Ok(r) => anyhow::Ok(r), + Err(e) => return Err(Error::msg(e.to_string())), + } + } + + pub fn get_elements(&self) -> NextpnrElements<'_> { + let bels = self.get_bels(); + let all_routings = self.get_all_routings(); + + return NextpnrElements { + wires: all_routings.iter().map(|r| r.wire_id.clone()).collect(), + groups: vec![], + bels, + pips: all_routings.iter().map(|r| r.pip.clone()).collect(), + }; + } + + fn get_all_routings(&self) -> Vec { + self.modules + .top + .netnames + .values() + .map(Netname::get_routing) + .flatten() + .collect() + } + + fn get_bels(&self) -> Vec { + self.modules + .top + .cells + .values() + .map(|cell| NextpnrBel { + nextpnr_bel: &cell.attributes.NEXTPNR_BEL, + cell_type: &cell.attributes.cellType, + }) + .collect() + } +} diff --git a/lib/src/pnrjson/types_rs.rs b/lib/src/pnrjson/types_rs.rs new file mode 100644 index 0000000..48ed51a --- /dev/null +++ b/lib/src/pnrjson/types_rs.rs @@ -0,0 +1,42 @@ +#![allow(non_snake_case)] + +use std::collections::HashMap; + +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct CellAttributes { + pub NEXTPNR_BEL: String, + pub cellType: Option, +} + +#[derive(Deserialize)] +pub struct Cell { + pub attributes: CellAttributes, +} + +#[derive(Deserialize)] +pub struct NetnameAttributes { + pub ROUTING: String, +} + +#[derive(Deserialize)] +pub struct Netname { + pub attributes: NetnameAttributes, +} + +#[derive(Deserialize)] +pub struct Top { + pub cells: HashMap, + pub netnames: HashMap, +} + +#[derive(Deserialize)] +pub struct Modules { + pub top: Top, +} + +#[derive(Deserialize)] +pub struct NextpnrJson { + pub modules: Modules, +} diff --git a/lib/src/pnrjson/types_ts.rs b/lib/src/pnrjson/types_ts.rs new file mode 100644 index 0000000..29daf5f --- /dev/null +++ b/lib/src/pnrjson/types_ts.rs @@ -0,0 +1,42 @@ +use wasm_bindgen::prelude::*; + +// TODO + +#[wasm_bindgen(typescript_custom_section)] +const INEXTPNR_JSON: &'static str = r#" +interface CellAttributes { + NEXTPNR_BEL: string, + cellType?: string, +} + +interface Cell { + attributes: CellAttributes, +} + +interface NetnameAttributes { + ROUTING: string, +} + +interface Netname { + attributes: NetnameAttributes, +} + +interface Top { + cells: Record, + netnames: Record, +} + +interface Modules { + top: Top, +} + +interface NextpnrJson { + modules: Modules, +} +"#; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(typescript_type = "NextpnrJson")] + pub type INextpnrJSON; +} diff --git a/lib/src/renderer.interface.ts b/lib/src/renderer.interface.ts deleted file mode 100644 index 9012198..0000000 --- a/lib/src/renderer.interface.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type ColorConfig = { - active: string; - inactive: string; - frame: string; - background: string; -}; -export interface Renderer { - render(): void; - zoom(amount: number, x: number, y: number): void; - pan(x: number, y: number): void; - loadJson(json: string): void; - - changeViewMode(viewMode: {showWires?: boolean; showGroups?: boolean; showBels?: boolean}): void; - - get viewMode(): { - showWires: boolean; - showGroups: boolean; - showBels: boolean; - }; -} diff --git a/lib/src/renderer.rs b/lib/src/renderer.rs new file mode 100644 index 0000000..291d3a1 --- /dev/null +++ b/lib/src/renderer.rs @@ -0,0 +1,395 @@ +use std::collections::HashMap; +use std::f32::consts::E; + +use anyhow::{bail, Result}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::JsCast; +use web_sys::{HtmlCanvasElement, WebGl2RenderingContext}; + +use crate::architecture::Architecture; +use crate::gfx::{Color, GraphicElement, Style, Type}; +use crate::pnrjson::{INextpnrJSON, NextpnrJson}; +use crate::webgl::{ + ElementType, Line, LineCoords, Rectangle, RectangleCoords, RenderingProgram, WebGlElement, +}; + +type GraphicElementCollection = HashMap>; +type GraphicElements = HashMap; + +type WebGlElements<'a> = Vec + 'a>>; + +#[derive(Serialize, Deserialize)] +pub struct ColorConfig { + active: Color, + inactive: Color, + frame: Color, + background: Color, +} + +pub type CellColorConfig = HashMap; + +pub struct Renderer<'a, T> { + architecture: Box>, + program: RenderingProgram, + canvas: HtmlCanvasElement, + + graphic_elements: GraphicElements, + graphic_elements_dirty: bool, + webgl_elements: WebGlElements<'a>, + webgl_elements_dirty: bool, + + colors: ColorConfig, + cell_colors: CellColorConfig, + + is_rendering: bool, + offset: (f32, f32), + scale: f32, +} + +fn create_rendering_context(canvas: &HtmlCanvasElement) -> Result { + let Ok(Some(context_obj)) = canvas.get_context("webgl2") else { + bail!("Could not get canvas context"); + }; + let Ok(context) = context_obj.dyn_into::() else { + bail!("Could not convert object into context"); + }; + + return Ok(context); +} + +impl<'a, T> Renderer<'a, T> { + pub fn new( + canvas: HtmlCanvasElement, + architecture: impl Architecture + 'static, + colors: ColorConfig, + cell_colors: CellColorConfig, + ) -> Result { + let gl = create_rendering_context(&canvas)?; + let program = RenderingProgram::new(gl)?; + + return Ok(Self { + architecture: Box::new(architecture), + program, + canvas, + + graphic_elements: HashMap::new(), + graphic_elements_dirty: true, + webgl_elements: vec![], + webgl_elements_dirty: true, + is_rendering: false, + + colors, + cell_colors, + + scale: 15.0, + offset: (-10.25, -25.1), + }); + } + + pub fn render(&mut self) -> Result<()> { + self.is_rendering = true; + + if self.webgl_elements_dirty { + self.update_webgl_elements()?; + } + + let gl = self.program.get_gl(); + let canvas = self.get_canvas(); + + gl.viewport(0, 0, canvas.width() as i32, canvas.height() as i32); + + let bg_color = self.colors.background; + gl.clear_color( + bg_color.float_r(), + bg_color.float_g(), + bg_color.float_b(), + 1.0, + ); + gl.clear(WebGl2RenderingContext::COLOR_BUFFER_BIT); + + for elem in &self.webgl_elements { + elem.draw( + &self.program, + self.offset.0, + self.offset.1, + self.scale, + canvas.width() as f32, + canvas.height() as f32, + )?; + } + + return Ok(()); + } + + pub fn show_json(&mut self, obj: INextpnrJSON) -> Result<()> { + if self.graphic_elements_dirty { + self.update_graphic_elements(); + } + + let json = NextpnrJson::from_jsobj(obj)?; + let elems = json.get_elements(); + + let wire_map = self + .graphic_elements + .entry(ElementType::Wire) + .or_insert_with(|| HashMap::new()); + for wire in elems.wires { + let Some(ge) = wire_map.get_mut(&wire) else { + continue; + }; + for g in ge { + g.style = Style::Active; + } + } + + let bel_map = self + .graphic_elements + .entry(ElementType::Bel) + .or_insert_with(|| HashMap::new()); + for bel in elems.bels { + let Some(ge) = bel_map.get_mut(bel.nextpnr_bel) else { + continue; + }; + + let cell_type = bel + .cell_type + .clone() + .map_or(String::new(), |t| t.replace('$', "")); + let color = self.cell_colors.get(&cell_type).copied(); + + ge.iter_mut().for_each(|g| { + g.style = Style::Active; + g.color = color; + + // Fill box if it can be traced back to a cell type + if !cell_type.is_empty() { + g.r#type = Type::FilledBox; + } + }); + } + + let pip_map = self + .graphic_elements + .entry(ElementType::Pip) + .or_insert_with(|| HashMap::new()); + pip_map.clear(); + for pip in elems.pips { + let Some(decal) = + self.architecture + .find_pip_decal_by_loc_from_to(&pip.location, &pip.from, &pip.to) + else { + continue; + }; + + let mut ges = self.architecture.get_decal_graphics(&decal.decal); + ges.iter_mut().for_each(|g| g.style = Style::Active); + + pip_map.insert(decal.id, ges); + } + + self.webgl_elements_dirty = true; + + if self.is_rendering { + self.render()? + }; + return Ok(()); + } + + pub fn zoom(&mut self, amt: f32, x: f32, y: f32) -> Result<()> { + if self.graphic_elements_dirty { + bail!("Graphic elements must be generated before zooming"); + } + + let mut amt = E.powf(-amt); + + let old_scale = self.scale; + self.scale *= amt; + self.scale = f32::min(4000.0, f32::max(10.0, self.scale)); + amt = self.scale / old_scale; + if amt == 1.0 { + return Ok(()); + }; + + self.offset.0 -= x / (self.scale * amt) - x / self.scale; + self.offset.1 -= y / (self.scale * amt) - y / self.scale; + + self.render()?; + return Ok(()); + } + + pub fn pan(&mut self, x: f32, y: f32) -> Result<()> { + self.offset.0 -= x / self.scale; + self.offset.1 -= y / self.scale; + + if self.is_rendering { + self.render()? + }; + return Ok(()); + } + + fn get_canvas(&self) -> &HtmlCanvasElement { + return &self.canvas; + } + + fn update_graphic_elements(&mut self) { + // Wires + let wire_decals = self.architecture.get_wire_decals(); + let wire_map = self + .graphic_elements + .entry(ElementType::Wire) + .or_insert_with(|| HashMap::new()); + for decal in wire_decals { + let g = self.architecture.get_decal_graphics(&decal.decal); + wire_map.insert(decal.id, g); + } + + // BELs + let bel_decals = self.architecture.get_bel_decals(); + let bel_map = self + .graphic_elements + .entry(ElementType::Bel) + .or_insert_with(|| HashMap::new()); + for decal in bel_decals { + let g = self.architecture.get_decal_graphics(&decal.decal); + bel_map.insert(decal.id, g); + } + + // Groups + let group_decals = self.architecture.get_group_decals(); + let group_map = self + .graphic_elements + .entry(ElementType::Group) + .or_insert_with(|| HashMap::new()); + for decal in group_decals { + let g = self.architecture.get_decal_graphics(&decal.decal); + group_map.insert(decal.id, g); + } + + self.graphic_elements_dirty = false; + } + + pub fn update_webgl_elements(&mut self) -> Result<()> { + // Make sure graphic elements are updated first + if self.graphic_elements_dirty { + self.update_graphic_elements(); + } + + self.webgl_elements.clear(); + for (r#type, g_elems) in self.graphic_elements.iter() { + let elems: Vec = + g_elems.values().map(|e| e.clone()).flatten().collect(); + + self.webgl_elements + .extend(self.to_webgl_elements(&elems, r#type)?); + } + + self.webgl_elements_dirty = false; + + return Ok(()); + } + + fn get_elem_color(&self, style: &Style, orig_color: &Option) -> Option { + match style { + Style::Active => Some(orig_color.unwrap_or(self.colors.active)), + Style::Inactive => Some(self.colors.inactive), + Style::Frame => Some(self.colors.frame), + _ => None, // Hidden or some other style, cannot determine color + } + } + + fn to_webgl_elements( + &self, + ges: &Vec, + r#type: &ElementType, + ) -> Result>>> { + // Create 'groups' of elements with the same style, type and color so we can batch them + // when rendering. + let mut groups: HashMap<(Style, Type, Option), Vec<&GraphicElement>> = + HashMap::new(); + for elem in ges { + let key = (elem.style, elem.r#type, elem.color); + groups + .entry(key) + .and_modify(|v| v.push(elem)) + .or_insert(vec![elem]); + } + + let mut res: Vec> = vec![]; + for (key, group) in groups.into_iter() { + if group.len() == 0 || key.0 == Style::Hidden { + continue; + } + let Some(color) = self.get_elem_color(&key.0, &key.2) else { + continue; // Invalid color + }; + + if key.1 == Type::Box { + let ls: Vec<_> = group + .into_iter() + .flat_map(|e| { + [ + LineCoords { + x1: e.x1 as f32, + x2: e.x2 as f32, + y1: e.y1 as f32, + y2: e.y1 as f32, + }, + LineCoords { + x1: e.x1 as f32, + x2: e.x2 as f32, + y1: e.y2 as f32, + y2: e.y2 as f32, + }, + LineCoords { + x1: e.x1 as f32, + x2: e.x1 as f32, + y1: e.y1 as f32, + y2: e.y2 as f32, + }, + LineCoords { + x1: e.x2 as f32, + x2: e.x2 as f32, + y1: e.y1 as f32, + y2: e.y2 as f32, + }, + ] + }) + .collect(); + + let mut line = Line::new(&self.program, ls, color)?; + line.set_type(r#type.to_owned()); + res.push(Box::new(line)); + } else if key.1 == Type::FilledBox { + let ls = group + .into_iter() + .map(|e| RectangleCoords { + x1: e.x1 as f32, + x2: e.x2 as f32, + y1: e.y1 as f32, + y2: e.y2 as f32, + }) + .collect(); + + let mut rect = Rectangle::new(&self.program, ls, color)?; + rect.set_type(r#type.to_owned()); + res.push(Box::new(rect)); + } else { + let ls = group + .into_iter() + .map(|e| LineCoords { + x1: e.x1 as f32, + y1: e.y1 as f32, + x2: e.x2 as f32, + y2: e.y2 as f32, + }) + .collect(); + + let mut line = Line::new(&self.program, ls, color)?; + line.set_type(r#type.to_owned()); + res.push(Box::new(line)); + } + } + + return Ok(res); + } +} diff --git a/lib/src/renderer.ts b/lib/src/renderer.ts deleted file mode 100644 index c0b854e..0000000 --- a/lib/src/renderer.ts +++ /dev/null @@ -1,275 +0,0 @@ -import { Architecture } from './architecture/architecture'; -import { GraphicElement } from './gfx/gfx'; -import { Type as GraphicElementType } from './gfx/types'; -import { Style as GraphicElementStyle } from './gfx/styles'; -import { NextpnrJSON } from './pnr-json/pnr-json'; -import { Renderer as RendererInterface, ColorConfig } from './renderer.interface'; -import { Line } from './webgl/line'; -import { Program } from './webgl/program'; -import { WebGLElement, ElementType } from './webgl/webgl'; -import { Rectangle } from './webgl/rectangle'; - -type Elements = { - [key in ElementType]: Record -} - -export class Renderer implements RendererInterface { - private animationFrameId?: number; - - private _gl: WebGL2RenderingContext; - private _renderingProgram: Program; - private _elements: Elements; - private _colorCanvasCtx: CanvasRenderingContext2D | null; - - private _renderingElems: WebGLElement[]; - - constructor( - private canvas: HTMLCanvasElement, - private architecture: Architecture, - private _colors: ColorConfig, - private _cellColors: Record = {}, - private _scale: number = 15, - private _offX: number = -10.25, - private _offY: number = -52.1, - private _visibleWidth = 0, - private _visibleHeight = 0, - private _viewMode = { showWires: true, showGroups: true, showBels: true }, - ) { - const gl: WebGL2RenderingContext|null = this.canvas.getContext('webgl2'); - if (!gl) throw 'couldnt get gl2 context'; - - this._gl = gl; - this._renderingProgram = new Program(this._gl); - - this._visibleWidth = this.canvas.width; - this._visibleHeight = this.canvas.height; - - this._elements = this.createGraphicElements(); - this._renderingElems = this._updateWebGLElements(); - - this._colorCanvasCtx = document.createElement('canvas').getContext('2d'); - } - - public render(): void { - if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId); - - this.animationFrameId = window.requestAnimationFrame(() => { - this._gl.viewport(0, 0, this._gl.canvas.width, this._gl.canvas.height); - - const bgColor = this.colorStrToObj(this._colors.background); - this._gl.clearColor(bgColor.r, bgColor.g, bgColor.b, 1.0); - this._gl.clear(this._gl.COLOR_BUFFER_BIT); - - for (const elem of this._renderingElems) { - if (elem.type === 'wire' && !this._viewMode.showWires) continue; - if ((elem.type === 'group' || elem.type === 'pip') && !this._viewMode.showGroups) continue; - if (elem.type === 'bel' && !this._viewMode.showBels) continue; - - elem.draw(this._offX, this._offY, this._scale, this.canvas.width, this.canvas.height); - } - - this.animationFrameId = undefined; - }); - } - - public zoom(amt: number, x: number, y: number) { - amt = Math.exp(-amt); - - const oldScale = this._scale; - this._scale *= amt; - this._scale = Math.min(4000, Math.max(10, this._scale)); - amt = this._scale / oldScale; - if (amt === 1) return; - - this._offX -= x/(this._scale*amt) - x/this._scale; - this._offY -= y/(this._scale*amt) - y/this._scale; - - this._visibleWidth = this.canvas.width / this._scale; - this._visibleHeight = this.canvas.height / this._scale; - - this.render(); - } - - public pan(x: number, y: number) { - this._offX -= x / this._scale; - this._offY -= y / this._scale; - - this.render(); - } - - public loadJson(json: string|object) { - const active = NextpnrJSON.load(typeof json === 'string' ? JSON.parse(json) : json); - - active.wire.forEach(w => { - const ge = this._elements.wire[w]; - if (ge === undefined) { - return; - } - ge.forEach(ge => ge.style = GraphicElementStyle.Active); - }); - - active.bel.forEach(w => { - const ge = this._elements.bel[w.nextpnrBel]; - if (ge === undefined) { - return; - } - const cellName = w.cellType?.replace("$", "") || ""; - const elemColor = this._cellColors[cellName] ?? null; - ge.forEach(ge => { - ge.style = GraphicElementStyle.Active; - ge.color = elemColor; - - // Only fill BELs that we can actually trace back to a cell - if (cellName) ge.type = GraphicElementType.FilledBox; - }); - }); - - this._elements.pip = {}; - active.pip.forEach(({location, pip_from, pip_to, pip_name}) => { - const pip_decal = this.architecture.findPipDecalByLocFromTo(location, pip_from, pip_to); - if (!pip_decal) { - console.warn( - `Could not find pip decal ${pip_name}: - ${JSON.stringify(location)} - ${JSON.stringify(pip_from)} - ${JSON.stringify(pip_to)}` - ) - return; - } - - let ges = this.architecture.getDecalGraphics(pip_decal.decal); - ges.forEach(ge => ge.style = GraphicElementStyle.Active); - - this._elements.pip[pip_decal.id] = ges; - }); - - this._renderingElems = this._updateWebGLElements(); - - this.render(); - } - - public changeViewMode(viewMode: { - showWires?: boolean, - showGroups?: boolean, - showBels?: boolean, - }) { - if (viewMode.showWires !== undefined) this._viewMode.showWires = viewMode.showWires; - if (viewMode.showGroups !== undefined) this._viewMode.showGroups = viewMode.showGroups; - if (viewMode.showBels !== undefined) this._viewMode.showBels = viewMode.showBels; - } - - public get viewMode() { - return Object.assign({}, this._viewMode); // Ensure readonly - } - - private createGraphicElements(): Elements { - const elements: Elements = { - wire: {}, - bel: {}, - group: {}, - pip: {} - }; - - this.architecture.getWireDecals().forEach(decal => { - const graphics = this.architecture.getDecalGraphics(decal.decal); - elements.wire[decal.id] = graphics; - }); - - this.architecture.getBelDecals().forEach(decal => { - const graphics = this.architecture.getDecalGraphics(decal.decal); - elements.bel[decal.id] = graphics; - }); - - this.architecture.getGroupDecals().forEach(decal => { - const graphics = this.architecture.getDecalGraphics(decal.decal); - elements.group[decal.id] = graphics; - }); - - // this.architecture.getPipDecals().forEach(decal => { - // elements.pip[decal.id] = this.architecture.getDecalGraphics(decal.decal); - // }); - - return elements; - } - - private toWebGLElements(ges: Array): WebGLElement[] { - const groups = ges.filter((v, i, self) => - self.findIndex(e => e.style === v.style && e.type === v.type && e.color === v.color) === i - ).map(g => - ges.filter(e => e.style === g.style && e.type === g.type && e.color === g.color) - ); - - const ret: WebGLElement[] = []; - groups.forEach(g => { - if (g.length === 0 || g[0].style === GraphicElementStyle.Hidden) return; - if (g[0].type === GraphicElementType.Box) { - const ls = g.flatMap(e => { - return [ - {x1: e.x1, x2: e.x2, y1: e.y1, y2: e.y1}, - {x1: e.x1, x2: e.x2, y1: e.y2, y2: e.y2}, - {x1: e.x1, x2: e.x1, y1: e.y1, y2: e.y2}, - {x1: e.x2, x2: e.x2, y1: e.y1, y2: e.y2}, - ]; - }); - ret.push(new Line( - this._gl, this._renderingProgram, - ls, this.getColorObj(g[0]) - )); - } else if (g[0].type === GraphicElementType.FilledBox) { - ret.push(new Rectangle( - this._gl, this._renderingProgram, - g.map(e => ({x1: e.x1, x2: e.x2, y1: e.y1, y2: e.y2})), this.getColorObj(g[0]) - )); - } else { - ret.push(new Line( - this._gl, this._renderingProgram, - g.map(g => ({x1: g.x1, y1: g.y1, x2: g.x2, y2: g.y2})), this.getColorObj(g[0]) - )); - } - }); - return ret; - } - - private colorStrToObj(col: string): {r: number, g: number, b: number} { - // Normalize CSS color names to hex - if (this._colorCanvasCtx) { - this._colorCanvasCtx.fillStyle = col; - col = this._colorCanvasCtx.fillStyle; - } - - col = col.replace('#', ''); - const rstr = col.slice(0,2); - const gstr = col.slice(2,4); - const bstr = col.slice(4,6); - - return {r: parseInt(rstr, 16) / 255, g: parseInt(gstr, 16) / 255, b: parseInt(bstr, 16) / 255}; - } - - private getColorObj(elem: GraphicElement): {r: number, g: number, b: number} { - const col = this.getColor(elem); - return this.colorStrToObj(col); - } - - private getColor(elem: GraphicElement): string { - switch (elem.style) { - case GraphicElementStyle.Active: return elem.color || this._colors.active; - case GraphicElementStyle.Inactive: return this._colors.inactive; - case GraphicElementStyle.Frame: return this._colors.frame; - case GraphicElementStyle.Hidden: throw 'can not color a hidden element!'; - } - } - - private _updateWebGLElements(): WebGLElement[] { - let newElements: WebGLElement[] = []; - - for (let typeKey in this._elements) { - const type = typeKey; - - const elem = this._elements[type]; - const webGLElems = this.toWebGLElements(Object.values(elem).flat()); - webGLElems.forEach(elem => elem.type = type); - - newElements.push(...webGLElems); - } - - return newElements; - } -} diff --git a/lib/src/utils.rs b/lib/src/utils.rs new file mode 100644 index 0000000..3e8905a --- /dev/null +++ b/lib/src/utils.rs @@ -0,0 +1,19 @@ +mod js { + use wasm_bindgen::prelude::*; + + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(js_namespace = console)] + pub fn log(msg: &str); + } +} + +pub fn set_panic_hook() { + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} + +#[allow(dead_code)] +pub fn log(msg: String) { + js::log(&msg[..]) +} diff --git a/lib/src/viewer.interface.ts b/lib/src/viewer.interface.ts deleted file mode 100644 index 40f8325..0000000 --- a/lib/src/viewer.interface.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {ColorConfig, Renderer} from './renderer.interface'; - -type Chip = - | { - family: 'ecp5'; - device: '25k' | '45k' | '85k'; - } - | { - family: 'ice40'; - device: never; - }; - -export type ViewerConfig = { - width: number; - height: number; - createToggles: boolean; - colors: ColorConfig; - cellColors: Record; - chip: Chip; -}; - -export const defaultConfig: ViewerConfig = { - width: 1280, - height: 720, - createToggles: true, - colors: { - active: '#F8F8F2', - inactive: '#6272A4', - frame: '#BD93F9', - background: '#282A36' - }, - cellColors: {}, - chip: { - family: 'ecp5', - device: '25k' - } -}; - -export interface NextPNRViewer { - get renderer(): Promise; - showJson(jsonString: string): void; - resize(width: number, height: number): void; -} diff --git a/lib/src/viewer.rs b/lib/src/viewer.rs new file mode 100644 index 0000000..5f33d1c --- /dev/null +++ b/lib/src/viewer.rs @@ -0,0 +1,105 @@ +use crate::{ + architecture::ECP5Arch, + chipdb::ecp5::get_chipdb, + decal::ECP5DecalID, + pnrjson::INextpnrJSON, + renderer::{CellColorConfig, ColorConfig, Renderer}, +}; + +use wasm_bindgen::prelude::*; +use web_sys::HtmlCanvasElement; + +#[wasm_bindgen(typescript_custom_section)] +const ICOLOR_CONFIG: &'static str = r#" +interface Color { + r: number, + g: number, + b: number, +} + +interface ColorConfig { + active: Color, + inactive: Color, + frame: Color, + background: Color, +} + +type CellColorConfig = Record; +"#; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(typescript_type = "ColorConfig")] + pub type IColorConfig; + + #[wasm_bindgen(typescript_type = "CellColorConfig")] + pub type ICellColorConfig; +} + +#[wasm_bindgen] +pub struct ViewerECP5 { + renderer: Renderer<'static, ECP5DecalID>, +} + +#[wasm_bindgen] +impl ViewerECP5 { + #[wasm_bindgen(constructor)] + pub fn new( + canvas: HtmlCanvasElement, + chipdata: &[u8], + colors: IColorConfig, + cell_colors: ICellColorConfig, + ) -> Result { + let colors_conf: ColorConfig = match serde_wasm_bindgen::from_value(colors.obj) { + Ok(colors_conf) => colors_conf, + Err(e) => return Err(JsError::from(e)), + }; + let cell_colors_conf: CellColorConfig = + match serde_wasm_bindgen::from_value(cell_colors.obj) { + Ok(cell_colors_conf) => cell_colors_conf, + Err(e) => return Err(JsError::from(e)), + }; + + let db = match get_chipdb(chipdata) { + Ok(db) => db, + Err(e) => return Err(JsError::from(&*e)), + }; + + let arch = ECP5Arch::new(db); + + let renderer = match Renderer::new(canvas, arch, colors_conf, cell_colors_conf) { + Ok(r) => r, + Err(e) => return Err(JsError::from(&*e)), + }; + + return Ok(Self { renderer }); + } + + #[wasm_bindgen] + pub fn render(&mut self) -> Result<(), JsError> { + self.renderer.render(); + + return Ok(()); + } + + #[wasm_bindgen] + pub fn show_json(&mut self, obj: INextpnrJSON) -> Result<(), JsError> { + self.renderer.show_json(obj); + + return Ok(()); + } + + #[wasm_bindgen] + pub fn zoom(&mut self, amt: f32, x: f32, y: f32) -> Result<(), JsError> { + self.renderer.zoom(amt, x, y); + + return Ok(()); + } + + #[wasm_bindgen] + pub fn pan(&mut self, x: f32, y: f32) -> Result<(), JsError> { + self.renderer.pan(x, y); + + return Ok(()); + } +} diff --git a/lib/src/viewer.ts b/lib/src/viewer.ts deleted file mode 100644 index 5e69ad3..0000000 --- a/lib/src/viewer.ts +++ /dev/null @@ -1,209 +0,0 @@ -import {ReplaySubject, first, lastValueFrom} from 'rxjs'; - -import {ECP5Arch} from './architecture/ecp5.arch'; -import {ChipInfoPODImpl} from './chipdb/ecp5-impl.chipdb'; -import {ECP5DecalID} from './decal/ecp5.decalid'; -import {Renderer} from './renderer'; -import {Renderer as RendererInterface} from './renderer.interface'; -import {ViewerConfig, NextPNRViewer as ViewerInterface, defaultConfig} from './viewer.interface'; - -async function getChipDb(db: '25k' | '45k' | '85k'): Promise { - let input; - switch (db) { - case '25k': - input = new URL(`../static/chipdb/ecp5/25k.bin`, import.meta.url); - break; - case '45k': - input = new URL(`../static/chipdb/ecp5/45k.bin`, import.meta.url); - break; - case '85k': - input = new URL(`../static/chipdb/ecp5/85k.bin`, import.meta.url); - break; - } - - let chipdb = await fetch(input).then((resp) => resp.arrayBuffer()); - let dataview = new DataView(chipdb); - const impl = new ChipInfoPODImpl(new DataView(dataview.buffer, dataview.getInt32(0, true))); - - return new ECP5Arch(impl); -} - -export class NextPNRViewer implements ViewerInterface { - private _renderer: ReplaySubject> = new ReplaySubject>(1); - private _canvas: HTMLCanvasElement; - private _config: ViewerConfig; - - constructor( - private _element: HTMLDivElement, - config?: Partial - ) { - this._config = {...defaultConfig, ...config}; - - const canvas: HTMLCanvasElement = document.createElement('canvas'); - canvas.id = 'nextpnr-viewer'; - - this._element.appendChild(canvas); - this._canvas = canvas; - - getChipDb(this._config.chip.device).then((arch: ECP5Arch) => { - const renderer = new Renderer(canvas, arch, this._config.colors, this._config.cellColors); - this._renderer.next(renderer); - - this._addEventListeners(canvas); - const toggleDefaults = { - showWires: true, - showGroups: true, - showBels: true - }; - - if (this._config.createToggles) this._createToggles(toggleDefaults); - - this.resize(this._config.width, this._config.height); - renderer.changeViewMode(toggleDefaults); - }); - } - - private _createToggles(defaults: {showWires: boolean; showGroups: boolean; showBels: boolean}) { - const toggleContainer = document.createElement('div'); - - this._createToggle( - 'show_wires', - 'Show Wires', - (r, v) => { - r.changeViewMode({showWires: v}); - r.render(); - }, - defaults.showWires, - toggleContainer - ); - this._createToggle( - 'show_groups', - 'Show Groups', - (r, v) => { - r.changeViewMode({showGroups: v}); - r.render(); - }, - defaults.showGroups, - toggleContainer - ); - this._createToggle( - 'show_bels', - 'Show BELs', - (r, v) => { - r.changeViewMode({showBels: v}); - r.render(); - }, - defaults.showBels, - toggleContainer - ); - - this._element.appendChild(toggleContainer); - } - - private _createToggle( - toggle_id: string, - toggle_description: string, - toggle_action: (renderer: RendererInterface, value: boolean) => void, - default_state: boolean, - elem: HTMLElement - ) { - const inputElement: HTMLInputElement = document.createElement('input'); - inputElement.id = toggle_id; - inputElement.type = 'checkbox'; - inputElement.name = toggle_id; - inputElement.checked = default_state; - - inputElement.addEventListener('change', (v) => { - const res = (v.target as {checked: boolean} | null)?.checked; - if (res === undefined) throw 'no checked attribute on toggle?'; - - this._renderer - .asObservable() - .pipe(first()) - .subscribe((renderer) => toggle_action(renderer, res)); - }); - - const labelElement: HTMLLabelElement = document.createElement('label'); - labelElement.setAttribute('for', inputElement.name); - labelElement.innerHTML = toggle_description; - - elem.appendChild(inputElement); - elem.appendChild(labelElement); - } - - private _addEventListeners(canvas: HTMLCanvasElement) { - let down = false; - let firstEvent = true; - let oldx = 0; - let oldy = 0; - canvas.addEventListener('wheel', (e) => { - e.preventDefault(); - if (e.deltaY === 0) return; - this._renderer - .asObservable() - .pipe(first()) - .subscribe((renderer) => { - renderer.zoom( - e.deltaY > 0 ? 0.05 : -0.05, - e.clientX - canvas.offsetLeft, - e.clientY - canvas.offsetTop - ); - }); - }); - canvas.addEventListener('mousedown', (_) => { - down = true; - firstEvent = true; - }); - canvas.addEventListener('mouseup', (_) => { - down = false; - }); - canvas.addEventListener('mousemove', (e) => { - if (down) { - if (!firstEvent) { - this._renderer - .asObservable() - .pipe(first()) - .subscribe((renderer) => { - renderer.pan(e.clientX - oldx, e.clientY - oldy); - }); - } - - firstEvent = false; - oldx = e.clientX; - oldy = e.clientY; - } - }); - } - - public get renderer(): Promise { - return lastValueFrom(this._renderer.asObservable()); - } - - public showJson(jsonString: string) { - this._renderer - .asObservable() - .pipe(first()) - .subscribe((renderer) => { - renderer.loadJson(jsonString); - }); - } - - public resize(width: number, height: number) { - this._element.style.width = `${width}px`; - this._element.style.height = `${height}px`; - this._element.style.display = 'flex'; - this._element.style.flexDirection = 'column'; - - this._canvas.style.flexGrow = '1'; - - this._canvas.width = this._canvas.clientWidth; - this._canvas.height = this._canvas.clientHeight; - - this._renderer - .asObservable() - .pipe(first()) - .subscribe((renderer) => { - renderer.render(); - }); - } -} diff --git a/lib/src/webgl/line.rs b/lib/src/webgl/line.rs new file mode 100644 index 0000000..8fde45c --- /dev/null +++ b/lib/src/webgl/line.rs @@ -0,0 +1,137 @@ +use anyhow::{bail, Result}; +use web_sys::{js_sys, WebGl2RenderingContext, WebGlVertexArrayObject}; + +use crate::gfx::Color; + +use super::{ + types::{ElementType, WebGlElement}, + RenderingProgram, +}; + +/** Struct for rendering line primitives + + This is a helper class for webgl to render line primitives. + + The constructor takes in a rendering context and an array of lines plus a color. + It then creates a Vertex buffer (GPU memory to store the locations of the lines) + and a Vertex array (OpenGL state object that contains settings and the layout of the GPU memory). + + The draw() method passes some additional configruation about the viewport to the GPU + and then batch renders all the lines that were passed in the constructor. + + For optimal performance try to batch as many lines in an object of this class as possible, + because that allows the GPU to do as much of it as possible in parallel. +*/ +pub struct LineCoords { + pub x1: f32, + pub x2: f32, + pub y1: f32, + pub y2: f32, +} + +pub struct Line { + r#type: Option, + + color: Color, + + vao: WebGlVertexArrayObject, + amount: i32, +} + +impl Line { + pub fn new(program: &RenderingProgram, lines: Vec, color: Color) -> Result { + let gl = program.get_gl(); + + // Create vertex array object + let Some(vao) = gl.create_vertex_array() else { + bail!("Unable to create vao"); + }; + + // Create vertex buffer object + let Some(vbo) = gl.create_buffer() else { + bail!("Unable to create vbo"); + }; + + // Setup the data + gl.bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, Some(&vbo)); + let amount = lines.len() * 2; // 2 verts per line + let vertex_data: Vec = lines + .into_iter() + .flat_map(|l| [l.x1, l.y1, l.x2, l.y2]) + .collect(); + + // Pass it to the GPU + // Unsafe because Float32Array::view creates a raw view into our wasm memory buffer. + // Do NOT do any memory allocations before 'verts' is dropped. + unsafe { + let verts = js_sys::Float32Array::view(&vertex_data[..]); + gl.buffer_data_with_array_buffer_view( + WebGl2RenderingContext::ARRAY_BUFFER, + &verts, + WebGl2RenderingContext::STATIC_DRAW, + ); + } + + gl.bind_vertex_array(Some(&vao)); + gl.enable_vertex_attrib_array(0); + + // This specifies the layout of the data in the vertex buffer to the gpu + // The vertices are packed tightly as 2 float vectors, i.e. the gpu memory looks like: + // [v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, ...etc] + // index is 0 (which corresponds to the layout(location = 0) in the vertex shader, see program.rs:DEFAULT_VECTOR_SRC). + // Data is not normalized to screen coordinates, we have custom logic for that in the + // vertex shader to handle with zooming and panning. + gl.vertex_attrib_pointer_with_f64(0, 2, WebGl2RenderingContext::FLOAT, false, 0, 0.0); + + // Reset bindings, technically not required, but can prevent nasty bugs once more vertex + // arrays are used in the same rendering context. + gl.bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, None); + gl.bind_vertex_array(None); + + return Ok(Self { + r#type: None, + color, + amount: amount.try_into().unwrap(), + vao, + }); + } +} + +impl WebGlElement<'_> for Line { + fn set_type(&mut self, r#type: ElementType) { + self.r#type = Some(r#type); + } + + fn get_type(&self) -> Option<&ElementType> { + return self.r#type.as_ref(); + } + + fn draw( + &self, + program: &RenderingProgram, + offset_x: f32, + offset_y: f32, + scale: f32, + canvas_width: f32, + canvas_height: f32, + ) -> Result<()> { + let gl = program.get_gl(); + + program.r#use(); + program.set_uniform_vec_2f(&"u_canvas_size".to_string(), canvas_width, canvas_height)?; + program.set_uniform_vec_2f(&"u_offset".to_string(), offset_x, offset_y)?; + program.set_uniform_float(&"u_scale".to_string(), scale)?; + program.set_uniform_vec_4f( + &"u_color".to_string(), + self.color.float_r(), + self.color.float_g(), + self.color.float_b(), + 1.0, + )?; + + gl.bind_vertex_array(Some(&self.vao)); + gl.draw_arrays(WebGl2RenderingContext::LINES, 0, self.amount); + + return Ok(()); + } +} diff --git a/lib/src/webgl/line.ts b/lib/src/webgl/line.ts deleted file mode 100644 index b40a18d..0000000 --- a/lib/src/webgl/line.ts +++ /dev/null @@ -1,76 +0,0 @@ -import {type Program} from './program'; -import {WebGLElement} from './webgl'; - -/** Class for rendering line primitives - - This is a helper class for webgl to render line primitives. - - The constructor takes in a rendering context and an array of lines plus a color. - It then creates a Vertex buffer (GPU memory to store the locations of the lines) - and a Vertex array (OpenGL state object that contains settings and the layout of the GPU memory). - - The draw() method passes some additional configruation about the viewport to the GPU - and then batch renders all the lines that were passed in the constructor. - - For optimal performance try to batch as many lines in an object of this class as possible, - because that allows the GPU to do as much of it as possible in parallel. -*/ -export class Line extends WebGLElement { - private _vao: WebGLVertexArrayObject; // Vertex array object - private _vbo: WebGLBuffer; // Vertex buffer object - - private _amount: number; - - constructor( - gl: WebGL2RenderingContext, - program: Program, - lines: Array<{x1: number; x2: number; y1: number; y2: number}>, - private _color: {r: number; g: number; b: number} - ) { - super(gl, program); - - // Create vertex array object - const vao = gl.createVertexArray(); - if (vao === null) throw 'unable to create vao'; - this._vao = vao; - - // Create vertex buffer object - const vbo = gl.createBuffer(); - if (vbo === null) throw 'unable to create vbo'; - this._vbo = vbo; - - // Setup the data and pass it to the GPU using gl.bufferData() - gl.bindBuffer(gl.ARRAY_BUFFER, this._vbo); - const verts = new Float32Array(lines.flatMap((l) => [l.x1, l.y1, l.x2, l.y2])); - this._amount = lines.length * 2; // 2 verts per line - gl.bufferData(gl.ARRAY_BUFFER, verts, gl.STATIC_DRAW); - - gl.bindVertexArray(this._vao); - gl.enableVertexAttribArray(0); - // This specifies the layout of the data in the vertex buffer to the gpu - // The vertices are packed tightly as 2 float vectors, i.e. the gpu memory looks like: - // [v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, ...etc] - // index is 0 (which corresponds to the layout(location = 0) in the vertex shader, see program.ts:defaultVertexSource). - // Data is not normalized to screen coordinates, we have custom logic for that in the - // vertex shader to handle with zooming and panning. - gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); - - // Reset bindings, technically not required, but can prevent nasty bugs once more vertex - // arrays are used in the same rendering context. - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindVertexArray(null); - } - - public draw(offsetX: number, offsetY: number, scale: number, canvasWidth: number, canvasHeight: number): void { - const gl = this.gl; - - this.program.use(); - this.program.setUniformVec2f('u_canvas_size', canvasWidth, canvasHeight); - this.program.setUniformVec2f('u_offset', offsetX, offsetY); - this.program.setUniformFloat('u_scale', scale); - this.program.setUniformVec4f('u_color', this._color.r, this._color.g, this._color.b, 1); - - gl.bindVertexArray(this._vao); - gl.drawArrays(gl.LINES, 0, this._amount); - } -} diff --git a/lib/src/webgl/mod.rs b/lib/src/webgl/mod.rs new file mode 100644 index 0000000..0a1ac07 --- /dev/null +++ b/lib/src/webgl/mod.rs @@ -0,0 +1,9 @@ +mod line; +mod program; +mod rectangle; +mod types; + +pub use line::{Line, LineCoords}; +pub use program::RenderingProgram; +pub use rectangle::{Rectangle, RectangleCoords}; +pub use types::{ElementType, WebGlElement}; diff --git a/lib/src/webgl/program.rs b/lib/src/webgl/program.rs new file mode 100644 index 0000000..4ef7f45 --- /dev/null +++ b/lib/src/webgl/program.rs @@ -0,0 +1,201 @@ +use anyhow::{bail, Result}; +use web_sys::{WebGl2RenderingContext, WebGlProgram, WebGlShader, WebGlUniformLocation}; + +/** Default vertex shader source (GLSL) + Expects a vertex buffer (VBO) with vec2 positions for each of the vertices as input. + + Also expects the following uniforms to be set: + - u_canvas_size : A vec2 indicating the canvas size in pixels + - u_offset : A vec2 specifying the offset of the viewport + - u_scale : A float specifying the zoom level/scale of the viewport + - u_color : A vec4 specifying the color of the corresponding vertex. + This color is directly passed as an output to the fragment shader. + @constant + @type {string} + @default +*/ +const DEFAULT_VERTEX_SRC: &str = "#version 300 es +layout(location = 0) in vec2 position; + +out vec4 color; + +uniform vec2 u_canvas_size; +uniform vec2 u_offset; +uniform float u_scale; +uniform vec4 u_color; + +void main() { + vec2 pos = vec2((position.x - u_offset.x) / u_canvas_size.x, (-position.y - u_offset.y) / u_canvas_size.y); + vec2 pos0to1 = pos * u_scale; + vec2 posfull = pos0to1 * 2.0 - vec2(1, 1); + gl_Position = vec4(posfull.x, -posfull.y, 0, 1); + color = u_color; +} +"; + +/** Default fragment shader (GLSL) + + Takes in a color from the vertex shader and uses that directly to color the fragment. + @constant + @type {string} + @default +*/ +const DEFAULT_FRAGMENT_SRC: &str = "#version 300 es +precision mediump float; + +in vec4 color; + +out vec4 outColor; + +void main() { + outColor = color; +} +"; + +enum ShaderType { + Vertex, + Fragment, +} + +impl ShaderType { + fn to_gl_type(&self) -> u32 { + return match self { + ShaderType::Vertex => WebGl2RenderingContext::VERTEX_SHADER, + ShaderType::Fragment => WebGl2RenderingContext::FRAGMENT_SHADER, + }; + } + + fn to_string(&self) -> &str { + return match self { + ShaderType::Vertex => "vertex", + ShaderType::Fragment => "fragment", + }; + } +} + +fn compile_shader( + context: &WebGl2RenderingContext, + source: &str, + r#type: ShaderType, +) -> Result { + // Create the shader + let Some(shader) = context.create_shader(r#type.to_gl_type()) else { + bail!( + "CREATE_SHADER_FAILED: Call to create_shader failed, unable to create {} shader object", + r#type.to_string() + ); + }; + + // add source to shader and compile it + context.shader_source(&shader, source); + context.compile_shader(&shader); + + // Check whether compilation was succesful and return an error if it wasn't + if context + .get_shader_parameter(&shader, WebGl2RenderingContext::COMPILE_STATUS) + .is_falsy() + { + let info = context.get_shader_info_log(&shader).unwrap_or_default(); + + bail!( + "SHADER_COMPILATION_FAILED: Failed to compile {} shader:\n{}", + r#type.to_string(), + info + ); + } + + return Ok(shader); +} + +fn link_shaders( + context: &WebGl2RenderingContext, + vertex: WebGlShader, + fragment: WebGlShader, +) -> Result { + // Create new program + let Some(program) = context.create_program() else { + bail!("CREATE_PROGRAM_FAILED: Call to create_program failed, unable to create shader program object"); + }; + + // Attach shaders + context.attach_shader(&program, &vertex); + context.attach_shader(&program, &fragment); + + // Link the program + context.link_program(&program); + + // Check whether linking was succesful and return an error if it wasn't + if context + .get_program_parameter(&program, WebGl2RenderingContext::LINK_STATUS) + .is_falsy() + { + let info = context.get_program_info_log(&program).unwrap_or_default(); + + bail!("SHADER_LINK_FAILED: Failed to link program:\n{}", info); + } + + return Ok(program); +} + +pub struct RenderingProgram { + context: WebGl2RenderingContext, + program: WebGlProgram, +} + +impl RenderingProgram { + pub fn new(context: WebGl2RenderingContext) -> Result { + let vertex_shader = compile_shader(&context, DEFAULT_VERTEX_SRC, ShaderType::Vertex)?; + let fragment_shader = compile_shader(&context, DEFAULT_FRAGMENT_SRC, ShaderType::Fragment)?; + let program = link_shaders(&context, vertex_shader, fragment_shader)?; + + return Ok(RenderingProgram { context, program }); + } + + pub fn get_gl(&self) -> &WebGl2RenderingContext { + return &self.context; + } + + /** Marks the program for use on the context that was passed in the constructor */ + pub fn r#use(&self) { + self.context.use_program(Some(&self.program)); + } + + /** Sets a float uniform by name */ + pub fn set_uniform_float(&self, name: &String, a: f32) -> Result<()> { + let location = self.get_uniform_location(name)?; + self.context.uniform1f(Some(&location), a); + return Ok(()); + } + + /** Sets a Vec2f uniform by name */ + pub fn set_uniform_vec_2f(&self, name: &String, a: f32, b: f32) -> Result<()> { + let location = self.get_uniform_location(name)?; + self.context.uniform2f(Some(&location), a, b); + return Ok(()); + } + + /** Sets a Vec3f uniform by name */ + pub fn set_uniform_vec_3f(&self, name: &String, a: f32, b: f32, c: f32) -> Result<()> { + let location = self.get_uniform_location(name)?; + self.context.uniform3f(Some(&location), a, b, c); + return Ok(()); + } + + /** Sets a Vec4f uniform by name */ + pub fn set_uniform_vec_4f(&self, name: &String, a: f32, b: f32, c: f32, d: f32) -> Result<()> { + let location = self.get_uniform_location(name)?; + self.context.uniform4f(Some(&location), a, b, c, d); + return Ok(()); + } + + fn get_uniform_location(&self, name: &String) -> Result { + let Some(location) = self.context.get_uniform_location(&self.program, name) else { + bail!( + "SET_UNIFORM_FAILED: Failed to lookup location of uniform '{}'", + name + ); + }; + + return Ok(location); + } +} diff --git a/lib/src/webgl/program.ts b/lib/src/webgl/program.ts deleted file mode 100644 index 593a507..0000000 --- a/lib/src/webgl/program.ts +++ /dev/null @@ -1,219 +0,0 @@ -/** Default vertex shader source (GLSL) - Expects a vertex buffer (VBO) with vec2 positions for each of the vertices as input. - - Also expects the following uniforms to be set: - - u_canvas_size : A vec2 indicating the canvas size in pixels - - u_offset : A vec2 specifying the offset of the viewport - - u_scale : A float specifying the zoom level/scale of the viewport - - u_color : A vec4 specifying the color of the corresponding vertex. - This color is directly passed as an output to the fragment shader. - @constant - @type {string} - @default -*/ -const defaultVertexSource: string = `#version 300 es -layout(location = 0) in vec2 position; - -out vec4 color; - -uniform vec2 u_canvas_size; -uniform vec2 u_offset; -uniform float u_scale; -uniform vec4 u_color; - -void main() { - vec2 pos = vec2((position.x - u_offset.x) / u_canvas_size.x, (-position.y - u_offset.y) / u_canvas_size.y); - vec2 pos0to1 = pos * u_scale; - vec2 posfull = pos0to1 * 2.0 - vec2(1, 1); - gl_Position = vec4(posfull.x, -posfull.y, 0, 1); - color = u_color; -} -`; - -/** Default fragment shader (GLSL) - - Takes in a color from the vertex shader and uses that directly to color the fragment. - @constant - @type {string} - @default -*/ -const defaultFragmentSource: string = `#version 300 es -precision mediump float; - -in vec4 color; - -out vec4 outColor; - -void main() { - outColor = color; -} -`; - -enum ShaderType { - Vertex, - Fragment -} - -function shaderTypeToGlType(type: ShaderType): number { - switch (type) { - case ShaderType.Vertex: - return WebGL2RenderingContext.VERTEX_SHADER; - case ShaderType.Fragment: - return WebGL2RenderingContext.FRAGMENT_SHADER; - } -} - -function shaderTypeToString(type: ShaderType): 'vertex' | 'fragment' { - switch (type) { - case ShaderType.Vertex: - return 'vertex'; - case ShaderType.Fragment: - return 'fragment'; - } -} - -/** Name describing the type of error */ -export type ErrorName = - | 'CREATE_SHADER_FAILED' - | 'SHADER_COMPILATION_FAILED' - | 'CREATE_PROGRAM_FAILED' - | 'SHADER_LINK_FAILED' - | 'SET_UNIFORM_FAILED'; - -/** Common error class for all errors thrown by this modules Program class */ -export class WebGlProgramError extends Error { - name: ErrorName; - message: string; - - constructor(name: ErrorName, message: string) { - super(); - this.name = name; - this.message = message; - } -} - -/** High level wrapper around a WebGLProgram - - # Examples - ```ts - const program = new Program(glContext, vertexSource, FragmentSource); - program.use(); - program.setUniformVec2f('u_offset', 10, 20); - glContext.drawArrays(glContext.LINES, 0, 2); - ``` -*/ -export class Program { - private context: WebGL2RenderingContext; - private program: WebGLProgram; - - constructor( - glContext: WebGL2RenderingContext, - vertexSource: string = defaultVertexSource, - fragmentSource: string = defaultFragmentSource - ) { - this.context = glContext; - - const vertexShader = this.compileShader(vertexSource, ShaderType.Vertex); - const fragmentShader = this.compileShader(fragmentSource, ShaderType.Fragment); - - this.program = this.linkShaders(vertexShader, fragmentShader); - } - - /** Marks the program for use on the context that was passed in the constructor */ - public use() { - this.context.useProgram(this.program); - } - - /** Sets a float uniform by name */ - public setUniformFloat(name: string, a: number) { - const location = this.getUniformLocation(name); - this.context.uniform1f(location, a); - } - - /** Sets a Vec2f uniform by name */ - public setUniformVec2f(name: string, a: number, b: number) { - const location = this.getUniformLocation(name); - this.context.uniform2f(location, a, b); - } - - /** Sets a Vec3f uniform by name */ - public setUniformVec3f(name: string, a: number, b: number, c: number) { - const location = this.getUniformLocation(name); - this.context.uniform3f(location, a, b, c); - } - - /** Sets a Vec4f uniform by name */ - public setUniformVec4f(name: string, a: number, b: number, c: number, d: number) { - const location = this.getUniformLocation(name); - this.context.uniform4f(location, a, b, c, d); - } - - private getUniformLocation(name: string): WebGLUniformLocation { - const location = this.context.getUniformLocation(this.program, name); - - if (location === null) { - throw new WebGlProgramError('SET_UNIFORM_FAILED', `Failed to lookup location of uniform "${name}"`); - } - - return location; - } - - private compileShader(source: string, type: ShaderType): WebGLShader { - // Create the shader - const shader = this.context.createShader(shaderTypeToGlType(type)); - - if (shader === null) { - const typeString = shaderTypeToString(type); - - throw new WebGlProgramError( - 'CREATE_SHADER_FAILED', - `Call to createShader failed, unable to create ${typeString} shader object` - ); - } - - // Add the source to the shader and compile it - this.context.shaderSource(shader, source); - this.context.compileShader(shader); - - // Check whether compilation was succesful and throw an error if it wasn't - if (!this.context.getShaderParameter(shader, this.context.COMPILE_STATUS)) { - const info = this.context.getShaderInfoLog(shader); - const typeString = shaderTypeToString(type); - - throw new WebGlProgramError( - 'SHADER_COMPILATION_FAILED', - `Failed to compile ${typeString} shader:\n${info}` - ); - } - - return shader; - } - - private linkShaders(vertex: WebGLShader, fragment: WebGLShader): WebGLProgram { - // Create the shader - const program = this.context.createProgram(); - - if (program === null) { - throw new WebGlProgramError( - 'CREATE_PROGRAM_FAILED', - `Call to createProgram failed, unable to create shader program object` - ); - } - - // Attach the shaders to the program - this.context.attachShader(program, vertex); - this.context.attachShader(program, fragment); - - // Link the program - this.context.linkProgram(program); - - // Check whether linking was succesful and throw an error if it wasn't - if (!this.context.getProgramParameter(program, this.context.LINK_STATUS)) { - const info = this.context.getProgramInfoLog(program); - - throw new WebGlProgramError('SHADER_LINK_FAILED', `Failed to link program:\n${info}`); - } - - return program; - } -} diff --git a/lib/src/webgl/rectangle.rs b/lib/src/webgl/rectangle.rs new file mode 100644 index 0000000..f0ee1cf --- /dev/null +++ b/lib/src/webgl/rectangle.rs @@ -0,0 +1,203 @@ +use anyhow::{bail, Result}; +use web_sys::{js_sys, WebGl2RenderingContext, WebGlBuffer, WebGlVertexArrayObject}; + +use crate::gfx::Color; + +use super::{ + types::{ElementType, WebGlElement}, + RenderingProgram, +}; + +/** Struct for rendering rectangle primitives + + This is a helper class for webgl to render rectangle primitives. + + The constructor takes in a rendering context and an array of rectangles plus a color. + It then creates a Vertex buffer (GPU memory to store the locations of the rectangles) + and a Vertex array (OpenGL state object that contains settings and the layout of the GPU memory). + + The draw() method passes some additional configruation about the viewport to the GPU + and then batch renders all the rectangles that were passed in the constructor. + + For optimal performance try to batch as many rectangles in an object of this class as possible, + because that allows the GPU to do as much of it as possible in parallel. +*/ +pub struct RectangleCoords { + pub x1: f32, + pub x2: f32, + pub y1: f32, + pub y2: f32, +} + +pub struct Rectangle { + r#type: Option, + + color: Color, + + vao: WebGlVertexArrayObject, + ebo: WebGlBuffer, + + amount: i32, +} + +impl Rectangle { + pub fn new( + program: &RenderingProgram, + rects: Vec, + color: Color, + ) -> Result { + let gl = program.get_gl(); + + // Create vertex array object + let Some(vao) = gl.create_vertex_array() else { + bail!("Unable to create vao"); + }; + + // Create vertex buffer object + let Some(vbo) = gl.create_buffer() else { + bail!("Unable to create vbo"); + }; + + // Create element buffer object + let Some(ebo) = gl.create_buffer() else { + bail!("Unable to create ebo"); + }; + + // Setup the data + gl.bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, Some(&vbo)); + let verts_data: Vec = rects + .iter() + .flat_map(|l| { + [ + l.x1, l.y1, // Vertex 0: Bottom left + l.x2, l.y1, // Vertex 1: Bottom right + l.x1, l.y2, // Vertex 2: Top left + l.x2, l.y2, // Vertex 3: Top right + ] + }) + .collect(); + // Pass it to the GPU + // Unsafe because Float32Array::view creates a raw view into our wasm memory buffer. + // Do NOT do any memory allocations before 'verts' is dropped. + unsafe { + let verts = js_sys::Float32Array::view(&verts_data[..]); + gl.buffer_data_with_array_buffer_view( + WebGl2RenderingContext::ARRAY_BUFFER, + &verts, + WebGl2RenderingContext::STATIC_DRAW, + ); + } + + // Setup the indices and pass them to the element array buffer + gl.bind_buffer(WebGl2RenderingContext::ELEMENT_ARRAY_BUFFER, Some(&ebo)); + // A rectangle consist of two triangles + // +--------+ + // | /| + // | 2 / | + // | / | + // | / | + // | / | + // | / | + // | / 1 | + // |/ | + // +--------+ + let indices_data: Vec = (0..rects.len()) + .flat_map(|index| { + [ + (0 + 4 * index) as u32, + (1 + 4 * index) as u32, + (3 + 4 * index) as u32, // Triangle 1 + (3 + 4 * index) as u32, + (2 + 4 * index) as u32, + (0 + 4 * index) as u32, // Triangle 2 + ] + }) + .collect(); + let amount = rects.len() * 6; // 6 elements per rectangle + + // Pass it to the GPU + // Unsafe because Float32Array::view creates a raw view into our wasm memory buffer. + // Do NOT do any memory allocations before 'verts' is dropped. + unsafe { + let indices = js_sys::Uint32Array::view(&indices_data[..]); + gl.buffer_data_with_array_buffer_view( + WebGl2RenderingContext::ELEMENT_ARRAY_BUFFER, + &indices, + WebGl2RenderingContext::STATIC_DRAW, + ); + } + + gl.bind_vertex_array(Some(&vao)); + gl.enable_vertex_attrib_array(0); + + // This specifies the layout of the data in the vertex buffer to the gpu + // The vertices are packed tightly as 2 float vectors, i.e. the gpu memory looks like: + // [v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, ...etc] + // index is 0 (which corresponds to the layout(location = 0) in the vertex shader, see program.ts:defaultVertexSource). + // Data is not normalized to screen coordinates, we have custom logic for that in the + // vertex shader to handle with zooming and panning. + gl.vertex_attrib_pointer_with_f64(0, 2, WebGl2RenderingContext::FLOAT, false, 0, 0.0); + + // Reset bindings, technically not required, but can prevent nasty bugs once more vertex + // arrays are used in the same rendering context. + gl.bind_buffer(WebGl2RenderingContext::ARRAY_BUFFER, None); + gl.bind_buffer(WebGl2RenderingContext::ELEMENT_ARRAY_BUFFER, None); + gl.bind_vertex_array(None); + + return Ok(Rectangle { + r#type: None, + color, + vao, + ebo, + amount: amount.try_into().unwrap(), + }); + } +} + +impl WebGlElement<'_> for Rectangle { + fn set_type(&mut self, r#type: ElementType) { + self.r#type = Some(r#type); + } + + fn get_type(&self) -> Option<&ElementType> { + return self.r#type.as_ref(); + } + + fn draw( + &self, + program: &RenderingProgram, + offset_x: f32, + offset_y: f32, + scale: f32, + canvas_width: f32, + canvas_height: f32, + ) -> Result<()> { + let gl = program.get_gl(); + + program.r#use(); + program.set_uniform_vec_2f(&"u_canvas_size".to_string(), canvas_width, canvas_height)?; + program.set_uniform_vec_2f(&"u_offset".to_string(), offset_x, offset_y)?; + program.set_uniform_float(&"u_scale".to_string(), scale)?; + program.set_uniform_vec_4f( + &"u_color".to_string(), + self.color.float_r(), + self.color.float_g(), + self.color.float_b(), + 1.0, + )?; + + gl.bind_vertex_array(Some(&self.vao)); + gl.bind_buffer( + WebGl2RenderingContext::ELEMENT_ARRAY_BUFFER, + Some(&self.ebo), + ); + gl.draw_elements_with_f64( + WebGl2RenderingContext::TRIANGLES, + self.amount, + WebGl2RenderingContext::UNSIGNED_INT, + 0.0, + ); + + return Ok(()); + } +} diff --git a/lib/src/webgl/rectangle.ts b/lib/src/webgl/rectangle.ts deleted file mode 100644 index ee2240b..0000000 --- a/lib/src/webgl/rectangle.ts +++ /dev/null @@ -1,120 +0,0 @@ -import {type Program} from './program'; -import {WebGLElement} from './webgl'; - -/** Class for rendering rectangle primitives - - This is a helper class for webgl to render rectangle primitives. - - The constructor takes in a rendering context and an array of rectangles plus a color. - It then creates a Vertex buffer (GPU memory to store the locations of the rectangles) - and a Vertex array (OpenGL state object that contains settings and the layout of the GPU memory). - - The draw() method passes some additional configruation about the viewport to the GPU - and then batch renders all the rectangles that were passed in the constructor. - - For optimal performance try to batch as many rectangles in an object of this class as possible, - because that allows the GPU to do as much of it as possible in parallel. -*/ -export class Rectangle extends WebGLElement { - private _vao: WebGLVertexArrayObject; // Vertex array object - private _vbo: WebGLBuffer; // Vertex buffer object - private _ebo: WebGLBuffer; // Element buffer object - - private _amount: number; - - constructor( - gl: WebGL2RenderingContext, - program: Program, - rectangles: Array<{x1: number; x2: number; y1: number; y2: number}>, - private _color: {r: number; g: number; b: number} - ) { - super(gl, program); - - // Create vertex array object - const vao = gl.createVertexArray(); - if (vao === null) throw 'unable to create vao'; - this._vao = vao; - - // Create vertex buffer object - const vbo = gl.createBuffer(); - if (vbo === null) throw 'unable to create vbo'; - this._vbo = vbo; - - // Create element buffer object - const ebo = gl.createBuffer(); - if (ebo === null) throw 'unable to create ebo'; - this._ebo = ebo; - - // Setup the data and pass it to the GPU using gl.bufferData() - gl.bindBuffer(gl.ARRAY_BUFFER, this._vbo); - const verts = new Float32Array( - rectangles.flatMap((l) => [ - l.x1, - l.y1, // Vertex 0: Bottom left - l.x2, - l.y1, // Vertex 1: Bottom right - l.x1, - l.y2, // Vertex 2: Top left - l.x2, - l.y2 - ]) - ); // Vertex 3: Top right - gl.bufferData(gl.ARRAY_BUFFER, verts, gl.STATIC_DRAW); - - // Setup the indices and pass them to the element array buffer - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo); - // A rectangle consist of two triangles - // +--------+ - // | /| - // | 2 / | - // | / | - // | / | - // | / | - // | / | - // | / 1 | - // |/ | - // +--------+ - const indices = new Uint32Array( - rectangles.flatMap((_, index) => [ - 0 + 4 * index, - 1 + 4 * index, - 3 + 4 * index, // Triangle 1 - 3 + 4 * index, - 2 + 4 * index, - 0 + 4 * index // Triangle 2 - ]) - ); - this._amount = rectangles.length * 6; // 6 elements per rectangle - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); - - gl.bindVertexArray(this._vao); - gl.enableVertexAttribArray(0); - // This specifies the layout of the data in the vertex buffer to the gpu - // The vertices are packed tightly as 2 float vectors, i.e. the gpu memory looks like: - // [v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, ...etc] - // index is 0 (which corresponds to the layout(location = 0) in the vertex shader, see program.ts:defaultVertexSource). - // Data is not normalized to screen coordinates, we have custom logic for that in the - // vertex shader to handle with zooming and panning. - gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); - - // Reset bindings, technically not required, but can prevent nasty bugs once more vertex - // arrays are used in the same rendering context. - gl.bindBuffer(gl.ARRAY_BUFFER, null); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - gl.bindVertexArray(null); - } - - public draw(offsetX: number, offsetY: number, scale: number, canvasWidth: number, canvasHeight: number): void { - const gl = this.gl; - - this.program.use(); - this.program.setUniformVec2f('u_canvas_size', canvasWidth, canvasHeight); - this.program.setUniformVec2f('u_offset', offsetX, offsetY); - this.program.setUniformFloat('u_scale', scale); - this.program.setUniformVec4f('u_color', this._color.r, this._color.g, this._color.b, 1); - - gl.bindVertexArray(this._vao); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._ebo); - gl.drawElements(gl.TRIANGLES, this._amount, gl.UNSIGNED_INT, 0); - } -} diff --git a/lib/src/webgl/types.rs b/lib/src/webgl/types.rs new file mode 100644 index 0000000..5bd09d0 --- /dev/null +++ b/lib/src/webgl/types.rs @@ -0,0 +1,27 @@ +use anyhow::Result; + +use super::RenderingProgram; + +#[derive(Clone, Hash, PartialEq, Eq)] +pub enum ElementType { + Wire, + Group, + Bel, + Pip, +} + +pub trait WebGlElement<'a> { + fn set_type(&mut self, r#type: ElementType); + + fn get_type(&self) -> Option<&ElementType>; + + fn draw( + &self, + program: &RenderingProgram, + offset_x: f32, + offset_y: f32, + scale: f32, + canvas_width: f32, + canvas_height: f32, + ) -> Result<()>; +} diff --git a/lib/src/webgl/webgl.ts b/lib/src/webgl/webgl.ts deleted file mode 100644 index f458013..0000000 --- a/lib/src/webgl/webgl.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {type Program} from './program'; - -export type ElementType = 'wire' | 'group' | 'bel' | 'pip'; - -export abstract class WebGLElement { - private _gl: WebGL2RenderingContext; // Rendering context - private _program: Program; // Rendering program - - private _type: ElementType | null; - - constructor(gl: WebGL2RenderingContext, program: Program) { - this._gl = gl; - this._program = program; - - this._type = null; - } - - protected get gl(): WebGL2RenderingContext { - return this._gl; - } - - protected get program(): Program { - return this._program; - } - - public get type(): ElementType | null { - return this._type; - } - - public set type(type: ElementType | null) { - this._type = type; - } - - abstract draw(offsetX: number, offsetY: number, scale: number, canvasWidth: number, canvasHeight: number): void; -} diff --git a/lib/tsconfig.json b/lib/tsconfig.json index 223b8e6..f016bc4 100644 --- a/lib/tsconfig.json +++ b/lib/tsconfig.json @@ -1,9 +1,10 @@ { - "include": ["src/**/*"], - "exclude": ["node_module"], "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "declarationDir": "./dist", "target": "es2021", - "outDir": "./lib", "strict": true, "moduleResolution": "node", "module": "es2022" diff --git a/package-lock.json b/package-lock.json index 749e2ec..fd02571 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,21 +10,17 @@ "parcel-optimizer-array-buffer", "viewer-test" ], - "dependencies": { - "rxjs": "^7.8.0" - }, "devDependencies": { - "@parcel/config-default": "^2.7.0", - "@parcel/packager-ts": "^2.7.0", - "@parcel/transformer-inline": "^2.7.0", - "@parcel/transformer-typescript-types": "^2.7.0", - "@parcel/validator-typescript": "^2.7.0", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^12.1.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/node": "^18.11.7", - "parcel": "^2.7.0", - "path-browserify": "^1.0.1", + "@web/rollup-plugin-html": "^2.3.0", + "@web/rollup-plugin-import-meta-assets": "^2.2.1", "prettier": "^3.3.3", - "process": "^0.11.10", + "rollup": "^4.28.0", + "rollup-plugin-serve": "^1.1.1", "typescript": "^4.8.3" } }, @@ -33,16 +29,22 @@ "version": "0.6.1", "license": "MIT", "dependencies": { - "rxjs": "^7.8.0" + "nextpnr-renderer": "file:./pkg" } }, + "lib/pkg": { + "name": "nextpnr-renderer", + "version": "0.0.1" + }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -54,6 +56,7 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -68,6 +71,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -77,6 +81,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -85,14 +90,14 @@ } }, "node_modules/@babel/helper-environment-visitor/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -103,6 +108,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" @@ -112,14 +118,14 @@ } }, "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -130,6 +136,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -138,14 +145,14 @@ } }, "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -156,6 +163,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -164,121 +172,47 @@ } }, "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -288,42 +222,43 @@ } }, "node_modules/@babel/parser/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -334,6 +269,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", @@ -351,12 +287,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -366,14 +304,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -384,6 +322,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -393,6 +332,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -405,6 +345,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -413,11 +354,115 @@ "node": ">=6.9.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -428,10 +473,11 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -441,1276 +487,1252 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "node_modules/@lezer/lr": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { - "@lezer/common": "^0.15.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "cpu": [ - "arm64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "cpu": [ - "arm" - ], + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=14" + } }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "cpu": [ - "arm64" - ], + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", + "node_modules/@rollup/plugin-dynamic-import-vars": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-dynamic-import-vars/-/plugin-dynamic-import-vars-2.1.5.tgz", + "integrity": "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ==", "dev": true, + "license": "MIT", "dependencies": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" + "@rollup/pluginutils": "^5.0.1", + "astring": "^1.8.5", + "estree-walker": "^2.0.2", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.3" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, - "optional": true, - "os": [ - "darwin" + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", + "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", + "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", + "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", + "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", + "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", + "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", + "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", + "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", + "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", + "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", + "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", + "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", + "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", + "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", + "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", + "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", + "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", + "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", + "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "@babel/generator": "7.17.7", + "@babel/parser": "^7.20.5", + "@babel/traverse": "7.23.2", + "@babel/types": "7.17.0", + "javascript-natural-sort": "0.7.1", + "lodash": "^4.17.21" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "peerDependencies": { + "@vue/compiler-sfc": "3.x", + "prettier": "2.x - 3.x" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } } }, - "node_modules/@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", + "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", "dev": true, "dependencies": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "undici-types": "~5.26.4" } }, - "node_modules/@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@types/yargs-parser": "*" } }, - "node_modules/@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@web/parse5-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.1.0.tgz", + "integrity": "sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0" + "@types/parse5": "^6.0.1", + "parse5": "^6.0.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18.0.0" } }, - "node_modules/@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", + "node_modules/@web/rollup-plugin-html": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@web/rollup-plugin-html/-/rollup-plugin-html-2.3.0.tgz", + "integrity": "sha512-ap4AisBacK6WwrTnVlPErupxlywWU1ELsjGIMZ4VpofvhbVTBIGErJo5VEj2mSJyEH3I1EbzUcWuhDCePrnWEw==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" + "@web/parse5-utils": "^2.1.0", + "glob": "^10.0.0", + "html-minifier-terser": "^7.1.0", + "lightningcss": "^1.24.0", + "parse5": "^6.0.1", + "picomatch": "^2.2.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", + "node_modules/@web/rollup-plugin-html/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "balanced-match": "^1.0.0" } }, - "node_modules/@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", + "node_modules/@web/rollup-plugin-html/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { - "lightningcss": "^1.14.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 12.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "node_modules/@web/rollup-plugin-html/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" + "brace-expansion": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", - "dev": true, "engines": { - "node": ">= 12.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "node_modules/@web/rollup-plugin-import-meta-assets": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@web/rollup-plugin-import-meta-assets/-/rollup-plugin-import-meta-assets-2.2.1.tgz", + "integrity": "sha512-nG7nUQqSJWdl63pBTmnIElJuFi2V1x9eVje19BJuFvfz266jSmZtX3m30ncb7fOJxQt3/ge+FVL8tuNI9+63dQ==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" + "@rollup/plugin-dynamic-import-vars": "^2.1.0", + "@rollup/pluginutils": "^5.0.2", + "estree-walker": "^2.0.2", + "globby": "^13.2.2", + "magic-string": "^0.30.0" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "node": ">=18.0.0" } }, - "node_modules/@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.4.0" } }, - "node_modules/@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", - "dev": true, - "dependencies": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "license": "MIT", + "bin": { + "astring": "bin/astring" } }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, - "node_modules/@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, - "node_modules/@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" + "source-map": "~0.6.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10.0" } }, - "node_modules/@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", - "dev": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=7.0.0" } }, - "node_modules/@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=14" } }, - "node_modules/@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } + "license": "MIT" }, - "node_modules/@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 8" } }, - "node_modules/@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" + "ms": "^2.1.3" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">=6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10.0" } }, - "node_modules/@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10" } }, - "node_modules/@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, + "license": "MIT" + }, + "node_modules/edacation": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/edacation/-/edacation-0.3.0.tgz", + "integrity": "sha512-TnJfOAAwNBa6FAczowuTFVMtmPZps8JJT/thnHaOHDmscuEtz35TzPUOraO/zEYdoSbN5pAYq2sMjTWpKYJSIA==", "dependencies": { - "@parcel/types": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" + "@types/node": "^20.11.0", + "@types/yargs": "^17.0.32", + "string-args-parser": "^1.0.4", + "yargs": "^17.7.2", + "zod": "^3.22.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "edacation": "dist/cli/index.js" } }, - "node_modules/@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", - "dev": true, + "node_modules/edacation/node_modules/@types/node": { + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "undici-types": "~5.26.4" } }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">=0.12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", - "dev": true, - "dependencies": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" - }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=6" } }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8.6.0" } }, - "node_modules/@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "reusify": "^1.0.4" } }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.18.3 || >=14" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 6" } }, - "node_modules/@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "node": ">= 0.4" } }, - "node_modules/@parcel/transformer-inline": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-inline/-/transformer-inline-2.7.0.tgz", - "integrity": "sha512-E51tqotzia8mxErUaA8hJmEntFifyVK3OLui+avSZoBR31XTpKIc3xnEDSBbLI9Hn50sj5SG0J5XrKeiet/YTg==", + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0" + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "bin": { + "html-minifier-terser": "cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - }, + "license": "MIT", "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "node": ">= 4" } }, - "node_modules/@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10.0" } }, - "node_modules/@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10.0" } }, - "node_modules/@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.12.0" } }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@types/estree": "*" } }, - "node_modules/@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "typescript": ">=3.0.0" + "node": ">=4" } }, - "node_modules/@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "node_modules/lightningcss": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", + "integrity": "sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA==", "dev": true, + "license": "MPL-2.0", "dependencies": { - "nullthrows": "^1.1.1" + "detect-libc": "^1.0.3" }, "engines": { "node": ">= 12.0.0" @@ -1719,39 +1741,53 @@ "type": "opencollective", "url": "https://opencollective.com/parcel" }, - "peerDependencies": { - "typescript": ">=3.0.0" + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.28.2", + "lightningcss-darwin-x64": "1.28.2", + "lightningcss-freebsd-x64": "1.28.2", + "lightningcss-linux-arm-gnueabihf": "1.28.2", + "lightningcss-linux-arm64-gnu": "1.28.2", + "lightningcss-linux-arm64-musl": "1.28.2", + "lightningcss-linux-x64-gnu": "1.28.2", + "lightningcss-linux-x64-musl": "1.28.2", + "lightningcss-win32-arm64-msvc": "1.28.2", + "lightningcss-win32-x64-msvc": "1.28.2" } }, - "node_modules/@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz", + "integrity": "sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz", + "integrity": "sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">= 12.0.0" }, @@ -1760,2871 +1796,1477 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/validator-typescript": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/validator-typescript/-/validator-typescript-2.7.0.tgz", - "integrity": "sha512-VZfFRbsCw0jaZVsVjbIFxa1ROVn7Yqq1zGDp30x/pPKC+vyWv0OkVybeCis7lO96Z/ojVB7hILzVi8nj+86JLA==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz", + "integrity": "sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "typescript": ">=3.0.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.5.tgz", - "integrity": "sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz", + "integrity": "sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg==", + "cpu": [ + "arm" + ], "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.0.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz", + "integrity": "sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" } }, - "node_modules/@swc/helpers": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.12.tgz", - "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz", + "integrity": "sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "tslib": "^2.4.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", - "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz", + "integrity": "sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/generator": "7.17.7", - "@babel/parser": "^7.20.5", - "@babel/traverse": "7.23.2", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", - "lodash": "^4.17.21" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "peerDependencies": { - "@vue/compiler-sfc": "3.x", - "prettier": "2.x - 3.x" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz", + "integrity": "sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "@vue/compiler-sfc": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz", + "integrity": "sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.13.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/node": { - "version": "18.19.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", - "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz", + "integrity": "sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "undici-types": "~5.26.4" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "tslib": "^2.0.3" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "node_modules/magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8.6" } }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "node_modules/nextpnr-renderer": { + "resolved": "lib/pkg", + "link": true + }, + "node_modules/nextpnr-viewer": { + "resolved": "lib", + "link": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "engines": { - "node": ">=6" + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001427", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001427.tgz", - "integrity": "sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "license": "BlueOak-1.0.0" }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } + "license": "MIT" }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" + "node": ">=8.6" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { - "detect-libc": "bin/detect-libc.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "node": ">=14" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, + "license": "MIT", "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/edacation": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/edacation/-/edacation-0.3.0.tgz", - "integrity": "sha512-TnJfOAAwNBa6FAczowuTFVMtmPZps8JJT/thnHaOHDmscuEtz35TzPUOraO/zEYdoSbN5pAYq2sMjTWpKYJSIA==", + "node_modules/rollup": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", + "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^20.11.0", - "@types/yargs": "^17.0.32", - "string-args-parser": "^1.0.4", - "yargs": "^17.7.2", - "zod": "^3.22.4" + "@types/estree": "1.0.6" }, "bin": { - "edacation": "dist/cli/index.js" - } - }, - "node_modules/edacation/node_modules/@types/node": { - "version": "20.11.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", - "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.28.0", + "@rollup/rollup-android-arm64": "4.28.0", + "@rollup/rollup-darwin-arm64": "4.28.0", + "@rollup/rollup-darwin-x64": "4.28.0", + "@rollup/rollup-freebsd-arm64": "4.28.0", + "@rollup/rollup-freebsd-x64": "4.28.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", + "@rollup/rollup-linux-arm-musleabihf": "4.28.0", + "@rollup/rollup-linux-arm64-gnu": "4.28.0", + "@rollup/rollup-linux-arm64-musl": "4.28.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", + "@rollup/rollup-linux-riscv64-gnu": "4.28.0", + "@rollup/rollup-linux-s390x-gnu": "4.28.0", + "@rollup/rollup-linux-x64-gnu": "4.28.0", + "@rollup/rollup-linux-x64-musl": "4.28.0", + "@rollup/rollup-win32-arm64-msvc": "4.28.0", + "@rollup/rollup-win32-ia32-msvc": "4.28.0", + "@rollup/rollup-win32-x64-msvc": "4.28.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-serve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-1.1.1.tgz", + "integrity": "sha512-H0VarZRtFR0lfiiC9/P8jzCDvtFf1liOX4oSdIeeYqUCKrmFA7vNiQ0rg2D+TuoP7leaa/LBR8XBts5viF6lnw==", + "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "mime": "^2", + "opener": "1" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "node_modules/rollup-plugin-serve/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "engines": { - "node": ">=0.12" + "license": "MIT", + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "queue-microtask": "^1.2.2" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/htmlnano": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" - }, - "peerDependencies": { - "cssnano": "^5.0.11", - "postcss": "^8.3.11", - "purgecss": "^4.0.3", - "relateurl": "^0.2.7", - "srcset": "^5.0.0", - "svgo": "^2.8.0", - "terser": "^5.10.0", - "uncss": "^0.17.3" - }, - "peerDependenciesMeta": { - "cssnano": { - "optional": true - }, - "postcss": { - "optional": true - }, - "purgecss": { - "optional": true - }, - "relateurl": { - "optional": true - }, - "srcset": { - "optional": true - }, - "svgo": { - "optional": true - }, - "terser": { - "optional": true - }, - "uncss": { - "optional": true - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } + "node_modules/string-args-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string-args-parser/-/string-args-parser-1.0.4.tgz", + "integrity": "sha512-SztELV0FKLzrxTOLnAPL3C15S7e6gtg2jPHAQ4CGEeMS0UNQAtcbFbLln770CpAfL+gCK61tvnETFhJ2ELNX+Q==" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, - "node_modules/is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true - }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "dev": true, - "hasInstallScript": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" + "ansi-regex": "^5.0.1" }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2" + "engines": { + "node": ">=8" } }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/msgpackr": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", - "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/msgpackr-extract/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/nextpnr-viewer": { - "resolved": "lib", - "link": true - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "node_modules/ordered-binary": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", - "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", - "dev": true - }, - "node_modules/parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "dependencies": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - }, - "bin": { - "parcel": "lib/bin.js" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "dependencies": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", - "dev": true, - "dependencies": { - "is-json": "^2.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml/node_modules/posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/string-args-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string-args-parser/-/string-args-parser-1.0.4.tgz", - "integrity": "sha512-SztELV0FKLzrxTOLnAPL3C15S7e6gtg2jPHAQ4CGEeMS0UNQAtcbFbLln770CpAfL+gCK61tvnETFhJ2ELNX+Q==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-nextpnr-viewer": { - "resolved": "viewer-test", - "link": true - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "parcel-optimizer-array-buffer": { - "version": "1.0.0", - "extraneous": true, - "dependencies": { - "@parcel/plugin": "^2.7.0", - "@parcel/utils": "^2.7.0" - }, - "devDependencies": { - "parcel": "^2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - } - }, - "viewer-test": { - "name": "test-nextpnr-viewer", - "version": "1.0.0", - "dependencies": { - "edacation": "^0.3.0", - "nextpnr-viewer": "^0.6.1" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - } - }, - "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "dev": true - }, - "@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", - "dev": true, - "requires": { - "@babel/types": "^7.25.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "dev": true, - "requires": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - } - }, - "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "@lezer/lr": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.0" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "dev": true, - "optional": true - }, - "@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" - } - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "dev": true, - "optional": true - }, - "@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "requires": { - "chalk": "^4.1.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", - "dev": true, - "requires": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" - } - }, - "@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - } - }, - "@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", + "license": "MIT" + }, + "node_modules/test-nextpnr-viewer": { + "resolved": "viewer-test", + "link": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "requires": { - "lightningcss": "^1.14.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, - "@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, - "requires": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" } }, - "@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "detect-libc": "^1.0.3" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", - "dev": true, - "requires": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" } }, - "@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", - "dev": true, - "requires": { - "chalk": "^4.1.0" + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" } }, - "@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", - "dev": true, - "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" + "parcel-optimizer-array-buffer": { + "version": "1.0.0", + "extraneous": true, + "dependencies": { + "@parcel/plugin": "^2.7.0", + "@parcel/utils": "^2.7.0" + }, + "devDependencies": { + "parcel": "^2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" } }, - "@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", + "pkg": { + "name": "nextpnr-renderer", + "version": "0.0.1", + "extraneous": true + }, + "viewer-test": { + "name": "test-nextpnr-viewer", + "version": "1.0.0", + "dependencies": { + "edacation": "^0.3.0", + "nextpnr-viewer": "../lib" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, - "@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", + "@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } } }, - "@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", + "@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", + "@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", + "@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", + "@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true + }, + "@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" + "@babel/types": "^7.26.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", + "@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "dependencies": { + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + } } }, - "@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0" + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "requires": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true + } } }, - "@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } }, - "@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } } }, - "@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@parcel/types": "2.7.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" } }, - "@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" } }, - "@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } + "optional": true }, - "@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", + "@rollup/plugin-commonjs": { + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } } }, - "@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", + "@rollup/plugin-dynamic-import-vars": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-dynamic-import-vars/-/plugin-dynamic-import-vars-2.1.5.tgz", + "integrity": "sha512-Mymi24fd9hlRifdZV/jYIFj1dn99F34imiYu3KzlAcgBcRi3i9SucgW/VRo5SQ9K4NuQ7dCep6pFWgNyhRdFHQ==", "dev": true, "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "@rollup/pluginutils": "^5.0.1", + "astring": "^1.8.5", + "estree-walker": "^2.0.2", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.3" } }, - "@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, "requires": { - "detect-libc": "^1.0.3" + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" } }, - "@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", + "@rollup/plugin-typescript": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", "dev": true, "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" } }, - "@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", + "@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", "dev": true, "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } } }, - "@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", + "@rollup/rollup-android-arm-eabi": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", + "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } + "optional": true }, - "@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", + "@rollup/rollup-android-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", + "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" - } + "optional": true }, - "@parcel/transformer-inline": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-inline/-/transformer-inline-2.7.0.tgz", - "integrity": "sha512-E51tqotzia8mxErUaA8hJmEntFifyVK3OLui+avSZoBR31XTpKIc3xnEDSBbLI9Hn50sj5SG0J5XrKeiet/YTg==", + "@rollup/rollup-darwin-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", + "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } + "optional": true }, - "@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", + "@rollup/rollup-darwin-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", + "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - } + "optional": true }, - "@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", + "@rollup/rollup-freebsd-arm64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", + "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" - } + "optional": true }, - "@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", + "@rollup/rollup-freebsd-x64": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", + "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - } + "optional": true }, - "@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", + "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } + "optional": true }, - "@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", + "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } + "optional": true }, - "@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", + "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - } + "optional": true }, - "@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", + "@rollup/rollup-linux-arm64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", + "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } + "optional": true }, - "@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", + "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } + "optional": true }, - "@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", + "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", "dev": true, - "requires": { - "nullthrows": "^1.1.1" - } + "optional": true }, - "@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", + "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", "dev": true, - "requires": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" - } + "optional": true }, - "@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "@rollup/rollup-linux-x64-gnu": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", + "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", "dev": true, - "requires": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - } + "optional": true }, - "@parcel/validator-typescript": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/validator-typescript/-/validator-typescript-2.7.0.tgz", - "integrity": "sha512-VZfFRbsCw0jaZVsVjbIFxa1ROVn7Yqq1zGDp30x/pPKC+vyWv0OkVybeCis7lO96Z/ojVB7hILzVi8nj+86JLA==", + "@rollup/rollup-linux-x64-musl": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", + "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0" - } + "optional": true }, - "@parcel/watcher": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.5.tgz", - "integrity": "sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw==", + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", + "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", "dev": true, - "requires": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - } + "optional": true }, - "@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", + "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - } + "optional": true }, - "@swc/helpers": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.12.tgz", - "integrity": "sha512-R6RmwS9Dld5lNvwKlPn62+piU+WDG1sMfsnfJioXCciyko/gZ0DQ4Mqglhq1iGU1nQ/RcGkAwfMH+elMSkJH3Q==", + "@rollup/rollup-win32-x64-msvc": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", + "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", "dev": true, - "requires": { - "tslib": "^2.4.0" - } + "optional": true }, "@trivago/prettier-plugin-sort-imports": { "version": "4.3.0", @@ -4640,10 +3282,10 @@ "lodash": "^4.17.21" } }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "@types/node": { @@ -4655,10 +3297,16 @@ "undici-types": "~5.26.4" } }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true }, "@types/yargs": { @@ -4674,16 +3322,81 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, - "abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true + "@web/parse5-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.1.0.tgz", + "integrity": "sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==", + "dev": true, + "requires": { + "@types/parse5": "^6.0.1", + "parse5": "^6.0.1" + } + }, + "@web/rollup-plugin-html": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@web/rollup-plugin-html/-/rollup-plugin-html-2.3.0.tgz", + "integrity": "sha512-ap4AisBacK6WwrTnVlPErupxlywWU1ELsjGIMZ4VpofvhbVTBIGErJo5VEj2mSJyEH3I1EbzUcWuhDCePrnWEw==", + "dev": true, + "requires": { + "@web/parse5-utils": "^2.1.0", + "glob": "^10.0.0", + "html-minifier-terser": "^7.1.0", + "lightningcss": "^1.24.0", + "parse5": "^6.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@web/rollup-plugin-import-meta-assets": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@web/rollup-plugin-import-meta-assets/-/rollup-plugin-import-meta-assets-2.2.1.tgz", + "integrity": "sha512-nG7nUQqSJWdl63pBTmnIElJuFi2V1x9eVje19BJuFvfz266jSmZtX3m30ncb7fOJxQt3/ge+FVL8tuNI9+63dQ==", + "dev": true, + "requires": { + "@rollup/plugin-dynamic-import-vars": "^2.1.0", + "@rollup/pluginutils": "^5.0.2", + "estree-walker": "^2.0.2", + "globby": "^13.2.2", + "magic-string": "^0.30.0" + } }, "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "ansi-regex": { @@ -4699,31 +3412,25 @@ "color-convert": "^2.0.1" } }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } + "astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "fill-range": "^7.1.1" } }, "buffer-from": { @@ -4732,33 +3439,24 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001427", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001427.tgz", - "integrity": "sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ==", - "dev": true - }, - "chalk": { + "camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } }, "cliui": { "version": "8.0.1", @@ -4770,12 +3468,6 @@ "wrap-ansi": "^7.0.0" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4790,132 +3482,72 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "css-tree": "^1.1.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } + "dev": true, + "requires": { + "ms": "^2.1.3" } }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "path-type": "^4.0.0" } }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "edacation": { @@ -4940,41 +3572,80 @@ } } }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "get-caller-file": { @@ -4982,64 +3653,71 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "type-fest": "^0.20.2" + "is-glob": "^4.0.1" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } }, - "htmlnano": { + "hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "requires": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" + "function-bind": "^1.1.2" } }, - "htmlparser2": { + "html-minifier-terser": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "hasown": "^2.0.2" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -5047,12 +3725,52 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -5071,123 +3789,94 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, "lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", + "integrity": "sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA==", "dev": true, "requires": { "detect-libc": "^1.0.3", - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" + "lightningcss-darwin-arm64": "1.28.2", + "lightningcss-darwin-x64": "1.28.2", + "lightningcss-freebsd-x64": "1.28.2", + "lightningcss-linux-arm-gnueabihf": "1.28.2", + "lightningcss-linux-arm64-gnu": "1.28.2", + "lightningcss-linux-arm64-musl": "1.28.2", + "lightningcss-linux-x64-gnu": "1.28.2", + "lightningcss-linux-x64-musl": "1.28.2", + "lightningcss-win32-arm64-msvc": "1.28.2", + "lightningcss-win32-x64-msvc": "1.28.2" } }, "lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz", + "integrity": "sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g==", "dev": true, "optional": true }, "lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz", + "integrity": "sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g==", + "dev": true, + "optional": true + }, + "lightningcss-freebsd-x64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz", + "integrity": "sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA==", "dev": true, "optional": true }, "lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz", + "integrity": "sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg==", "dev": true, "optional": true }, "lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz", + "integrity": "sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw==", "dev": true, "optional": true }, "lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz", + "integrity": "sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA==", "dev": true, "optional": true }, "lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz", + "integrity": "sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg==", "dev": true, "optional": true }, "lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz", + "integrity": "sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww==", "dev": true, "optional": true }, - "lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", + "lightningcss-win32-arm64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz", + "integrity": "sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g==", "dev": true, "optional": true }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "lightningcss-win32-x64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz", + "integrity": "sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A==", "dev": true, - "requires": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2", - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "dependencies": { - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - } - } + "optional": true }, "lodash": { "version": "4.17.21", @@ -5195,162 +3884,137 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "msgpackr": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", - "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "requires": { - "msgpackr-extract": "^3.0.2" + "tslib": "^2.0.3" } }, - "msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", "dev": true, - "optional": true, "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3", - "node-gyp-build-optional-packages": "5.2.2" - }, - "dependencies": { - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "optional": true - }, - "node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^2.0.1" - } - } + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "nextpnr-viewer": { - "version": "file:lib", + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "requires": { - "rxjs": "^7.8.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" } }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true + "nextpnr-renderer": { + "version": "file:lib/pkg" }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true + "nextpnr-viewer": { + "version": "file:lib", + "requires": { + "nextpnr-renderer": "file:pkg" + } }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "boolbase": "^1.0.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "ordered-binary": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", - "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, - "parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "requires": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "callsites": "^3.0.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5358,84 +4022,33 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "requires": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "dependencies": { - "posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.1" - } - } - } - }, - "posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.1" - } - }, - "posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", - "dev": true, - "requires": { - "is-json": "^2.0.1" - } - }, "prettier": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, "require-directory": { @@ -5443,30 +4056,103 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "rollup": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", + "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.28.0", + "@rollup/rollup-android-arm64": "4.28.0", + "@rollup/rollup-darwin-arm64": "4.28.0", + "@rollup/rollup-darwin-x64": "4.28.0", + "@rollup/rollup-freebsd-arm64": "4.28.0", + "@rollup/rollup-freebsd-x64": "4.28.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", + "@rollup/rollup-linux-arm-musleabihf": "4.28.0", + "@rollup/rollup-linux-arm64-gnu": "4.28.0", + "@rollup/rollup-linux-arm64-musl": "4.28.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", + "@rollup/rollup-linux-riscv64-gnu": "4.28.0", + "@rollup/rollup-linux-s390x-gnu": "4.28.0", + "@rollup/rollup-linux-x64-gnu": "4.28.0", + "@rollup/rollup-linux-x64-musl": "4.28.0", + "@rollup/rollup-win32-arm64-msvc": "4.28.0", + "@rollup/rollup-win32-ia32-msvc": "4.28.0", + "@rollup/rollup-win32-x64-msvc": "4.28.0", + "@types/estree": "1.0.6", + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-serve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-1.1.1.tgz", + "integrity": "sha512-H0VarZRtFR0lfiiC9/P8jzCDvtFf1liOX4oSdIeeYqUCKrmFA7vNiQ0rg2D+TuoP7leaa/LBR8XBts5viF6lnw==", + "dev": true, + "requires": { + "mime": "^2", + "opener": "1" + }, + "dependencies": { + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { - "tslib": "^2.1.0" + "shebang-regex": "^3.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true }, "source-map": { @@ -5485,12 +4171,6 @@ "source-map": "^0.6.0" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, "string-args-parser": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string-args-parser/-/string-args-parser-1.0.4.tgz", @@ -5506,6 +4186,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5514,44 +4205,29 @@ "ansi-regex": "^5.0.1" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "ansi-regex": "^5.0.1" } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -5568,30 +4244,28 @@ "version": "file:viewer-test", "requires": { "edacation": "^0.3.0", - "nextpnr-viewer": "^0.6.1" + "nextpnr-viewer": "../lib" } }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "typescript": { @@ -5605,34 +4279,15 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "isexe": "^2.0.0" } }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5643,23 +4298,22 @@ "strip-ansi": "^6.0.0" } }, - "xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, "yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index f83a729..60fcfce 100644 --- a/package.json +++ b/package.json @@ -7,20 +7,16 @@ "viewer-test" ], "devDependencies": { - "@parcel/config-default": "^2.7.0", - "@parcel/packager-ts": "^2.7.0", - "@parcel/transformer-inline": "^2.7.0", - "@parcel/transformer-typescript-types": "^2.7.0", - "@parcel/validator-typescript": "^2.7.0", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^12.1.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/node": "^18.11.7", - "parcel": "^2.7.0", - "path-browserify": "^1.0.1", + "@web/rollup-plugin-html": "^2.3.0", + "@web/rollup-plugin-import-meta-assets": "^2.2.1", "prettier": "^3.3.3", - "process": "^0.11.10", + "rollup": "^4.28.0", + "rollup-plugin-serve": "^1.1.1", "typescript": "^4.8.3" - }, - "dependencies": { - "rxjs": "^7.8.0" } } diff --git a/shell.nix b/shell.nix index 549f60b..78611b8 100644 --- a/shell.nix +++ b/shell.nix @@ -3,5 +3,8 @@ pkgs.mkShell { packages = with pkgs; [ nodejs_20 + rustup + wasm-pack + coz ]; } diff --git a/viewer-test/index.html b/viewer-test/index.html index 03453b1..2d2a42d 100644 --- a/viewer-test/index.html +++ b/viewer-test/index.html @@ -1,11 +1,11 @@ - + - + -
+
diff --git a/viewer-test/package.json b/viewer-test/package.json index 508d1ec..7582938 100644 --- a/viewer-test/package.json +++ b/viewer-test/package.json @@ -18,9 +18,12 @@ "type": "git", "url": "https://github.com/EDAcation/nextpnr-viewer.git" }, + "scripts": { + "serve": "rollup -c" + }, "version": "1.0.0", "dependencies": { - "nextpnr-viewer": "^0.6.1", - "edacation": "^0.3.0" + "edacation": "^0.3.0", + "nextpnr-viewer": "../lib" } -} \ No newline at end of file +} diff --git a/viewer-test/rollup.config.mjs b/viewer-test/rollup.config.mjs new file mode 100644 index 0000000..b97037b --- /dev/null +++ b/viewer-test/rollup.config.mjs @@ -0,0 +1,26 @@ +import nodeResolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import { importMetaAssets } from '@web/rollup-plugin-import-meta-assets'; +import commonjs from '@rollup/plugin-commonjs'; +import serve from 'rollup-plugin-serve'; +import { rollupPluginHTML as html } from '@web/rollup-plugin-html'; + +export default { + input: 'index.html', + output: { + dir: 'dist', + format: 'es' + }, + plugins: [ + nodeResolve(), + typescript({ + target: 'es2021', + }), + importMetaAssets(), + commonjs(), + html(), + serve({ + contentBase: ['dist'], + }), + ], +}; diff --git a/viewer-test/src/index.ts b/viewer-test/src/index.ts index db7f2a6..f40fbf7 100644 --- a/viewer-test/src/index.ts +++ b/viewer-test/src/index.ts @@ -1,9 +1,9 @@ -import {getElementGroups} from 'edacation'; -import viewer from 'nextpnr-viewer'; +import {getElementGroups} from 'edacation/dist/project/groups'; +import {NextPNRViewer} from 'nextpnr-viewer'; window.onload = () => { - const div: HTMLDivElement | null = document.querySelector('#viewer-container'); - if (div === null) { + const container: HTMLDivElement | null = document.querySelector('#viewer'); + if (container === null) { console.error('Cannot find canvas'); return; } @@ -22,21 +22,22 @@ window.onload = () => { } } - const nextpnrViewer = viewer(div, { + const nextpnrViewer = new NextPNRViewer(container, { width: 1920, height: 1080, chip: { family: 'ecp5', - device: '85k' + device: '25k' }, cellColors: cellColors }); + nextpnrViewer.render(); file_upload.addEventListener('change', (e) => { if (e.target !== file_upload || file_upload.files === null) { return; } - file_upload.files[0].text().then((t) => nextpnrViewer.showJson(t)); + file_upload.files[0].text().then((t) => nextpnrViewer.showJson(JSON.parse(t))); }); };