diff --git a/.gitignore b/.gitignore index f9c250d..393ca3d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ lerna-debug.log* node_modules .DS_Store +.vscode dist **/wwwroot dist-ssr diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8a69752..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "server/src/BsdlParser"] - path = server/src/BsdlParser - url = git@github.com:SikongJueluo/python-bsdl-parser.git diff --git a/.justfile b/.justfile index 6bf715f..916d5f5 100644 --- a/.justfile +++ b/.justfile @@ -1,3 +1,4 @@ +set windows-shell := ["powershell.exe", "-NoLogo", "-Command"] isSelfContained := "false" @_show-dir: @@ -12,17 +13,16 @@ clean: rm -rf "server.test/bin" rm -rf "server.test/obj" rm -rf "dist" + rm -rf "wwwroot" update: npm install - cd server && dotnet restore + dotnet restore ./server/server.csproj git submodule update --init --remote --recursive # 生成Restful API到网页客户端 gen-api: - cd server && dotnet run & - npx nswag openapi2tsclient /input:http://localhost:5000/swagger/v1/swagger.json /output:src/APIClient.ts - pkill server + npm run gen-api # 构建服务器,包含win与linux平台 [working-directory: "server"] @@ -32,8 +32,10 @@ build-server self-contained=isSelfContained: _show-dir rsync -avz --delete ../wwwroot/ ./bin/Release/net9.0/linux-x64/publish/wwwroot/ rsync -avz --delete ../wwwroot/ ./bin/Release/net9.0/win-x64/publish/wwwroot/ +run: run-server + run-server: (build-server "true") - exec ./server/bin/Release/net9.0/linux-x64/publish/server + ./server/bin/Release/net9.0/linux-x64/publish/server run-web: npm run build @@ -43,7 +45,7 @@ dev: dev-server # 测试服务器 dev-server: _show-dir - cd server && dotnet run --watch + dotnet run --watch --project ./server/server.csproj # 运行网页客户端 dev-web: diff --git a/package-lock.json b/package-lock.json index 1876155..7f3c937 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@svgdotjs/svg.js": "^3.2.4", "@types/lodash": "^4.17.16", "all": "^0.0.0", + "async-mutex": "^0.5.0", "lodash": "^4.17.21", "log-symbols": "^7.0.0", "marked": "^12.0.0", @@ -2014,6 +2015,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -3720,6 +3730,12 @@ "integrity": "sha512-HjX/7HxQe2bXkbp8pHTjy4Ir9eHIDnDDsLDphhGqy6I9iZ/vD4QXWEIlrVRZsEX+kS2jIiiF/mnl0nKnPTiYFw==", "license": "MIT" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/typed-function": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", diff --git a/package.json b/package.json index 8aab200..b39d6a8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "preview": "vite preview", "build-only": "vite build", "type-check": "vue-tsc --build", - "pregen-api": "cd server && dotnet run &", + "pregen-api": "cd server && dotnet run --property:Configuration=Release &", "gen-api": "npx nswag openapi2tsclient /input:http://localhost:5000/swagger/v1/swagger.json /output:src/APIClient.ts", "postgen-api": "pkill server" }, @@ -17,6 +17,7 @@ "@svgdotjs/svg.js": "^3.2.4", "@types/lodash": "^4.17.16", "all": "^0.0.0", + "async-mutex": "^0.5.0", "lodash": "^4.17.21", "log-symbols": "^7.0.0", "marked": "^12.0.0", diff --git a/src/components/equipments/templates/PG2L100H_Pango100pro.json b/public/EquipmentTemplates/PG2L100H_Pango100pro.json similarity index 100% rename from src/components/equipments/templates/PG2L100H_Pango100pro.json rename to public/EquipmentTemplates/PG2L100H_Pango100pro.json diff --git a/server/.gitignore b/server/.gitignore index 096eec5..05e698d 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,4 +1,5 @@ obj bin bitstream +bsdl diff --git a/server/Program.cs b/server/Program.cs index fa122ef..a7c74ec 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -94,13 +94,31 @@ try logger.Info($"Use Static Files : {Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")}"); app.UseDefaultFiles(); app.UseStaticFiles(); // Serves files from wwwroot by default + // Assets Files app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "assets")), RequestPath = "/assets" }); + // Public Files + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "EquipmentTemplates")), + RequestPath = "/public/EquipmentTemplates" + }); + // Log Files + if (!Directory.Exists(Path.Combine(Directory.GetCurrentDirectory(), "log"))) + { + Directory.CreateDirectory(Path.Combine(Directory.GetCurrentDirectory(), "log")); + } + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "log")), + RequestPath = "/log" + }); app.MapFallbackToFile("index.html"); } + // Add logs app.UseHttpsRedirection(); app.UseRouting(); app.UseCors(); diff --git a/server/boundary_registers.json b/server/boundary_registers.json new file mode 100644 index 0000000..ab48ef3 --- /dev/null +++ b/server/boundary_registers.json @@ -0,0 +1,5124 @@ +{ + "register_length": 645, + "registers": [ + { + "cell_number": "0", + "cell_name": "BC_2", + "port_id": "AB15", + "function": "input", + "safe_bit": "X" + }, + { + "cell_number": "1", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "2", + "cell_name": "BC_7", + "port_id": "U24", + "function": "bidir", + "safe_bit": "X", + "ccell": "1", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "3", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "4", + "cell_name": "BC_7", + "port_id": "U25", + "function": "bidir", + "safe_bit": "X", + "ccell": "3", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "5", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "6", + "cell_name": "BC_7", + "port_id": "U26", + "function": "bidir", + "safe_bit": "X", + "ccell": "5", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "7", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "8", + "cell_name": "BC_7", + "port_id": "V26", + "function": "bidir", + "safe_bit": "X", + "ccell": "7", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "9", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "10", + "cell_name": "BC_7", + "port_id": "W26", + "function": "bidir", + "safe_bit": "X", + "ccell": "9", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "11", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "12", + "cell_name": "BC_7", + "port_id": "AB26", + "function": "bidir", + "safe_bit": "X", + "ccell": "11", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "13", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "14", + "cell_name": "BC_7", + "port_id": "AC26", + "function": "bidir", + "safe_bit": "X", + "ccell": "13", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "15", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "16", + "cell_name": "BC_7", + "port_id": "W25", + "function": "bidir", + "safe_bit": "X", + "ccell": "15", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "17", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "18", + "cell_name": "BC_7", + "port_id": "Y26", + "function": "bidir", + "safe_bit": "X", + "ccell": "17", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "19", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "20", + "cell_name": "BC_7", + "port_id": "Y25", + "function": "bidir", + "safe_bit": "X", + "ccell": "19", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "21", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "22", + "cell_name": "BC_7", + "port_id": "AA25", + "function": "bidir", + "safe_bit": "X", + "ccell": "21", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "23", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "24", + "cell_name": "BC_7", + "port_id": "V24", + "function": "bidir", + "safe_bit": "X", + "ccell": "23", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "25", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "26", + "cell_name": "BC_7", + "port_id": "W24", + "function": "bidir", + "safe_bit": "X", + "ccell": "25", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "27", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "28", + "cell_name": "BC_7", + "port_id": "AA24", + "function": "bidir", + "safe_bit": "X", + "ccell": "27", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "29", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "30", + "cell_name": "BC_7", + "port_id": "AB25", + "function": "bidir", + "safe_bit": "X", + "ccell": "29", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "31", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "32", + "cell_name": "BC_7", + "port_id": "AA22", + "function": "bidir", + "safe_bit": "X", + "ccell": "31", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "33", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "34", + "cell_name": "BC_7", + "port_id": "AA23", + "function": "bidir", + "safe_bit": "X", + "ccell": "33", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "35", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "36", + "cell_name": "BC_7", + "port_id": "AB24", + "function": "bidir", + "safe_bit": "X", + "ccell": "35", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "37", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "38", + "cell_name": "BC_7", + "port_id": "AC24", + "function": "bidir", + "safe_bit": "X", + "ccell": "37", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "39", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "40", + "cell_name": "BC_7", + "port_id": "V23", + "function": "bidir", + "safe_bit": "X", + "ccell": "39", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "41", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "42", + "cell_name": "BC_7", + "port_id": "W23", + "function": "bidir", + "safe_bit": "X", + "ccell": "41", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "43", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "44", + "cell_name": "BC_7", + "port_id": "Y22", + "function": "bidir", + "safe_bit": "X", + "ccell": "43", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "45", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "46", + "cell_name": "BC_7", + "port_id": "Y23", + "function": "bidir", + "safe_bit": "X", + "ccell": "45", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "47", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "48", + "cell_name": "BC_7", + "port_id": "U22", + "function": "bidir", + "safe_bit": "X", + "ccell": "47", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "49", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "50", + "cell_name": "BC_7", + "port_id": "V22", + "function": "bidir", + "safe_bit": "X", + "ccell": "49", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "51", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "52", + "cell_name": "BC_7", + "port_id": "U21", + "function": "bidir", + "safe_bit": "X", + "ccell": "51", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "53", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "54", + "cell_name": "BC_7", + "port_id": "V21", + "function": "bidir", + "safe_bit": "X", + "ccell": "53", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "55", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "56", + "cell_name": "BC_7", + "port_id": "W21", + "function": "bidir", + "safe_bit": "X", + "ccell": "55", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "57", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "58", + "cell_name": "BC_7", + "port_id": "Y21", + "function": "bidir", + "safe_bit": "X", + "ccell": "57", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "59", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "60", + "cell_name": "BC_7", + "port_id": "T20", + "function": "bidir", + "safe_bit": "X", + "ccell": "59", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "61", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "62", + "cell_name": "BC_7", + "port_id": "U20", + "function": "bidir", + "safe_bit": "X", + "ccell": "61", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "63", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "64", + "cell_name": "BC_7", + "port_id": "W20", + "function": "bidir", + "safe_bit": "X", + "ccell": "63", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "65", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "66", + "cell_name": "BC_7", + "port_id": "Y20", + "function": "bidir", + "safe_bit": "X", + "ccell": "65", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "67", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "68", + "cell_name": "BC_7", + "port_id": "T19", + "function": "bidir", + "safe_bit": "X", + "ccell": "67", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "69", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "70", + "cell_name": "BC_7", + "port_id": "U19", + "function": "bidir", + "safe_bit": "X", + "ccell": "69", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "71", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "72", + "cell_name": "BC_7", + "port_id": "V19", + "function": "bidir", + "safe_bit": "X", + "ccell": "71", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "73", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "74", + "cell_name": "BC_7", + "port_id": "W19", + "function": "bidir", + "safe_bit": "X", + "ccell": "73", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "75", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "76", + "cell_name": "BC_7", + "port_id": "V18", + "function": "bidir", + "safe_bit": "X", + "ccell": "75", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "77", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "78", + "cell_name": "BC_7", + "port_id": "W18", + "function": "bidir", + "safe_bit": "X", + "ccell": "77", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "79", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "80", + "cell_name": "BC_7", + "port_id": "T14", + "function": "bidir", + "safe_bit": "X", + "ccell": "79", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "81", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "82", + "cell_name": "BC_7", + "port_id": "T15", + "function": "bidir", + "safe_bit": "X", + "ccell": "81", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "83", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "84", + "cell_name": "BC_7", + "port_id": "T17", + "function": "bidir", + "safe_bit": "X", + "ccell": "83", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "85", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "86", + "cell_name": "BC_7", + "port_id": "T18", + "function": "bidir", + "safe_bit": "X", + "ccell": "85", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "87", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "88", + "cell_name": "BC_7", + "port_id": "U15", + "function": "bidir", + "safe_bit": "X", + "ccell": "87", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "89", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "90", + "cell_name": "BC_7", + "port_id": "U16", + "function": "bidir", + "safe_bit": "X", + "ccell": "89", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "91", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "92", + "cell_name": "BC_7", + "port_id": "U14", + "function": "bidir", + "safe_bit": "X", + "ccell": "91", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "93", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "94", + "cell_name": "BC_7", + "port_id": "V14", + "function": "bidir", + "safe_bit": "X", + "ccell": "93", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "95", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "96", + "cell_name": "BC_7", + "port_id": "V16", + "function": "bidir", + "safe_bit": "X", + "ccell": "95", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "97", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "98", + "cell_name": "BC_7", + "port_id": "V17", + "function": "bidir", + "safe_bit": "X", + "ccell": "97", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "99", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "100", + "cell_name": "BC_7", + "port_id": "U17", + "function": "bidir", + "safe_bit": "X", + "ccell": "99", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "101", + "cell_name": "BC_4", + "port_id": "AB13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "102", + "cell_name": "BC_4", + "port_id": "AA13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "103", + "cell_name": "BC_4", + "port_id": "AD12", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "104", + "cell_name": "BC_4", + "port_id": "AC12", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "105", + "cell_name": "AC_1", + "port_id": "AC10", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "106", + "cell_name": "BC_4", + "port_id": "AF13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "107", + "cell_name": "BC_4", + "port_id": "AE13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "108", + "cell_name": "AC_1", + "port_id": "AE9", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "109", + "cell_name": "BC_4", + "port_id": "AB11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "110", + "cell_name": "BC_4", + "port_id": "AA11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "111", + "cell_name": "BC_4", + "port_id": "AD14", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "112", + "cell_name": "BC_4", + "port_id": "AC14", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "113", + "cell_name": "AC_1", + "port_id": "AC8", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "114", + "cell_name": "BC_4", + "port_id": "AF11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "115", + "cell_name": "BC_4", + "port_id": "AE11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "116", + "cell_name": "AC_1", + "port_id": "AE7", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "117", + "cell_name": "AC_SELX", + "function": "internal", + "safe_bit": "0" + }, + { + "cell_number": "118", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "119", + "cell_name": "BC_7", + "port_id": "U4", + "function": "bidir", + "safe_bit": "X", + "ccell": "118", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "120", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "121", + "cell_name": "BC_7", + "port_id": "T7", + "function": "bidir", + "safe_bit": "X", + "ccell": "120", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "122", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "123", + "cell_name": "BC_7", + "port_id": "T8", + "function": "bidir", + "safe_bit": "X", + "ccell": "122", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "124", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "125", + "cell_name": "BC_7", + "port_id": "R6", + "function": "bidir", + "safe_bit": "X", + "ccell": "124", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "126", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "127", + "cell_name": "BC_7", + "port_id": "R7", + "function": "bidir", + "safe_bit": "X", + "ccell": "126", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "128", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "129", + "cell_name": "BC_7", + "port_id": "P8", + "function": "bidir", + "safe_bit": "X", + "ccell": "128", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "130", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "131", + "cell_name": "BC_7", + "port_id": "R8", + "function": "bidir", + "safe_bit": "X", + "ccell": "130", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "132", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "133", + "cell_name": "BC_7", + "port_id": "U5", + "function": "bidir", + "safe_bit": "X", + "ccell": "132", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "134", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "135", + "cell_name": "BC_7", + "port_id": "U6", + "function": "bidir", + "safe_bit": "X", + "ccell": "134", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "136", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "137", + "cell_name": "BC_7", + "port_id": "R5", + "function": "bidir", + "safe_bit": "X", + "ccell": "136", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "138", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "139", + "cell_name": "BC_7", + "port_id": "T5", + "function": "bidir", + "safe_bit": "X", + "ccell": "138", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "140", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "141", + "cell_name": "BC_7", + "port_id": "P5", + "function": "bidir", + "safe_bit": "X", + "ccell": "140", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "142", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "143", + "cell_name": "BC_7", + "port_id": "P6", + "function": "bidir", + "safe_bit": "X", + "ccell": "142", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "144", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "145", + "cell_name": "BC_7", + "port_id": "U1", + "function": "bidir", + "safe_bit": "X", + "ccell": "144", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "146", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "147", + "cell_name": "BC_7", + "port_id": "U2", + "function": "bidir", + "safe_bit": "X", + "ccell": "146", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "148", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "149", + "cell_name": "BC_7", + "port_id": "R2", + "function": "bidir", + "safe_bit": "X", + "ccell": "148", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "150", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "151", + "cell_name": "BC_7", + "port_id": "T2", + "function": "bidir", + "safe_bit": "X", + "ccell": "150", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "152", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "153", + "cell_name": "BC_7", + "port_id": "T3", + "function": "bidir", + "safe_bit": "X", + "ccell": "152", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "154", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "155", + "cell_name": "BC_7", + "port_id": "T4", + "function": "bidir", + "safe_bit": "X", + "ccell": "154", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "156", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "157", + "cell_name": "BC_7", + "port_id": "P1", + "function": "bidir", + "safe_bit": "X", + "ccell": "156", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "158", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "159", + "cell_name": "BC_7", + "port_id": "R1", + "function": "bidir", + "safe_bit": "X", + "ccell": "158", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "160", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "161", + "cell_name": "BC_7", + "port_id": "N4", + "function": "bidir", + "safe_bit": "X", + "ccell": "160", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "162", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "163", + "cell_name": "BC_7", + "port_id": "P4", + "function": "bidir", + "safe_bit": "X", + "ccell": "162", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "164", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "165", + "cell_name": "BC_7", + "port_id": "P3", + "function": "bidir", + "safe_bit": "X", + "ccell": "164", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "166", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "167", + "cell_name": "BC_7", + "port_id": "R3", + "function": "bidir", + "safe_bit": "X", + "ccell": "166", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "168", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "169", + "cell_name": "BC_7", + "port_id": "N2", + "function": "bidir", + "safe_bit": "X", + "ccell": "168", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "170", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "171", + "cell_name": "BC_7", + "port_id": "N3", + "function": "bidir", + "safe_bit": "X", + "ccell": "170", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "172", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "173", + "cell_name": "BC_7", + "port_id": "L2", + "function": "bidir", + "safe_bit": "X", + "ccell": "172", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "174", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "175", + "cell_name": "BC_7", + "port_id": "M2", + "function": "bidir", + "safe_bit": "X", + "ccell": "174", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "176", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "177", + "cell_name": "BC_7", + "port_id": "H1", + "function": "bidir", + "safe_bit": "X", + "ccell": "176", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "178", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "179", + "cell_name": "BC_7", + "port_id": "H2", + "function": "bidir", + "safe_bit": "X", + "ccell": "178", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "180", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "181", + "cell_name": "BC_7", + "port_id": "M1", + "function": "bidir", + "safe_bit": "X", + "ccell": "180", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "182", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "183", + "cell_name": "BC_7", + "port_id": "N1", + "function": "bidir", + "safe_bit": "X", + "ccell": "182", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "184", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "185", + "cell_name": "BC_7", + "port_id": "K2", + "function": "bidir", + "safe_bit": "X", + "ccell": "184", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "186", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "187", + "cell_name": "BC_7", + "port_id": "L3", + "function": "bidir", + "safe_bit": "X", + "ccell": "186", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "188", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "189", + "cell_name": "BC_7", + "port_id": "J1", + "function": "bidir", + "safe_bit": "X", + "ccell": "188", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "190", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "191", + "cell_name": "BC_7", + "port_id": "K1", + "function": "bidir", + "safe_bit": "X", + "ccell": "190", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "192", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "193", + "cell_name": "BC_7", + "port_id": "M5", + "function": "bidir", + "safe_bit": "X", + "ccell": "192", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "194", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "195", + "cell_name": "BC_7", + "port_id": "M6", + "function": "bidir", + "safe_bit": "X", + "ccell": "194", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "196", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "197", + "cell_name": "BC_7", + "port_id": "N6", + "function": "bidir", + "safe_bit": "X", + "ccell": "196", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "198", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "199", + "cell_name": "BC_7", + "port_id": "N7", + "function": "bidir", + "safe_bit": "X", + "ccell": "198", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "200", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "201", + "cell_name": "BC_7", + "port_id": "K5", + "function": "bidir", + "safe_bit": "X", + "ccell": "200", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "202", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "203", + "cell_name": "BC_7", + "port_id": "L5", + "function": "bidir", + "safe_bit": "X", + "ccell": "202", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "204", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "205", + "cell_name": "BC_7", + "port_id": "L4", + "function": "bidir", + "safe_bit": "X", + "ccell": "204", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "206", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "207", + "cell_name": "BC_7", + "port_id": "M4", + "function": "bidir", + "safe_bit": "X", + "ccell": "206", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "208", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "209", + "cell_name": "BC_7", + "port_id": "L7", + "function": "bidir", + "safe_bit": "X", + "ccell": "208", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "210", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "211", + "cell_name": "BC_7", + "port_id": "M7", + "function": "bidir", + "safe_bit": "X", + "ccell": "210", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "212", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "213", + "cell_name": "BC_7", + "port_id": "J3", + "function": "bidir", + "safe_bit": "X", + "ccell": "212", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "214", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "215", + "cell_name": "BC_7", + "port_id": "K3", + "function": "bidir", + "safe_bit": "X", + "ccell": "214", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "216", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "217", + "cell_name": "BC_7", + "port_id": "N8", + "function": "bidir", + "safe_bit": "X", + "ccell": "216", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "218", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "219", + "cell_name": "BC_7", + "port_id": "H3", + "function": "bidir", + "safe_bit": "X", + "ccell": "218", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "220", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "221", + "cell_name": "BC_7", + "port_id": "G1", + "function": "bidir", + "safe_bit": "X", + "ccell": "220", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "222", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "223", + "cell_name": "BC_7", + "port_id": "G2", + "function": "bidir", + "safe_bit": "X", + "ccell": "222", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "224", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "225", + "cell_name": "BC_7", + "port_id": "D1", + "function": "bidir", + "safe_bit": "X", + "ccell": "224", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "226", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "227", + "cell_name": "BC_7", + "port_id": "E1", + "function": "bidir", + "safe_bit": "X", + "ccell": "226", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "228", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "229", + "cell_name": "BC_7", + "port_id": "E2", + "function": "bidir", + "safe_bit": "X", + "ccell": "228", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "230", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "231", + "cell_name": "BC_7", + "port_id": "F2", + "function": "bidir", + "safe_bit": "X", + "ccell": "230", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "232", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "233", + "cell_name": "BC_7", + "port_id": "B1", + "function": "bidir", + "safe_bit": "X", + "ccell": "232", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "234", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "235", + "cell_name": "BC_7", + "port_id": "C1", + "function": "bidir", + "safe_bit": "X", + "ccell": "234", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "236", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "237", + "cell_name": "BC_7", + "port_id": "A2", + "function": "bidir", + "safe_bit": "X", + "ccell": "236", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "238", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "239", + "cell_name": "BC_7", + "port_id": "A3", + "function": "bidir", + "safe_bit": "X", + "ccell": "238", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "240", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "241", + "cell_name": "BC_7", + "port_id": "B2", + "function": "bidir", + "safe_bit": "X", + "ccell": "240", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "242", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "243", + "cell_name": "BC_7", + "port_id": "C2", + "function": "bidir", + "safe_bit": "X", + "ccell": "242", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "244", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "245", + "cell_name": "BC_7", + "port_id": "E3", + "function": "bidir", + "safe_bit": "X", + "ccell": "244", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "246", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "247", + "cell_name": "BC_7", + "port_id": "F3", + "function": "bidir", + "safe_bit": "X", + "ccell": "246", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "248", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "249", + "cell_name": "BC_7", + "port_id": "C3", + "function": "bidir", + "safe_bit": "X", + "ccell": "248", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "250", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "251", + "cell_name": "BC_7", + "port_id": "D3", + "function": "bidir", + "safe_bit": "X", + "ccell": "250", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "252", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "253", + "cell_name": "BC_7", + "port_id": "A4", + "function": "bidir", + "safe_bit": "X", + "ccell": "252", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "254", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "255", + "cell_name": "BC_7", + "port_id": "B4", + "function": "bidir", + "safe_bit": "X", + "ccell": "254", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "256", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "257", + "cell_name": "BC_7", + "port_id": "A5", + "function": "bidir", + "safe_bit": "X", + "ccell": "256", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "258", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "259", + "cell_name": "BC_7", + "port_id": "B5", + "function": "bidir", + "safe_bit": "X", + "ccell": "258", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "260", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "261", + "cell_name": "BC_7", + "port_id": "C4", + "function": "bidir", + "safe_bit": "X", + "ccell": "260", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "262", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "263", + "cell_name": "BC_7", + "port_id": "D4", + "function": "bidir", + "safe_bit": "X", + "ccell": "262", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "264", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "265", + "cell_name": "BC_7", + "port_id": "D5", + "function": "bidir", + "safe_bit": "X", + "ccell": "264", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "266", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "267", + "cell_name": "BC_7", + "port_id": "E5", + "function": "bidir", + "safe_bit": "X", + "ccell": "266", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "268", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "269", + "cell_name": "BC_7", + "port_id": "F5", + "function": "bidir", + "safe_bit": "X", + "ccell": "268", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "270", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "271", + "cell_name": "BC_7", + "port_id": "G5", + "function": "bidir", + "safe_bit": "X", + "ccell": "270", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "272", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "273", + "cell_name": "BC_7", + "port_id": "F4", + "function": "bidir", + "safe_bit": "X", + "ccell": "272", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "274", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "275", + "cell_name": "BC_7", + "port_id": "G4", + "function": "bidir", + "safe_bit": "X", + "ccell": "274", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "276", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "277", + "cell_name": "BC_7", + "port_id": "K6", + "function": "bidir", + "safe_bit": "X", + "ccell": "276", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "278", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "279", + "cell_name": "BC_7", + "port_id": "K7", + "function": "bidir", + "safe_bit": "X", + "ccell": "278", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "280", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "281", + "cell_name": "BC_7", + "port_id": "H4", + "function": "bidir", + "safe_bit": "X", + "ccell": "280", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "282", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "283", + "cell_name": "BC_7", + "port_id": "J4", + "function": "bidir", + "safe_bit": "X", + "ccell": "282", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "284", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "285", + "cell_name": "BC_7", + "port_id": "K8", + "function": "bidir", + "safe_bit": "X", + "ccell": "284", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "286", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "287", + "cell_name": "BC_7", + "port_id": "L8", + "function": "bidir", + "safe_bit": "X", + "ccell": "286", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "288", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "289", + "cell_name": "BC_7", + "port_id": "J5", + "function": "bidir", + "safe_bit": "X", + "ccell": "288", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "290", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "291", + "cell_name": "BC_7", + "port_id": "J6", + "function": "bidir", + "safe_bit": "X", + "ccell": "290", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "292", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "293", + "cell_name": "BC_7", + "port_id": "G9", + "function": "bidir", + "safe_bit": "X", + "ccell": "292", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "294", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "295", + "cell_name": "BC_7", + "port_id": "H9", + "function": "bidir", + "safe_bit": "X", + "ccell": "294", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "296", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "297", + "cell_name": "BC_7", + "port_id": "G6", + "function": "bidir", + "safe_bit": "X", + "ccell": "296", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "298", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "299", + "cell_name": "BC_7", + "port_id": "H6", + "function": "bidir", + "safe_bit": "X", + "ccell": "298", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "300", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "301", + "cell_name": "BC_7", + "port_id": "F7", + "function": "bidir", + "safe_bit": "X", + "ccell": "300", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "302", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "303", + "cell_name": "BC_7", + "port_id": "F8", + "function": "bidir", + "safe_bit": "X", + "ccell": "302", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "304", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "305", + "cell_name": "BC_7", + "port_id": "G7", + "function": "bidir", + "safe_bit": "X", + "ccell": "304", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "306", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "307", + "cell_name": "BC_7", + "port_id": "H7", + "function": "bidir", + "safe_bit": "X", + "ccell": "306", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "308", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "309", + "cell_name": "BC_7", + "port_id": "G8", + "function": "bidir", + "safe_bit": "X", + "ccell": "308", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "310", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "311", + "cell_name": "BC_7", + "port_id": "H8", + "function": "bidir", + "safe_bit": "X", + "ccell": "310", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "312", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "313", + "cell_name": "BC_7", + "port_id": "D6", + "function": "bidir", + "safe_bit": "X", + "ccell": "312", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "314", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "315", + "cell_name": "BC_7", + "port_id": "E6", + "function": "bidir", + "safe_bit": "X", + "ccell": "314", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "316", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "317", + "cell_name": "BC_7", + "port_id": "J8", + "function": "bidir", + "safe_bit": "X", + "ccell": "316", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "318", + "cell_name": "BC_4", + "port_id": "E11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "319", + "cell_name": "BC_4", + "port_id": "F11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "320", + "cell_name": "BC_4", + "port_id": "A11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "321", + "cell_name": "BC_4", + "port_id": "B11", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "322", + "cell_name": "AC_1", + "port_id": "B7", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "323", + "cell_name": "BC_4", + "port_id": "C14", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "324", + "cell_name": "BC_4", + "port_id": "D14", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "325", + "cell_name": "AC_1", + "port_id": "D8", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "326", + "cell_name": "BC_4", + "port_id": "E13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "327", + "cell_name": "BC_4", + "port_id": "F13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "328", + "cell_name": "BC_4", + "port_id": "A13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "329", + "cell_name": "BC_4", + "port_id": "B13", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "330", + "cell_name": "AC_1", + "port_id": "B9", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "331", + "cell_name": "BC_4", + "port_id": "C12", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "332", + "cell_name": "BC_4", + "port_id": "D12", + "function": "OBSERVE_ONLY", + "safe_bit": "X" + }, + { + "cell_number": "333", + "cell_name": "AC_1", + "port_id": "D10", + "function": "output2", + "safe_bit": "X" + }, + { + "cell_number": "334", + "cell_name": "AC_SELX", + "function": "internal", + "safe_bit": "0" + }, + { + "cell_number": "335", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "336", + "cell_name": "BC_7", + "port_id": "H17", + "function": "bidir", + "safe_bit": "X", + "ccell": "335", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "337", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "338", + "cell_name": "BC_7", + "port_id": "H14", + "function": "bidir", + "safe_bit": "X", + "ccell": "337", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "339", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "340", + "cell_name": "BC_7", + "port_id": "H15", + "function": "bidir", + "safe_bit": "X", + "ccell": "339", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "341", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "342", + "cell_name": "BC_7", + "port_id": "G17", + "function": "bidir", + "safe_bit": "X", + "ccell": "341", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "343", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "344", + "cell_name": "BC_7", + "port_id": "F17", + "function": "bidir", + "safe_bit": "X", + "ccell": "343", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "345", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "346", + "cell_name": "BC_7", + "port_id": "F18", + "function": "bidir", + "safe_bit": "X", + "ccell": "345", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "347", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "348", + "cell_name": "BC_7", + "port_id": "F19", + "function": "bidir", + "safe_bit": "X", + "ccell": "347", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "349", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "350", + "cell_name": "BC_7", + "port_id": "G15", + "function": "bidir", + "safe_bit": "X", + "ccell": "349", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "351", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "352", + "cell_name": "BC_7", + "port_id": "F15", + "function": "bidir", + "safe_bit": "X", + "ccell": "351", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "353", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "354", + "cell_name": "BC_7", + "port_id": "G19", + "function": "bidir", + "safe_bit": "X", + "ccell": "353", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "355", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "356", + "cell_name": "BC_7", + "port_id": "F20", + "function": "bidir", + "safe_bit": "X", + "ccell": "355", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "357", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "358", + "cell_name": "BC_7", + "port_id": "H16", + "function": "bidir", + "safe_bit": "X", + "ccell": "357", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "359", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "360", + "cell_name": "BC_7", + "port_id": "G16", + "function": "bidir", + "safe_bit": "X", + "ccell": "359", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "361", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "362", + "cell_name": "BC_7", + "port_id": "C17", + "function": "bidir", + "safe_bit": "X", + "ccell": "361", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "363", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "364", + "cell_name": "BC_7", + "port_id": "B17", + "function": "bidir", + "safe_bit": "X", + "ccell": "363", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "365", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "366", + "cell_name": "BC_7", + "port_id": "E16", + "function": "bidir", + "safe_bit": "X", + "ccell": "365", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "367", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "368", + "cell_name": "BC_7", + "port_id": "D16", + "function": "bidir", + "safe_bit": "X", + "ccell": "367", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "369", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "370", + "cell_name": "BC_7", + "port_id": "A17", + "function": "bidir", + "safe_bit": "X", + "ccell": "369", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "371", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "372", + "cell_name": "BC_7", + "port_id": "A18", + "function": "bidir", + "safe_bit": "X", + "ccell": "371", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "373", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "374", + "cell_name": "BC_7", + "port_id": "B19", + "function": "bidir", + "safe_bit": "X", + "ccell": "373", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "375", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "376", + "cell_name": "BC_7", + "port_id": "A19", + "function": "bidir", + "safe_bit": "X", + "ccell": "375", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "377", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "378", + "cell_name": "BC_7", + "port_id": "E17", + "function": "bidir", + "safe_bit": "X", + "ccell": "377", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "379", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "380", + "cell_name": "BC_7", + "port_id": "E18", + "function": "bidir", + "safe_bit": "X", + "ccell": "379", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "381", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "382", + "cell_name": "BC_7", + "port_id": "D18", + "function": "bidir", + "safe_bit": "X", + "ccell": "381", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "383", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "384", + "cell_name": "BC_7", + "port_id": "C18", + "function": "bidir", + "safe_bit": "X", + "ccell": "383", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "385", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "386", + "cell_name": "BC_7", + "port_id": "D19", + "function": "bidir", + "safe_bit": "X", + "ccell": "385", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "387", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "388", + "cell_name": "BC_7", + "port_id": "C19", + "function": "bidir", + "safe_bit": "X", + "ccell": "387", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "389", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "390", + "cell_name": "BC_7", + "port_id": "E20", + "function": "bidir", + "safe_bit": "X", + "ccell": "389", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "391", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "392", + "cell_name": "BC_7", + "port_id": "D20", + "function": "bidir", + "safe_bit": "X", + "ccell": "391", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "393", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "394", + "cell_name": "BC_7", + "port_id": "B20", + "function": "bidir", + "safe_bit": "X", + "ccell": "393", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "395", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "396", + "cell_name": "BC_7", + "port_id": "A20", + "function": "bidir", + "safe_bit": "X", + "ccell": "395", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "397", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "398", + "cell_name": "BC_7", + "port_id": "C21", + "function": "bidir", + "safe_bit": "X", + "ccell": "397", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "399", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "400", + "cell_name": "BC_7", + "port_id": "B21", + "function": "bidir", + "safe_bit": "X", + "ccell": "399", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "401", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "402", + "cell_name": "BC_7", + "port_id": "B22", + "function": "bidir", + "safe_bit": "X", + "ccell": "401", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "403", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "404", + "cell_name": "BC_7", + "port_id": "A22", + "function": "bidir", + "safe_bit": "X", + "ccell": "403", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "405", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "406", + "cell_name": "BC_7", + "port_id": "E21", + "function": "bidir", + "safe_bit": "X", + "ccell": "405", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "407", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "408", + "cell_name": "BC_7", + "port_id": "D21", + "function": "bidir", + "safe_bit": "X", + "ccell": "407", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "409", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "410", + "cell_name": "BC_7", + "port_id": "C22", + "function": "bidir", + "safe_bit": "X", + "ccell": "409", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "411", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "412", + "cell_name": "BC_7", + "port_id": "C23", + "function": "bidir", + "safe_bit": "X", + "ccell": "411", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "413", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "414", + "cell_name": "BC_7", + "port_id": "B25", + "function": "bidir", + "safe_bit": "X", + "ccell": "413", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "415", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "416", + "cell_name": "BC_7", + "port_id": "A25", + "function": "bidir", + "safe_bit": "X", + "ccell": "415", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "417", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "418", + "cell_name": "BC_7", + "port_id": "A23", + "function": "bidir", + "safe_bit": "X", + "ccell": "417", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "419", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "420", + "cell_name": "BC_7", + "port_id": "A24", + "function": "bidir", + "safe_bit": "X", + "ccell": "419", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "421", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "422", + "cell_name": "BC_7", + "port_id": "C26", + "function": "bidir", + "safe_bit": "X", + "ccell": "421", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "423", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "424", + "cell_name": "BC_7", + "port_id": "B26", + "function": "bidir", + "safe_bit": "X", + "ccell": "423", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "425", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "426", + "cell_name": "BC_7", + "port_id": "C24", + "function": "bidir", + "safe_bit": "X", + "ccell": "425", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "427", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "428", + "cell_name": "BC_7", + "port_id": "B24", + "function": "bidir", + "safe_bit": "X", + "ccell": "427", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "429", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "430", + "cell_name": "BC_7", + "port_id": "D23", + "function": "bidir", + "safe_bit": "X", + "ccell": "429", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "431", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "432", + "cell_name": "BC_7", + "port_id": "D24", + "function": "bidir", + "safe_bit": "X", + "ccell": "431", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "433", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "434", + "cell_name": "BC_7", + "port_id": "E22", + "function": "bidir", + "safe_bit": "X", + "ccell": "433", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "435", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "436", + "cell_name": "BC_7", + "port_id": "K18", + "function": "bidir", + "safe_bit": "X", + "ccell": "435", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "437", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "438", + "cell_name": "BC_7", + "port_id": "K15", + "function": "bidir", + "safe_bit": "X", + "ccell": "437", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "439", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "440", + "cell_name": "BC_7", + "port_id": "J16", + "function": "bidir", + "safe_bit": "X", + "ccell": "439", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "441", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "442", + "cell_name": "BC_7", + "port_id": "J14", + "function": "bidir", + "safe_bit": "X", + "ccell": "441", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "443", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "444", + "cell_name": "BC_7", + "port_id": "J15", + "function": "bidir", + "safe_bit": "X", + "ccell": "443", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "445", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "446", + "cell_name": "BC_7", + "port_id": "K16", + "function": "bidir", + "safe_bit": "X", + "ccell": "445", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "447", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "448", + "cell_name": "BC_7", + "port_id": "K17", + "function": "bidir", + "safe_bit": "X", + "ccell": "447", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "449", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "450", + "cell_name": "BC_7", + "port_id": "M14", + "function": "bidir", + "safe_bit": "X", + "ccell": "449", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "451", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "452", + "cell_name": "BC_7", + "port_id": "L14", + "function": "bidir", + "safe_bit": "X", + "ccell": "451", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "453", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "454", + "cell_name": "BC_7", + "port_id": "M15", + "function": "bidir", + "safe_bit": "X", + "ccell": "453", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "455", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "456", + "cell_name": "BC_7", + "port_id": "L15", + "function": "bidir", + "safe_bit": "X", + "ccell": "455", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "457", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "458", + "cell_name": "BC_7", + "port_id": "M16", + "function": "bidir", + "safe_bit": "X", + "ccell": "457", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "459", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "460", + "cell_name": "BC_7", + "port_id": "M17", + "function": "bidir", + "safe_bit": "X", + "ccell": "459", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "461", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "462", + "cell_name": "BC_7", + "port_id": "J19", + "function": "bidir", + "safe_bit": "X", + "ccell": "461", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "463", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "464", + "cell_name": "BC_7", + "port_id": "H19", + "function": "bidir", + "safe_bit": "X", + "ccell": "463", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "465", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "466", + "cell_name": "BC_7", + "port_id": "L17", + "function": "bidir", + "safe_bit": "X", + "ccell": "465", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "467", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "468", + "cell_name": "BC_7", + "port_id": "L18", + "function": "bidir", + "safe_bit": "X", + "ccell": "467", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "469", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "470", + "cell_name": "BC_7", + "port_id": "K20", + "function": "bidir", + "safe_bit": "X", + "ccell": "469", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "471", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "472", + "cell_name": "BC_7", + "port_id": "J20", + "function": "bidir", + "safe_bit": "X", + "ccell": "471", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "473", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "474", + "cell_name": "BC_7", + "port_id": "J18", + "function": "bidir", + "safe_bit": "X", + "ccell": "473", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "475", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "476", + "cell_name": "BC_7", + "port_id": "H18", + "function": "bidir", + "safe_bit": "X", + "ccell": "475", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "477", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "478", + "cell_name": "BC_7", + "port_id": "G20", + "function": "bidir", + "safe_bit": "X", + "ccell": "477", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "479", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "480", + "cell_name": "BC_7", + "port_id": "G21", + "function": "bidir", + "safe_bit": "X", + "ccell": "479", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "481", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "482", + "cell_name": "BC_7", + "port_id": "K21", + "function": "bidir", + "safe_bit": "X", + "ccell": "481", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "483", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "484", + "cell_name": "BC_7", + "port_id": "J21", + "function": "bidir", + "safe_bit": "X", + "ccell": "483", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "485", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "486", + "cell_name": "BC_7", + "port_id": "H21", + "function": "bidir", + "safe_bit": "X", + "ccell": "485", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "487", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "488", + "cell_name": "BC_7", + "port_id": "H22", + "function": "bidir", + "safe_bit": "X", + "ccell": "487", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "489", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "490", + "cell_name": "BC_7", + "port_id": "J23", + "function": "bidir", + "safe_bit": "X", + "ccell": "489", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "491", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "492", + "cell_name": "BC_7", + "port_id": "H23", + "function": "bidir", + "safe_bit": "X", + "ccell": "491", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "493", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "494", + "cell_name": "BC_7", + "port_id": "G22", + "function": "bidir", + "safe_bit": "X", + "ccell": "493", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "495", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "496", + "cell_name": "BC_7", + "port_id": "F22", + "function": "bidir", + "safe_bit": "X", + "ccell": "495", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "497", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "498", + "cell_name": "BC_7", + "port_id": "J24", + "function": "bidir", + "safe_bit": "X", + "ccell": "497", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "499", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "500", + "cell_name": "BC_7", + "port_id": "H24", + "function": "bidir", + "safe_bit": "X", + "ccell": "499", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "501", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "502", + "cell_name": "BC_7", + "port_id": "F23", + "function": "bidir", + "safe_bit": "X", + "ccell": "501", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "503", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "504", + "cell_name": "BC_7", + "port_id": "E23", + "function": "bidir", + "safe_bit": "X", + "ccell": "503", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "505", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "506", + "cell_name": "BC_7", + "port_id": "K22", + "function": "bidir", + "safe_bit": "X", + "ccell": "505", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "507", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "508", + "cell_name": "BC_7", + "port_id": "K23", + "function": "bidir", + "safe_bit": "X", + "ccell": "507", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "509", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "510", + "cell_name": "BC_7", + "port_id": "G24", + "function": "bidir", + "safe_bit": "X", + "ccell": "509", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "511", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "512", + "cell_name": "BC_7", + "port_id": "F24", + "function": "bidir", + "safe_bit": "X", + "ccell": "511", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "513", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "514", + "cell_name": "BC_7", + "port_id": "E25", + "function": "bidir", + "safe_bit": "X", + "ccell": "513", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "515", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "516", + "cell_name": "BC_7", + "port_id": "D25", + "function": "bidir", + "safe_bit": "X", + "ccell": "515", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "517", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "518", + "cell_name": "BC_7", + "port_id": "E26", + "function": "bidir", + "safe_bit": "X", + "ccell": "517", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "519", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "520", + "cell_name": "BC_7", + "port_id": "D26", + "function": "bidir", + "safe_bit": "X", + "ccell": "519", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "521", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "522", + "cell_name": "BC_7", + "port_id": "H26", + "function": "bidir", + "safe_bit": "X", + "ccell": "521", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "523", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "524", + "cell_name": "BC_7", + "port_id": "G26", + "function": "bidir", + "safe_bit": "X", + "ccell": "523", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "525", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "526", + "cell_name": "BC_7", + "port_id": "G25", + "function": "bidir", + "safe_bit": "X", + "ccell": "525", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "527", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "528", + "cell_name": "BC_7", + "port_id": "F25", + "function": "bidir", + "safe_bit": "X", + "ccell": "527", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "529", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "530", + "cell_name": "BC_7", + "port_id": "J25", + "function": "bidir", + "safe_bit": "X", + "ccell": "529", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "531", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "532", + "cell_name": "BC_7", + "port_id": "J26", + "function": "bidir", + "safe_bit": "X", + "ccell": "531", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "533", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "534", + "cell_name": "BC_7", + "port_id": "L19", + "function": "bidir", + "safe_bit": "X", + "ccell": "533", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "535", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "536", + "cell_name": "BC_7", + "port_id": "M19", + "function": "bidir", + "safe_bit": "X", + "ccell": "535", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "537", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "538", + "cell_name": "BC_7", + "port_id": "R14", + "function": "bidir", + "safe_bit": "X", + "ccell": "537", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "539", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "540", + "cell_name": "BC_7", + "port_id": "R15", + "function": "bidir", + "safe_bit": "X", + "ccell": "539", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "541", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "542", + "cell_name": "BC_7", + "port_id": "P14", + "function": "bidir", + "safe_bit": "X", + "ccell": "541", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "543", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "544", + "cell_name": "BC_7", + "port_id": "N14", + "function": "bidir", + "safe_bit": "X", + "ccell": "543", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "545", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "546", + "cell_name": "BC_7", + "port_id": "P15", + "function": "bidir", + "safe_bit": "X", + "ccell": "545", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "547", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "548", + "cell_name": "BC_7", + "port_id": "P16", + "function": "bidir", + "safe_bit": "X", + "ccell": "547", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "549", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "550", + "cell_name": "BC_7", + "port_id": "N16", + "function": "bidir", + "safe_bit": "X", + "ccell": "549", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "551", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "552", + "cell_name": "BC_7", + "port_id": "N17", + "function": "bidir", + "safe_bit": "X", + "ccell": "551", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "553", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "554", + "cell_name": "BC_7", + "port_id": "R16", + "function": "bidir", + "safe_bit": "X", + "ccell": "553", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "555", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "556", + "cell_name": "BC_7", + "port_id": "R17", + "function": "bidir", + "safe_bit": "X", + "ccell": "555", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "557", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "558", + "cell_name": "BC_7", + "port_id": "P18", + "function": "bidir", + "safe_bit": "X", + "ccell": "557", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "559", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "560", + "cell_name": "BC_7", + "port_id": "N18", + "function": "bidir", + "safe_bit": "X", + "ccell": "559", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "561", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "562", + "cell_name": "BC_7", + "port_id": "K25", + "function": "bidir", + "safe_bit": "X", + "ccell": "561", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "563", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "564", + "cell_name": "BC_7", + "port_id": "K26", + "function": "bidir", + "safe_bit": "X", + "ccell": "563", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "565", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "566", + "cell_name": "BC_7", + "port_id": "M20", + "function": "bidir", + "safe_bit": "X", + "ccell": "565", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "567", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "568", + "cell_name": "BC_7", + "port_id": "L20", + "function": "bidir", + "safe_bit": "X", + "ccell": "567", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "569", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "570", + "cell_name": "BC_7", + "port_id": "L24", + "function": "bidir", + "safe_bit": "X", + "ccell": "569", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "571", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "572", + "cell_name": "BC_7", + "port_id": "L25", + "function": "bidir", + "safe_bit": "X", + "ccell": "571", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "573", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "574", + "cell_name": "BC_7", + "port_id": "M24", + "function": "bidir", + "safe_bit": "X", + "ccell": "573", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "575", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "576", + "cell_name": "BC_7", + "port_id": "M25", + "function": "bidir", + "safe_bit": "X", + "ccell": "575", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "577", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "578", + "cell_name": "BC_7", + "port_id": "L22", + "function": "bidir", + "safe_bit": "X", + "ccell": "577", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "579", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "580", + "cell_name": "BC_7", + "port_id": "L23", + "function": "bidir", + "safe_bit": "X", + "ccell": "579", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "581", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "582", + "cell_name": "BC_7", + "port_id": "M21", + "function": "bidir", + "safe_bit": "X", + "ccell": "581", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "583", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "584", + "cell_name": "BC_7", + "port_id": "M22", + "function": "bidir", + "safe_bit": "X", + "ccell": "583", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "585", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "586", + "cell_name": "BC_7", + "port_id": "N21", + "function": "bidir", + "safe_bit": "X", + "ccell": "585", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "587", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "588", + "cell_name": "BC_7", + "port_id": "N22", + "function": "bidir", + "safe_bit": "X", + "ccell": "587", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "589", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "590", + "cell_name": "BC_7", + "port_id": "P20", + "function": "bidir", + "safe_bit": "X", + "ccell": "589", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "591", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "592", + "cell_name": "BC_7", + "port_id": "P21", + "function": "bidir", + "safe_bit": "X", + "ccell": "591", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "593", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "594", + "cell_name": "BC_7", + "port_id": "N23", + "function": "bidir", + "safe_bit": "X", + "ccell": "593", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "595", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "596", + "cell_name": "BC_7", + "port_id": "N24", + "function": "bidir", + "safe_bit": "X", + "ccell": "595", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "597", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "598", + "cell_name": "BC_7", + "port_id": "P19", + "function": "bidir", + "safe_bit": "X", + "ccell": "597", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "599", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "600", + "cell_name": "BC_7", + "port_id": "N19", + "function": "bidir", + "safe_bit": "X", + "ccell": "599", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "601", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "602", + "cell_name": "BC_7", + "port_id": "P23", + "function": "bidir", + "safe_bit": "X", + "ccell": "601", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "603", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "604", + "cell_name": "BC_7", + "port_id": "P24", + "function": "bidir", + "safe_bit": "X", + "ccell": "603", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "605", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "606", + "cell_name": "BC_7", + "port_id": "R20", + "function": "bidir", + "safe_bit": "X", + "ccell": "605", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "607", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "608", + "cell_name": "BC_7", + "port_id": "R21", + "function": "bidir", + "safe_bit": "X", + "ccell": "607", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "609", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "610", + "cell_name": "BC_7", + "port_id": "R25", + "function": "bidir", + "safe_bit": "X", + "ccell": "609", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "611", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "612", + "cell_name": "BC_7", + "port_id": "P25", + "function": "bidir", + "safe_bit": "X", + "ccell": "611", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "613", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "614", + "cell_name": "BC_7", + "port_id": "N26", + "function": "bidir", + "safe_bit": "X", + "ccell": "613", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "615", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "616", + "cell_name": "BC_7", + "port_id": "M26", + "function": "bidir", + "safe_bit": "X", + "ccell": "615", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "617", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "618", + "cell_name": "BC_7", + "port_id": "T24", + "function": "bidir", + "safe_bit": "X", + "ccell": "617", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "619", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "620", + "cell_name": "BC_7", + "port_id": "T25", + "function": "bidir", + "safe_bit": "X", + "ccell": "619", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "621", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "622", + "cell_name": "BC_7", + "port_id": "R26", + "function": "bidir", + "safe_bit": "X", + "ccell": "621", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "623", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "624", + "cell_name": "BC_7", + "port_id": "P26", + "function": "bidir", + "safe_bit": "X", + "ccell": "623", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "625", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "626", + "cell_name": "BC_7", + "port_id": "T22", + "function": "bidir", + "safe_bit": "X", + "ccell": "625", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "627", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "628", + "cell_name": "BC_7", + "port_id": "R22", + "function": "bidir", + "safe_bit": "X", + "ccell": "627", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "629", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "630", + "cell_name": "BC_7", + "port_id": "T23", + "function": "bidir", + "safe_bit": "X", + "ccell": "629", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "631", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "632", + "cell_name": "BC_7", + "port_id": "R23", + "function": "bidir", + "safe_bit": "X", + "ccell": "631", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "633", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "1" + }, + { + "cell_number": "634", + "cell_name": "BC_7", + "port_id": "R18", + "function": "bidir", + "safe_bit": "X", + "ccell": "633", + "disable_value": "1", + "disable_result": "Z" + }, + { + "cell_number": "635", + "cell_name": "BC_2", + "port_id": "AB7", + "function": "input", + "safe_bit": "X" + }, + { + "cell_number": "636", + "cell_name": "BC_2", + "port_id": "Y9", + "function": "input", + "safe_bit": "X" + }, + { + "cell_number": "637", + "cell_name": "BC_2", + "port_id": "W9", + "function": "input", + "safe_bit": "X" + }, + { + "cell_number": "638", + "cell_name": "BC_2", + "port_id": "AE16", + "function": "input", + "safe_bit": "X" + }, + { + "cell_number": "639", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "0" + }, + { + "cell_number": "640", + "cell_name": "BC_7", + "port_id": "H13", + "function": "bidir", + "safe_bit": "X", + "ccell": "639", + "disable_value": "0", + "disable_result": "Z" + }, + { + "cell_number": "641", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "0" + }, + { + "cell_number": "642", + "cell_name": "BC_7", + "port_id": "V11", + "function": "bidir", + "safe_bit": "X", + "ccell": "641", + "disable_value": "0", + "disable_result": "Z" + }, + { + "cell_number": "643", + "cell_name": "BC_2", + "function": "control", + "safe_bit": "0" + }, + { + "cell_number": "644", + "cell_name": "BC_7", + "port_id": "W10", + "function": "bidir", + "safe_bit": "X", + "ccell": "643", + "disable_value": "0", + "disable_result": "Z" + } + ] +} diff --git a/server/server.csproj b/server/server.csproj index 3b2cfa1..3c6200e 100644 --- a/server/server.csproj +++ b/server/server.csproj @@ -25,7 +25,6 @@ - diff --git a/server/src/BsdlParser b/server/src/BsdlParser deleted file mode 160000 index ac164eb..0000000 --- a/server/src/BsdlParser +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ac164eb16d7d9a9a387ff1f62cef249c65565bef diff --git a/server/src/BsdlParser.cs b/server/src/BsdlParser.cs new file mode 100644 index 0000000..70645f0 --- /dev/null +++ b/server/src/BsdlParser.cs @@ -0,0 +1,192 @@ +using DotNext; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace BsdlParser; + +/// +/// [TODO:description] +/// +public class BoundaryScanRegs +{ + /// + /// [TODO:description] + /// + public class CellEntry + { + /// + /// [TODO:description] + /// + [JsonProperty("cell_number")] + [JsonRequired] + public int CellNumber { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("cell_name")] + [JsonRequired] + public string CellName { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("port_id")] + public string? PortID { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("function")] + [JsonRequired] + public string? Function { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("safe_bit")] + [JsonRequired] + public string? SafeBit { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("ccell")] + public string? CCell { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("disabel_value")] + public string? DisableValue { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("disabel_result")] + public string? DisableResult { get; set; } + } + + /// + /// [TODO:description] + /// + [JsonProperty("register_length")] + [JsonRequired] + public int RegisterLength { get; set; } + + /// + /// [TODO:description] + /// + [JsonProperty("registers")] + [JsonRequired] + public CellEntry[] Registers { get; set; } = new CellEntry[] { }; + +} + +/// +/// [TODO:description] +/// +public class Parser +{ + private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + private const string BOUNDARY_REGS_DESP = "boundary_registers.json"; + + /// + /// [TODO:description] + /// + public JObject BoundaryRegsDesp { get; } + + /// + /// [TODO:description] + /// + /// [TODO:return] + public Parser() + { + var filePath = Path.Combine(Environment.CurrentDirectory, BOUNDARY_REGS_DESP); + if (!Path.Exists(filePath)) + throw new Exception($"Counld not find boundary_registers.json in {filePath}"); + + this.BoundaryRegsDesp = JObject.Parse(File.ReadAllText(filePath)); + } + + /// + /// [TODO:description] + /// + public Optional GetBoundaryRegsNum() + { + var ret = this.BoundaryRegsDesp["register_length"]; + if (ret is null) return new(); + return Convert.ToInt32(ret); + } + + /// + /// [TODO:description] + /// + /// [TODO:return] + public Optional> GetBoundaryPorts() + { + var registers = this.BoundaryRegsDesp["registers"]?.ToList(); + if (registers is null) return new(); + + var cellList = new List(); + foreach (var item in registers) + { + var cell = item.ToObject(); + if (cell is null) return new(); + cellList.Add(cell); + } + + return cellList; + } + + /// + /// [TODO:description] + /// + /// [TODO:return] + public Optional> GetBoundaryLogicalPorts() + { + var registers = this.BoundaryRegsDesp["registers"]?.ToList().Where((item)=>{ + return item["port_id"] is not null; + }); + if (registers is null) return new(); + + var cellList = new List(); + foreach (var item in registers) + { + var cell = item.ToObject(); + if (cell is null) return new(); + cellList.Add(cell); + } + + return cellList; + } + + // public Result GetLogicalPorts() + // { + // using (Py.GIL()) + // { + // using (PyModule scope = Py.CreateScope()) + // { + // string code = $@" + // bsdl_parser = BsdlParser({this.filePath}) + // result = json.dumps(bsdl_parser.GetLogicPortDesp(), indent=2) + // "; + // + // var localVariables = new PyDict(); + // scope.Exec(code, localVariables); + // if (!localVariables.HasKey("result")) + // return new(new Exception($"PythonNet doesn't has result from dict: {localVariables}")); + // + // var result = localVariables.GetItem("result"); + // if (result is null) + // return new(new Exception($"PythonNet get null from dict: {localVariables}")); + // + // var resultString = result.ToString(); + // if (resultString is null) + // return new(new Exception($"Pythonnet convert PyObject to string failed :{result}")); + // return resultString; + // } + // } + // } +} diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs index 66cb836..8c976db 100644 --- a/server/src/Controllers.cs +++ b/server/src/Controllers.cs @@ -8,44 +8,6 @@ using WebProtocol; namespace server.Controllers; -// /// -// /// [TODO:description] -// /// -// public class HomeController : ControllerBase -// { -// private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); -// -// string INDEX_HTML_PATH = Path.Combine(Environment.CurrentDirectory, "index.html"); -// -// /// -// /// [TODO:description] -// /// -// /// [TODO:return] -// [HttpGet("/")] -// public IResult Index() -// { -// return TypedResults.Content("Hello", "text/html"); -// } -// -// // [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] -// // public IResult Error() -// // { -// // return TypedResults.Ok(); -// // } -// -// /// -// /// [TODO:description] -// /// -// /// [TODO:return] -// [HttpGet("/hello")] -// [HttpPost("/hello")] -// public IActionResult Hello() -// { -// string randomString = Guid.NewGuid().ToString(); -// return this.Ok($"Hello World! GUID: {randomString}"); -// } -// } - /// /// UDP API /// @@ -198,6 +160,7 @@ public class JtagController : ControllerBase /// 设备地址 /// 设备端口 [HttpGet("GetDeviceIDCode")] + [EnableCors("Users")] [ProducesResponseType(typeof(uint), StatusCodes.Status200OK)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public async ValueTask GetDeviceIDCode(string address, int port) @@ -375,17 +338,65 @@ public class JtagController : ControllerBase /// /// [TODO:parameter] /// [TODO:parameter] - /// [TODO:parameter] /// [TODO:return] - [HttpPost("BoundaryScan")] + [HttpPost("BoundaryScanAllPorts")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] - public async ValueTask BoundaryScan(string address, int port, int portNum) + public async ValueTask BoundaryScanAllPorts(string address, int port) { var jtagCtrl = new JtagClient.Jtag(address, port); - var ret = await jtagCtrl.BoundaryScan(portNum); + var ret = await jtagCtrl.BoundaryScan(); + if (!ret.IsSuccessful) + { + if (ret.Error is ArgumentException) + return TypedResults.BadRequest(ret.Error); + else return TypedResults.InternalServerError(ret.Error); + } + + return TypedResults.Ok(ret.Value); + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("BoundaryScanLogicalPorts")] + [EnableCors("Users")] + [ProducesResponseType(typeof(Dictionary), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask BoundaryScanLogicalPorts(string address, int port) + { + var jtagCtrl = new JtagClient.Jtag(address, port); + var ret = await jtagCtrl.BoundaryScanLogicalPorts(); + if (!ret.IsSuccessful) + { + if (ret.Error is ArgumentException) + return TypedResults.BadRequest(ret.Error); + else return TypedResults.InternalServerError(ret.Error); + } + + return TypedResults.Ok(ret.Value); + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("SetSpeed")] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask SetSpeed(string address, int port, UInt32 speed) + { + var jtagCtrl = new JtagClient.Jtag(address, port); + var ret = await jtagCtrl.SetSpeed(speed); if (!ret.IsSuccessful) { if (ret.Error is ArgumentException) @@ -402,7 +413,7 @@ public class JtagController : ControllerBase /// [ApiController] [Route("api/[controller]")] -public class RemoteUpdater : ControllerBase +public class RemoteUpdateController : ControllerBase { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); @@ -418,8 +429,9 @@ public class RemoteUpdater : ControllerBase /// 比特流文件3 /// 上传结果 [HttpPost("UploadBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] public async ValueTask UploadBitstreams( string address, IFormFile? goldenBitream, @@ -469,7 +481,7 @@ public class RemoteUpdater : ControllerBase } logger.Info($"Device {address} Upload Bitstream Successfully"); - return TypedResults.Ok("Bitstream Upload Successfully"); + return TypedResults.Ok(true); } private async ValueTask> ProcessBitstream(string filePath) @@ -522,9 +534,10 @@ public class RemoteUpdater : ControllerBase /// 设备端口 /// 比特流位号 [HttpPost("DownloadBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public async ValueTask UpdateBitstream(string address, int port, int bitstreamNum) { // 检查文件 @@ -541,7 +554,7 @@ public class RemoteUpdater : ControllerBase if (!fileBytes.IsSuccessful) return TypedResults.InternalServerError(fileBytes.Error); // 下载比特流 - var remoteUpdater = new RemoteUpdate.RemoteUpdateClient(address, port); + var remoteUpdater = new RemoteUpdateClient.RemoteUpdater(address, port); var ret = await remoteUpdater.UpdateBitstream(bitstreamNum, fileBytes.Value); if (ret.IsSuccessful) @@ -571,9 +584,10 @@ public class RemoteUpdater : ControllerBase /// 比特流编号 /// 总共上传比特流的数量 [HttpPost("DownloadMultiBitstreams")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public async ValueTask DownloadMultiBitstreams(string address, int port, int? bitstreamNum) { // 检查文件 @@ -600,7 +614,7 @@ public class RemoteUpdater : ControllerBase } // 下载比特流 - var remoteUpdater = new RemoteUpdate.RemoteUpdateClient(address, port); + var remoteUpdater = new RemoteUpdateClient.RemoteUpdater(address, port); { var ret = await remoteUpdater.UploadBitstreams(bitstreams[0], bitstreams[1], bitstreams[2], bitstreams[3]); if (!ret.IsSuccessful) return TypedResults.InternalServerError(ret.Error); @@ -630,17 +644,18 @@ public class RemoteUpdater : ControllerBase /// 比特流编号 /// 操作结果 [HttpPost("HotResetBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public async ValueTask HotResetBitstream(string address, int port, int bitstreamNum) { - var remoteUpdater = new RemoteUpdate.RemoteUpdateClient(address, port); + var remoteUpdater = new RemoteUpdateClient.RemoteUpdater(address, port); var ret = await remoteUpdater.HotResetBitstream(bitstreamNum); if (ret.IsSuccessful) { - logger.Info($"Device {address}即可 Update bitstream successfully"); + logger.Info($"Device {address} Update bitstream successfully"); return TypedResults.Ok(ret.Value); } else @@ -649,6 +664,160 @@ public class RemoteUpdater : ControllerBase return TypedResults.InternalServerError(ret.Error); } } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("GetFirmwareVersion")] + [EnableCors("Users")] + [ProducesResponseType(typeof(UInt32), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask GetFirmwareVersion(string address, int port) + { + var remoteUpdater = new RemoteUpdateClient.RemoteUpdater(address, port); + var ret = await remoteUpdater.GetVersion(); + + if (ret.IsSuccessful) + { + logger.Info($"Device {address} get firmware version successfully"); + return TypedResults.Ok(ret.Value); + } + else + { + logger.Error(ret.Error); + return TypedResults.InternalServerError(ret.Error); + } + } + +} + +/// +/// [TODO:description] +/// +[ApiController] +[Route("api/[controller]")] +public class DDSController : ControllerBase +{ + private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("SetWaveNum")] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask SetWaveNum(string address, int port, int channelNum, int waveNum) + { + var dds = new DDSClient.DDS(address, port); + + var ret = await dds.SetWaveNum(channelNum, waveNum); + if (ret.IsSuccessful) + { + logger.Info($"Device {address} set output wave num successfully"); + return TypedResults.Ok(ret.Value); + } + else + { + logger.Error(ret.Error); + return TypedResults.InternalServerError(ret.Error); + } + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("SetFreq")] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask SetFreq(string address, int port, int channelNum, int waveNum, UInt32 step) + { + var dds = new DDSClient.DDS(address, port); + + var ret = await dds.SetFreq(channelNum, waveNum, step); + if (ret.IsSuccessful) + { + logger.Info($"Device {address} set output freqency successfully"); + return TypedResults.Ok(ret.Value); + } + else + { + logger.Error(ret.Error); + return TypedResults.InternalServerError(ret.Error); + } + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("SetPhase")] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask SetPhase(string address, int port, int channelNum, int waveNum, int phase) + { + var dds = new DDSClient.DDS(address, port); + + var ret = await dds.SetPhase(channelNum, waveNum, phase); + if (ret.IsSuccessful) + { + logger.Info($"Device {address} set output phase successfully"); + return TypedResults.Ok(ret.Value); + } + else + { + logger.Error(ret.Error); + return TypedResults.InternalServerError(ret.Error); + } + + } + +} + + +/// +/// [TODO:description] +/// +[ApiController] +[Route("api/[controller]")] +public class BsdlParserController : ControllerBase +{ + private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + [EnableCors("Development")] + [HttpGet("GetBoundaryLogicalPorts")] + public IResult GetBoundaryLogicalPorts() + { + var parser = new BsdlParser.Parser(); + var ret = parser.GetBoundaryLogicalPorts(); + if (ret.IsNull) return TypedResults.InternalServerError("Get Null"); + return TypedResults.Ok(ret.Value); + } } @@ -657,7 +826,7 @@ public class RemoteUpdater : ControllerBase /// [ApiController] [Route("api/[controller]")] -public class Data : ControllerBase +public class DataController : ControllerBase { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); @@ -716,19 +885,3 @@ public class Data : ControllerBase } } -/// -/// 日志控制器 -/// -[ApiController] -[Route("api/[controller]")] -public class Log : ControllerBase -{ - private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - - /// - /// 日志文件路径 - /// - private readonly string _logFilePath = Directory.GetFiles(Directory.GetCurrentDirectory())[0]; - -} - diff --git a/server/src/DDSClient.cs b/server/src/DDSClient.cs new file mode 100644 index 0000000..4ecdb13 --- /dev/null +++ b/server/src/DDSClient.cs @@ -0,0 +1,170 @@ +using System.Net; +using DotNext; + +namespace DDSClient; + +static class DDSAddr +{ + /*地址定义:(以2路输出,4波形存储为例) + 00 R/W CHANNEL0 wave_sel + 01 R/W CHANNEL0 STORE0 freq_ctrl + 02 R/W CHANNEL0 STORE1 freq_ctrl + 03 R/W CHANNEL0 STORE2 freq_ctrl + 04 R/W CHANNEL0 STORE3 freq_ctrl + 05 R/W CHANNEL0 STORE0 phase_ctrl + 06 R/W CHANNEL0 STORE1 phase_ctrl + 07 R/W CHANNEL0 STORE2 phase_ctrl + 08 R/W CHANNEL0 STORE3 phase_ctrl + 09 R/W CHANNEL0 dds_wr_enable + 0A WO CHANNEL0 data + + 10 R/W CHANNEL1 wave_sel + 11 R/W CHANNEL1 STORE0 freq_ctrl + 12 R/W CHANNEL1 STORE1 freq_ctrl + 13 R/W CHANNEL1 STORE2 freq_ctrl + 14 R/W CHANNEL1 STORE3 freq_ctrl + 15 R/W CHANNEL1 STORE0 phase_ctrl + 16 R/W CHANNEL1 STORE1 phase_ctrl + 17 R/W CHANNEL1 STORE2 phase_ctrl + 18 R/W CHANNEL1 STORE3 phase_ctrl + 19 R/W CHANNEL1 dds_wr_enable + 1A WO CHANNEL1 data + */ + public const UInt32 Base = 0x4000_0000; + public static readonly ChannelAddr[] Channel = { new ChannelAddr(0x00), new ChannelAddr(0x10) }; + + public class ChannelAddr + { + private readonly UInt32 Offset; + public readonly UInt32 WaveSelect; + public readonly UInt32[] FreqCtrl; + public readonly UInt32[] PhaseCtrl; + public readonly UInt32 WriteEnable; + public readonly UInt32 WriteData; + + public ChannelAddr(UInt32 offset) + { + this.Offset = offset; + this.WaveSelect = Base + Offset + 0x00; + this.FreqCtrl = new UInt32[] + { + Base + offset + 0x01, + Base + offset + 0x02, + Base + offset + 0x03, + Base + offset + 0x04 + }; + this.PhaseCtrl = new UInt32[] { + Base + Offset + 0x05, + Base + Offset + 0x06, + Base + Offset + 0x07, + Base + Offset + 0x08 + }; + this.WriteEnable = Base + Offset + 0x09; + this.WriteData = Base + Offset + 0x0A; + } + } +} + +/// +/// [TODO:description] +/// +public class DDS +{ + private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + readonly int timeout = 2000; + + readonly int port; + readonly string address; + private IPEndPoint ep; + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + public DDS(string address, int port, int timeout = 2000) + { + if (timeout < 0) + throw new ArgumentException("Timeout couldn't be negative", nameof(timeout)); + this.address = address; + this.port = port; + this.ep = new IPEndPoint(IPAddress.Parse(address), port); + this.timeout = timeout; + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + public async ValueTask> SetWaveNum(int channelNum, int waveNum) + { + if (channelNum < 0 || channelNum > 1) return new(new ArgumentException( + $"Channel number should be 0 ~ 1 instead of {channelNum}", nameof(channelNum))); + if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( + $"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); + + await MsgBus.UDPServer.ClearUDPData(this.address); + logger.Trace("Clear udp data finished"); + + var ret = await UDPClientPool.WriteAddr( + this.ep, DDSAddr.Channel[channelNum].WaveSelect, (UInt32)waveNum, this.timeout); + if (!ret.IsSuccessful) + return new(ret.Error); + return ret.Value; + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + public async ValueTask> SetFreq(int channelNum, int waveNum, UInt32 step) + { + if (channelNum < 0 || channelNum > 1) return new(new ArgumentException( + $"Channel number should be 0 ~ 1 instead of {channelNum}", nameof(channelNum))); + if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( + $"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); + + await MsgBus.UDPServer.ClearUDPData(this.address); + logger.Trace("Clear udp data finished"); + + var ret = await UDPClientPool.WriteAddr( + this.ep, DDSAddr.Channel[channelNum].FreqCtrl[waveNum], step, this.timeout); + if (!ret.IsSuccessful) + return new(ret.Error); + return ret.Value; + } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + public async ValueTask> SetPhase(int channelNum, int waveNum, int phase) + { + if (channelNum < 0 || channelNum > 1) return new(new ArgumentException( + $"Channel number should be 0 ~ 1 instead of {channelNum}", nameof(channelNum))); + if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( + $"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); + if (phase < 0 || phase > 4096) return new(new ArgumentException( + $"Phase should be 0 ~ 4096 instead of {phase}", nameof(phase))); + + await MsgBus.UDPServer.ClearUDPData(this.address); + logger.Trace("Clear udp data finished"); + + var ret = await UDPClientPool.WriteAddr( + this.ep, DDSAddr.Channel[channelNum].PhaseCtrl[waveNum], (UInt32)phase, this.timeout); + if (!ret.IsSuccessful) + return new(ret.Error); + return ret.Value; + } +} diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs index 7a3f7b3..e14fa6c 100644 --- a/server/src/JtagClient.cs +++ b/server/src/JtagClient.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Net; +using BsdlParser; using DotNext; using Newtonsoft.Json; using WebProtocol; @@ -27,6 +28,10 @@ public static class JtagAddr /// Jtag Write Command /// public const UInt32 WRITE_CMD = 0x10_00_00_03; + /// + /// Jtag Speed Control + /// + public const UInt32 SPEED_CTRL = 0x10_00_00_04; } /// @@ -773,12 +778,12 @@ public class Jtag /// /// [TODO:description] /// - /// [TODO:parameter] /// [TODO:return] - public async ValueTask> BoundaryScan(int portNum) + public async ValueTask> BoundaryScan() { - if (portNum <= 0) - return new(new ArgumentException("The number of port couldn't be negative", nameof(portNum))); + var paser = new BsdlParser.Parser(); + var portNum = paser.GetBoundaryRegsNum().Value; + logger.Debug($"Get boundar scan registers number: {portNum}"); // Clear Data await MsgBus.UDPServer.ClearUDPData(this.address); @@ -810,6 +815,48 @@ public class Jtag var byteArray = Common.Number.UInt32ArrayToBytes(retData.Value); if (!byteArray.IsSuccessful) return new(byteArray.Error); - return new BitArray(byteArray.Value); + + var bitArray = new BitArray(byteArray.Value); + if (bitArray is null) + return new(new Exception($"Convert to BitArray failed")); + bitArray.Length = portNum; + return bitArray; + } + + /// + /// [TODO:description] + /// + /// [TODO:return] + public async ValueTask>> BoundaryScanLogicalPorts() + { + var bitArray = await BoundaryScan(); + if (!bitArray.IsSuccessful) return new(bitArray.Error); + + var paser = new BsdlParser.Parser(); + var cellList = paser.GetBoundaryLogicalPorts(); + if (cellList.IsNull) return new(new Exception("Get boundary logical ports failed")); + + var portStatus = new Dictionary(); + foreach (var cell in cellList.Value) + { + portStatus.Add(cell.PortID ?? "UnknownPortID", bitArray.Value[cell.CellNumber]); + } + + return portStatus; + } + + public async ValueTask> SetSpeed(UInt32 speed) + { + // Clear Data + await MsgBus.UDPServer.ClearUDPData(this.address); + + logger.Trace($"Clear up udp server {this.address} receive data"); + + var ret = await WriteFIFO( + JtagAddr.SPEED_CTRL, (speed << 16) | speed, + JtagState.CMD_EXEC_FINISH, JtagState.CMD_EXEC_FINISH); + + if (!ret.IsSuccessful) return new (ret.Error); + return ret.Value; } } diff --git a/server/src/RemoteUpdate.cs b/server/src/RemoteUpdateClient.cs similarity index 93% rename from server/src/RemoteUpdate.cs rename to server/src/RemoteUpdateClient.cs index b6db774..df30246 100644 --- a/server/src/RemoteUpdate.cs +++ b/server/src/RemoteUpdateClient.cs @@ -1,8 +1,8 @@ using System.Net; using DotNext; -namespace RemoteUpdate; +namespace RemoteUpdateClient; -static class RemoteUpdateClientAddr +static class RemoteUpdaterAddr { public const UInt32 Base = 0x20_00_00_00; @@ -91,7 +91,7 @@ static class FlashAddr /// /// [TODO:description] /// -public class RemoteUpdateClient +public class RemoteUpdater { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); @@ -112,7 +112,7 @@ public class RemoteUpdateClient /// [TODO:parameter] /// [TODO:parameter] /// [TODO:return] - public RemoteUpdateClient(string address, int port, int timeout = 2000, int timeoutForWait = 60 * 1000) + public RemoteUpdater(string address, int port, int timeout = 2000, int timeoutForWait = 60 * 1000) { if (timeout < 0) throw new ArgumentException("Timeout couldn't be negative", nameof(timeout)); @@ -142,7 +142,7 @@ public class RemoteUpdateClient { var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdateClientAddr.WriteCtrl, + this.ep, RemoteUpdaterAddr.WriteCtrl, Convert.ToUInt32((writeSectorNum << 16) | (1 << 15) | Convert.ToInt32(flashAddr / 4096)), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Enable write flash failed")); @@ -150,7 +150,7 @@ public class RemoteUpdateClient { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdateClientAddr.WriteSign, + this.ep, RemoteUpdaterAddr.WriteSign, 0x00_00_00_01, 0x00_00_00_01, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception( @@ -158,14 +158,14 @@ public class RemoteUpdateClient } { - var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdateClientAddr.WriteFIFO, bytesData, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdaterAddr.WriteFIFO, bytesData, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Send data to flash failed")); } { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdateClientAddr.WriteSign, + this.ep, RemoteUpdaterAddr.WriteSign, 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -314,14 +314,14 @@ public class RemoteUpdateClient private async ValueTask> CheckBitstreamCRC(int bitstreamNum, int bitstreamLen, UInt32 checkSum) { { - var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdateClientAddr.ReadCtrl2, 0x00_00_00_00, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdaterAddr.ReadCtrl2, 0x00_00_00_00, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Write read control 2 failed")); } { var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdateClientAddr.ReadCtrl1, + this.ep, RemoteUpdaterAddr.ReadCtrl1, Convert.ToUInt32((bitstreamLen << 16) | (1 << 15) | Convert.ToInt32(FlashAddr.Bitstream[bitstreamNum] / 4096)), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); @@ -330,7 +330,7 @@ public class RemoteUpdateClient { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdateClientAddr.ReadSign, + this.ep, RemoteUpdaterAddr.ReadSign, 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception( @@ -338,7 +338,7 @@ public class RemoteUpdateClient } { - var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdateClientAddr.ReadCRC, this.timeout); + var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdaterAddr.ReadCRC, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); var bytes = ret.Value.Options.Data; @@ -368,7 +368,7 @@ public class RemoteUpdateClient $"Bitsteam num should be 0 ~ 3 for HotRest, but given {bitstreamNum}", nameof(bitstreamNum))); var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdateClientAddr.HotResetCtrl, + this.ep, RemoteUpdaterAddr.HotResetCtrl, ((FlashAddr.Bitstream[bitstreamNum] << 8) | 1), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -532,4 +532,23 @@ public class RemoteUpdateClient } } + /// + /// [TODO:description] + /// + /// [TODO:return] + public async ValueTask> GetVersion() + { + await MsgBus.UDPServer.ClearUDPData(this.address); + logger.Trace("Clear udp data finished"); + + { + var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdaterAddr.Version, this.timeout); + if (!ret.IsSuccessful) return new(ret.Error); + + var retData = ret.Value.Options.Data; + if (retData is null || retData.Length != 4) return new(new Exception("Failed to read remote update firmware version")); + var version = Common.Number.BytesToUInt32(retData); + return version; + } + } } diff --git a/src/APIClient.ts b/src/APIClient.ts index 49a46e5..1efd437 100644 --- a/src/APIClient.ts +++ b/src/APIClient.ts @@ -8,47 +8,6 @@ /* eslint-disable */ // ReSharper disable InconsistentNaming -export class Client { - private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; - private baseUrl: string; - protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; - - constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) { - this.http = http ? http : window as any; - this.baseUrl = baseUrl ?? "http://localhost:5000"; - } - - get(): Promise { - let url_ = this.baseUrl + "/"; - url_ = url_.replace(/[?&]$/, ""); - - let options_: RequestInit = { - method: "GET", - headers: { - } - }; - - return this.http.fetch(url_, options_).then((_response: Response) => { - return this.processGet(_response); - }); - } - - protected processGet(response: Response): Promise { - const status = response.status; - let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; - if (status === 200) { - return response.text().then((_responseText) => { - return; - }); - } else if (status !== 200 && status !== 204) { - return response.text().then((_responseText) => { - return throwException("An unexpected server error occurred.", status, _responseText, _headers); - }); - } - return Promise.resolve(null as any); - } -} - export class UDPClient { private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; private baseUrl: string; @@ -408,63 +367,6 @@ export class JtagClient { return Promise.resolve(null as any); } - /** - * 执行一个Jtag命令 - * @param address (optional) 设备地址 - * @param port (optional) 设备端口 - * @param hexDevAddr (optional) 16进制设备目的地址(Jtag) - * @param hexCmd (optional) 16进制命令 - */ - runCommand(address: string | undefined, port: number | undefined, hexDevAddr: string | undefined, hexCmd: string | undefined): Promise { - let url_ = this.baseUrl + "/api/Jtag/RunCommand?"; - if (address === null) - throw new Error("The parameter 'address' cannot be null."); - else if (address !== undefined) - url_ += "address=" + encodeURIComponent("" + address) + "&"; - if (port === null) - throw new Error("The parameter 'port' cannot be null."); - else if (port !== undefined) - url_ += "port=" + encodeURIComponent("" + port) + "&"; - if (hexDevAddr === null) - throw new Error("The parameter 'hexDevAddr' cannot be null."); - else if (hexDevAddr !== undefined) - url_ += "hexDevAddr=" + encodeURIComponent("" + hexDevAddr) + "&"; - if (hexCmd === null) - throw new Error("The parameter 'hexCmd' cannot be null."); - else if (hexCmd !== undefined) - url_ += "hexCmd=" + encodeURIComponent("" + hexCmd) + "&"; - url_ = url_.replace(/[?&]$/, ""); - - let options_: RequestInit = { - method: "POST", - headers: { - } - }; - - return this.http.fetch(url_, options_).then((_response: Response) => { - return this.processRunCommand(_response); - }); - } - - protected processRunCommand(response: Response): Promise { - const status = response.status; - let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; - if (status === 200) { - return response.text().then((_responseText) => { - return; - }); - } else if (status === 500) { - return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); - }); - } else if (status !== 200 && status !== 204) { - return response.text().then((_responseText) => { - return throwException("An unexpected server error occurred.", status, _responseText, _headers); - }); - } - return Promise.resolve(null as any); - } - /** * 获取Jtag ID Code * @param address (optional) 设备地址 @@ -686,9 +588,214 @@ export class JtagClient { } return Promise.resolve(null as any); } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @return [TODO:return] + */ + boundaryScanAllPorts(address: string | undefined, port: number | undefined): Promise { + let url_ = this.baseUrl + "/api/Jtag/BoundaryScanAllPorts?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processBoundaryScanAllPorts(_response); + }); + } + + protected processBoundaryScanAllPorts(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = resultData400 !== undefined ? resultData400 : null; + + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @return [TODO:return] + */ + boundaryScanLogicalPorts(address: string | undefined, port: number | undefined): Promise<{ [key: string]: boolean; }> { + let url_ = this.baseUrl + "/api/Jtag/BoundaryScanLogicalPorts?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processBoundaryScanLogicalPorts(_response); + }); + } + + protected processBoundaryScanLogicalPorts(response: Response): Promise<{ [key: string]: boolean; }> { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + if (resultData200) { + result200 = {} as any; + for (let key in resultData200) { + if (resultData200.hasOwnProperty(key)) + (result200)![key] = resultData200[key] !== undefined ? resultData200[key] : null; + } + } + else { + result200 = null; + } + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = resultData400 !== undefined ? resultData400 : null; + + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve<{ [key: string]: boolean; }>(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @param speed (optional) [TODO:parameter] + * @return [TODO:return] + */ + setSpeed(address: string | undefined, port: number | undefined, speed: number | undefined): Promise { + let url_ = this.baseUrl + "/api/Jtag/SetSpeed?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + if (speed === null) + throw new Error("The parameter 'speed' cannot be null."); + else if (speed !== undefined) + url_ += "speed=" + encodeURIComponent("" + speed) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processSetSpeed(_response); + }); + } + + protected processSetSpeed(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = resultData400 !== undefined ? resultData400 : null; + + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } } -export class RemoteUpdaterClient { +export class RemoteUpdateClient { private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; private baseUrl: string; protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; @@ -707,8 +814,8 @@ export class RemoteUpdaterClient { * @param bitstream3 (optional) * @return 上传结果 */ - uploadBitstreams(address: string | undefined, goldenBitream: FileParameter | null | undefined, bitstream1: FileParameter | null | undefined, bitstream2: FileParameter | null | undefined, bitstream3: FileParameter | null | undefined): Promise { - let url_ = this.baseUrl + "/api/RemoteUpdater/UploadBitstream?"; + uploadBitstreams(address: string | undefined, goldenBitream: FileParameter | null | undefined, bitstream1: FileParameter | null | undefined, bitstream2: FileParameter | null | undefined, bitstream3: FileParameter | null | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdate/UploadBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); else if (address !== undefined) @@ -729,6 +836,7 @@ export class RemoteUpdaterClient { body: content_, method: "POST", headers: { + "Accept": "application/json" } }; @@ -737,18 +845,22 @@ export class RemoteUpdaterClient { }); } - protected processUploadBitstreams(response: Response): Promise { + protected processUploadBitstreams(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status !== 200 && status !== 204) { @@ -756,7 +868,7 @@ export class RemoteUpdaterClient { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -765,8 +877,8 @@ export class RemoteUpdaterClient { * @param port (optional) 设备端口 * @param bitstreamNum (optional) 比特流位号 */ - updateBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { - let url_ = this.baseUrl + "/api/RemoteUpdater/DownloadBitstream?"; + updateBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdate/DownloadBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); else if (address !== undefined) @@ -784,6 +896,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -792,30 +905,37 @@ export class RemoteUpdaterClient { }); } - protected processUpdateBitstream(response: Response): Promise { + protected processUpdateBitstream(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -825,8 +945,8 @@ export class RemoteUpdaterClient { * @param bitstreamNum (optional) 比特流编号 * @return 总共上传比特流的数量 */ - downloadMultiBitstreams(address: string | undefined, port: number | undefined, bitstreamNum: number | null | undefined): Promise { - let url_ = this.baseUrl + "/api/RemoteUpdater/DownloadMultiBitstreams?"; + downloadMultiBitstreams(address: string | undefined, port: number | undefined, bitstreamNum: number | null | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdate/DownloadMultiBitstreams?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); else if (address !== undefined) @@ -842,6 +962,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -850,30 +971,37 @@ export class RemoteUpdaterClient { }); } - protected processDownloadMultiBitstreams(response: Response): Promise { + protected processDownloadMultiBitstreams(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -883,8 +1011,8 @@ export class RemoteUpdaterClient { * @param bitstreamNum (optional) 比特流编号 * @return 操作结果 */ - hotResetBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { - let url_ = this.baseUrl + "/api/RemoteUpdater/HotResetBitstream?"; + hotResetBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdate/HotResetBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); else if (address !== undefined) @@ -902,6 +1030,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -910,30 +1039,389 @@ export class RemoteUpdaterClient { }); } - protected processHotResetBitstream(response: Response): Promise { + protected processHotResetBitstream(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @return [TODO:return] + */ + getFirmwareVersion(address: string | undefined, port: number | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdate/GetFirmwareVersion?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetFirmwareVersion(_response); + }); + } + + protected processGetFirmwareVersion(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = ArgumentException.fromJS(resultData400); + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } +} + +export class DDSClient { + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) { + this.http = http ? http : window as any; + this.baseUrl = baseUrl ?? "http://localhost:5000"; + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @param channelNum (optional) [TODO:parameter] + * @param waveNum (optional) [TODO:parameter] + * @return [TODO:return] + */ + setWaveNum(address: string | undefined, port: number | undefined, channelNum: number | undefined, waveNum: number | undefined): Promise { + let url_ = this.baseUrl + "/api/DDS/SetWaveNum?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + if (channelNum === null) + throw new Error("The parameter 'channelNum' cannot be null."); + else if (channelNum !== undefined) + url_ += "channelNum=" + encodeURIComponent("" + channelNum) + "&"; + if (waveNum === null) + throw new Error("The parameter 'waveNum' cannot be null."); + else if (waveNum !== undefined) + url_ += "waveNum=" + encodeURIComponent("" + waveNum) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processSetWaveNum(_response); + }); + } + + protected processSetWaveNum(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = ArgumentException.fromJS(resultData400); + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @param channelNum (optional) [TODO:parameter] + * @param waveNum (optional) [TODO:parameter] + * @param step (optional) [TODO:parameter] + * @return [TODO:return] + */ + setFreq(address: string | undefined, port: number | undefined, channelNum: number | undefined, waveNum: number | undefined, step: number | undefined): Promise { + let url_ = this.baseUrl + "/api/DDS/SetFreq?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + if (channelNum === null) + throw new Error("The parameter 'channelNum' cannot be null."); + else if (channelNum !== undefined) + url_ += "channelNum=" + encodeURIComponent("" + channelNum) + "&"; + if (waveNum === null) + throw new Error("The parameter 'waveNum' cannot be null."); + else if (waveNum !== undefined) + url_ += "waveNum=" + encodeURIComponent("" + waveNum) + "&"; + if (step === null) + throw new Error("The parameter 'step' cannot be null."); + else if (step !== undefined) + url_ += "step=" + encodeURIComponent("" + step) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processSetFreq(_response); + }); + } + + protected processSetFreq(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = ArgumentException.fromJS(resultData400); + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @param channelNum (optional) [TODO:parameter] + * @param waveNum (optional) [TODO:parameter] + * @param phase (optional) [TODO:parameter] + * @return [TODO:return] + */ + setPhase(address: string | undefined, port: number | undefined, channelNum: number | undefined, waveNum: number | undefined, phase: number | undefined): Promise { + let url_ = this.baseUrl + "/api/DDS/SetPhase?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + if (channelNum === null) + throw new Error("The parameter 'channelNum' cannot be null."); + else if (channelNum !== undefined) + url_ += "channelNum=" + encodeURIComponent("" + channelNum) + "&"; + if (waveNum === null) + throw new Error("The parameter 'waveNum' cannot be null."); + else if (waveNum !== undefined) + url_ += "waveNum=" + encodeURIComponent("" + waveNum) + "&"; + if (phase === null) + throw new Error("The parameter 'phase' cannot be null."); + else if (phase !== undefined) + url_ += "phase=" + encodeURIComponent("" + phase) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processSetPhase(_response); + }); + } + + protected processSetPhase(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = ArgumentException.fromJS(resultData400); + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } +} + +export class BsdlParserClient { + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) { + this.http = http ? http : window as any; + this.baseUrl = baseUrl ?? "http://localhost:5000"; + } + + getBoundaryLogicalPorts(): Promise { + let url_ = this.baseUrl + "/api/BsdlParser/GetBoundaryLogicalPorts"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "GET", + headers: { + "Accept": "application/octet-stream" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetBoundaryLogicalPorts(_response); + }); + } + + protected processGetBoundaryLogicalPorts(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200 || status === 206) { + const contentDisposition = response.headers ? response.headers.get("content-disposition") : undefined; + let fileNameMatch = contentDisposition ? /filename\*=(?:(\\?['"])(.*?)\1|(?:[^\s]+'.*?')?([^;\n]*))/g.exec(contentDisposition) : undefined; + let fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[3] || fileNameMatch[2] : undefined; + if (fileName) { + fileName = decodeURIComponent(fileName); + } else { + fileNameMatch = contentDisposition ? /filename="?([^"]*?)"?(;|$)/g.exec(contentDisposition) : undefined; + fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined; + } + return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); } } @@ -1303,84 +1791,67 @@ export interface IException { stackTrace?: string | undefined; } -export class ProblemDetails implements IProblemDetails { - type?: string | undefined; - title?: string | undefined; - status?: number | undefined; - detail?: string | undefined; - instance?: string | undefined; - extensions?: { [key: string]: any; }; +export class SystemException extends Exception implements ISystemException { - [key: string]: any; - - constructor(data?: IProblemDetails) { - if (data) { - for (var property in data) { - if (data.hasOwnProperty(property)) - (this)[property] = (data)[property]; - } - } + constructor(data?: ISystemException) { + super(data); } init(_data?: any) { - if (_data) { - for (var property in _data) { - if (_data.hasOwnProperty(property)) - this[property] = _data[property]; - } - this.type = _data["type"]; - this.title = _data["title"]; - this.status = _data["status"]; - this.detail = _data["detail"]; - this.instance = _data["instance"]; - if (_data["extensions"]) { - this.extensions = {} as any; - for (let key in _data["extensions"]) { - if (_data["extensions"].hasOwnProperty(key)) - (this.extensions)![key] = _data["extensions"][key]; - } - } - } + super.init(_data); } - static fromJS(data: any): ProblemDetails { + static fromJS(data: any): SystemException { data = typeof data === 'object' ? data : {}; - let result = new ProblemDetails(); + let result = new SystemException(); result.init(data); return result; } toJSON(data?: any) { data = typeof data === 'object' ? data : {}; - for (var property in this) { - if (this.hasOwnProperty(property)) - data[property] = this[property]; - } - data["type"] = this.type; - data["title"] = this.title; - data["status"] = this.status; - data["detail"] = this.detail; - data["instance"] = this.instance; - if (this.extensions) { - data["extensions"] = {}; - for (let key in this.extensions) { - if (this.extensions.hasOwnProperty(key)) - (data["extensions"])[key] = (this.extensions)[key]; - } - } + super.toJSON(data); return data; } } -export interface IProblemDetails { - type?: string | undefined; - title?: string | undefined; - status?: number | undefined; - detail?: string | undefined; - instance?: string | undefined; - extensions?: { [key: string]: any; }; +export interface ISystemException extends IException { +} - [key: string]: any; +export class ArgumentException extends SystemException implements IArgumentException { + paramName?: string | undefined; + + constructor(data?: IArgumentException) { + super(data); + } + + init(_data?: any) { + super.init(_data); + if (_data) { + this.message = _data["Message"]; + this.paramName = _data["ParamName"]; + } + } + + static fromJS(data: any): ArgumentException { + data = typeof data === 'object' ? data : {}; + let result = new ArgumentException(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["Message"] = this.message; + data["ParamName"] = this.paramName; + super.toJSON(data); + return data; + } +} + +export interface IArgumentException extends ISystemException { + message?: string; + paramName?: string | undefined; } export interface FileParameter { @@ -1424,4 +1895,4 @@ function throwException(message: string, status: number, response: string, heade throw result; else throw new ApiException(message, status, response, headers, null); -} \ No newline at end of file +} diff --git a/src/Common.ts b/src/Common.ts new file mode 100644 index 0000000..406186f --- /dev/null +++ b/src/Common.ts @@ -0,0 +1,22 @@ +import { type FileParameter } from "./APIClient"; +import { isNull, isUndefined } from "lodash"; + +export namespace Common { + export function toFileParameter(object: File): FileParameter { + if (isNull(object) || isUndefined(object)) + throw new Error("File is Null or Undefined"); + return { + data: object, + fileName: object.name + } + } + + export function toFileParameterOrNull(object?: File | null): FileParameter | null { + if (isNull(object) || isUndefined(object)) return null; + else return { + data: object, + fileName: object.name + } + } + +} diff --git a/src/components/ComponentSelector.vue b/src/components/ComponentSelector.vue index be4779c..31f1b4a 100644 --- a/src/components/ComponentSelector.vue +++ b/src/components/ComponentSelector.vue @@ -5,10 +5,13 @@
-