| <html><head> | |
| <title>Project X-Ray Grid Viewer</title> | |
| <!-- https://github.com/ariutta/svg-pan-zoom --> | |
| <script src="svg-pan-zoom.js"></script> | |
| <script><!-- | |
| var device = "xc7a50tfgg484-1"; | |
| var database; | |
| var cfgcols = { }; | |
| var numrows = 1; | |
| var numcols = 1; | |
| var marker; | |
| var hide_props = [ | |
| "ALTERNATE_SITE_TYPES", | |
| "CLASS", | |
| "FIRST_SITE_ID", | |
| "GRID_POINT_X", | |
| "GRID_POINT_Y", | |
| "INDEX", | |
| "IS_BONDED", | |
| "IS_CENTER_TILE", | |
| "IS_CLOCK_BUFFER", | |
| "IS_CLOCK_PAD", | |
| "IS_DCM_TILE", | |
| "IS_GLOBAL_CLOCK_BUFFER", | |
| "IS_GLOBAL_CLOCK_PAD", | |
| "IS_GT_CLOCK_SITE_TILE", | |
| "IS_GT_SITE_TILE", | |
| "IS_PAD", | |
| "IS_REGIONAL_CLOCK_BUFFER", | |
| "IS_REGIONAL_CLOCK_PAD", | |
| "IS_RESERVED", | |
| "IS_TEST", | |
| "IS_USED", | |
| "MANUAL_ROUTING", | |
| "PROHIBIT", | |
| "PROHIBIT_FROM_PERSIST", | |
| "SITE_PIPS", | |
| "SLR_REGION_ID", | |
| "TILE_PATTERN_IDX", | |
| "TILE_TYPE_INDEX", | |
| "TILE_X", | |
| "TILE_Y", | |
| "TYPE" | |
| ]; | |
| function getJSON(url, callback) { | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open('GET', url, true); | |
| xhr.responseType = 'json'; | |
| xhr.onload = function() { | |
| var status = xhr.status; | |
| if (status == 200) { | |
| console.log("Finished downloading JSON file " + url + "."); | |
| callback(xhr.response); | |
| } else { | |
| console.log("Failed to download JSON file " + url + ". Status: " + status); | |
| window.alert("Failed to download JSON file " + url + ". Status: " + status); | |
| } | |
| }; | |
| console.log("Downloading JSON file " + url + "."); | |
| xhr.send(); | |
| }; | |
| function getBaseURL() { | |
| var loc = window.location.toString().split("/"); | |
| loc[loc.length-1] = ""; | |
| return loc.join("/"); | |
| } | |
| function tileInfo(tile) { | |
| var props = database["tiles"][tile]["props"]; | |
| var row = +props["ROW"]; | |
| var col = +props["COLUMN"]; | |
| var html_text = "<h3>Tile: " + tile + "</h3>\n"; | |
| html_text += "<table>\n"; | |
| for (var p in props) { | |
| if (hide_props.indexOf(p) >= 0) continue; | |
| html_text += "<tr><td>" + p + "</td><td>" + props[p] + "</td></tr>\n"; | |
| } | |
| html_text += "</table>\n"; | |
| if ("cfgcol" in database["tiles"][tile]) { | |
| props = database["tiles"][tile]["cfgcol"] | |
| html_text += "<h3>Configuration Column</h3>\n"; | |
| html_text += "<table>\n"; | |
| for (var p in props) { | |
| if (hide_props.indexOf(p) >= 0) continue; | |
| html_text += "<tr><td>" + p + "</td><td>" + props[p] + "</td></tr>\n"; | |
| } | |
| html_text += "</table>\n"; | |
| } | |
| for (var site_idx in database["tiles"][tile]["sites"]) { | |
| var site = database["tiles"][tile]["sites"][site_idx]; | |
| props = database["sites"][site]["props"]; | |
| html_text += "<h3>Site: " + tile + "</h3>\n"; | |
| if ("bit" in database["sites"][site]) | |
| html_text += '<div style="margin-bottom: 1em">' + database["sites"][site]["bit"] + "</div>\n"; | |
| html_text += "<table>\n"; | |
| for (var p in props) { | |
| if (hide_props.indexOf(p) >= 0) continue; | |
| html_text += "<tr><td>" + p + "</td><td>" + props[p] + "</td></tr>\n"; | |
| } | |
| html_text += "</table>\n"; | |
| } | |
| var infos = document.getElementById("infos"); | |
| infos.innerHTML = html_text; | |
| marker.setAttribute("cx", 5 + 10 * col); | |
| marker.setAttribute("cy", 5 + 10 * row); | |
| marker.setAttribute("style", "fill: none; stroke: Black;"); | |
| } | |
| function createSvgTile(tile) { | |
| var props = database["tiles"][tile]["props"]; | |
| var row = +props["ROW"]; | |
| var col = +props["COLUMN"]; | |
| if (row >= numrows) numrows = row + 1; | |
| if (col >= numcols) numcols = col + 1; | |
| var color = "Gray"; | |
| if (props["TYPE"].startsWith("CLBLM_")) color = "Khaki"; | |
| if (props["TYPE"].startsWith("CLBLL_")) color = "Gold"; | |
| if (props["TYPE"].startsWith("BRAM_")) color = "Red"; | |
| if (props["TYPE"].startsWith("DSP_")) color = "Tomato"; | |
| if (props["TYPE"].startsWith("PCIE_")) color = "Green"; | |
| if (props["TYPE"] == "INT_L") color = "SteelBlue"; | |
| if (props["TYPE"] == "INT_R") color = "SteelBlue"; | |
| if (props["TYPE"].startsWith("INT_INTERFACE_")) color = "RoyalBlue"; | |
| if (props["TYPE"].startsWith("BRAM_INT_INTERFACE_")) color = "RoyalBlue"; | |
| if (props["TYPE"].startsWith("INT_FEEDTHRU_")) color = "SkyBlue"; | |
| if (props["TYPE"] == "VBRK") color = "LightCyan"; | |
| if (props["TYPE"] == "VFRAME") color = "LightCyan"; | |
| if (props["TYPE"].search("_TERM_INT") >= 0) color = "LightCyan"; | |
| if (props["TYPE"] == "NULL") color = "Lightgray"; | |
| rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); | |
| rect.setAttribute("id", "tile_" + tile); | |
| rect.setAttribute("x", 10 * col + 1); | |
| rect.setAttribute("y", 10 * row + 1); | |
| rect.setAttribute("width", 8); | |
| rect.setAttribute("height", 8); | |
| rect.setAttribute("style", "fill: " + color); | |
| rect.setAttribute("onmousedown", "tileInfo('" + tile + "')"); | |
| var gridview = document.getElementById("gridview"); | |
| gridview.appendChild(rect); | |
| if ("cfgcol" in database["tiles"][tile]) { | |
| var frameid = database["tiles"][tile]["cfgcol"]["BASE_FRAMEID"]; | |
| if (!(frameid in cfgcols)) { | |
| cfgcols[frameid] = { | |
| "first_row": row, | |
| "last_row": row, | |
| "first_col": col, | |
| "last_col": col | |
| }; | |
| } | |
| if (row < cfgcols[frameid].first_row) cfgcols[frameid].first_row = row; | |
| if (row > cfgcols[frameid].last_row) cfgcols[frameid].last_row = row; | |
| if (col < cfgcols[frameid].first_col) cfgcols[frameid].first_col = col; | |
| if (col > cfgcols[frameid].last_col) cfgcols[frameid].last_col = col; | |
| } | |
| } | |
| function initialize() { | |
| for (var tile in database["tiles"]) | |
| createSvgTile(tile); | |
| var gridview = document.getElementById("gridview"); | |
| rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); | |
| rect.setAttribute("id", "tile_" + tile); | |
| rect.setAttribute("x", 0); | |
| rect.setAttribute("y", 0); | |
| rect.setAttribute("width", 10 * numcols); | |
| rect.setAttribute("height", 10 * numrows); | |
| rect.setAttribute("style", "fill: none; stroke: Black;"); | |
| gridview.appendChild(rect); | |
| marker = document.createElementNS("http://www.w3.org/2000/svg", "circle"); | |
| marker.setAttribute("cx", 0); | |
| marker.setAttribute("cy", 0); | |
| marker.setAttribute("r", 5); | |
| marker.setAttribute("style", "fill: none; stroke: none;"); | |
| gridview.appendChild(marker); | |
| for (var frameid in cfgcols) { | |
| var cfgcol = cfgcols[frameid]; | |
| rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); | |
| rect.setAttribute("id", "tile_" + tile); | |
| rect.setAttribute("x", 10 * cfgcol.first_col); | |
| rect.setAttribute("y", 10 * cfgcol.first_row); | |
| rect.setAttribute("width", 10 + 10 * (cfgcol.last_col - cfgcol.first_col)); | |
| rect.setAttribute("height", 10 + 10 * (cfgcol.last_row - cfgcol.first_row)); | |
| rect.setAttribute("style", "fill: none; stroke: Black; stroke-width: 0.5px;"); | |
| gridview.appendChild(rect); | |
| } | |
| gridview.setAttribute("viewBox", "0 0 " + (10 * numcols) + " " + (10 * numrows)); | |
| svgPanZoom('#gridview', {zoomEnabled: true}); | |
| document.getElementById("title").innerHTML = "Project X-Ray Grid Viewer -- " + database["device"]; | |
| document.getElementById("infos").style.visibility = "visible"; | |
| } | |
| window.onload = function() { | |
| getJSON(getBaseURL() + "grid-" + device + "-db.json", function(data) { | |
| database = data; | |
| initialize(); | |
| }); | |
| } | |
| //--></script> | |
| </head><body bgcolor="#aaaaaa"> | |
| <div><b><span id="title">Loading device database. Please wait...</span></b></div> | |
| <table><tr><td valign="top"> | |
| <div style="background-color: white; width: 600px; height:800px"><svg xmlns="http://www.w3.org/2000/svg" | |
| id="gridview" width="100%" height="100%" viewBox="0 0 200 200"></svg></div> | |
| </td><td valign="top" style="padding-left: 1em"> | |
| <div id="legend" style="margin-bottom: 1em"> | |
| <table> | |
| <tr><td style="background-color: Khaki; width: 3em"> </td><td style="padding-left: 0.5em">CLBLM (Tile with two SLICEM sites)</td></tr> | |
| <tr><td style="background-color: Gold"> </td><td style="padding-left: 0.5em">CLBLL (Tile with two SLICEL sites)</td></tr> | |
| <tr><td style="background-color: Red"> </td><td style="padding-left: 0.5em">Block RAM Tile</td></tr> | |
| <tr><td style="background-color: Tomato"> </td><td style="padding-left: 0.5em">DSP Tile</td></tr> | |
| <tr><td style="background-color: Green"> </td><td style="padding-left: 0.5em">PCIE Tile</td></tr> | |
| <tr><td style="background-color: SteelBlue"> </td><td style="padding-left: 0.5em">Regular Interconnect tile</td></tr> | |
| <tr><td style="background-color: RoyalBlue"> </td><td style="padding-left: 0.5em">Interface Interconnect tile</td></tr> | |
| <tr><td style="background-color: SkyBlue"> </td><td style="padding-left: 0.5em">Feedthru Interconnect tile</td></tr> | |
| <tr><td style="background-color: LightCyan"> </td><td style="padding-left: 0.5em">VBRK / VFRAME / TERM</td></tr> | |
| <tr><td style="background-color: LightGray"> </td><td style="padding-left: 0.5em">NULL Tile</td></tr> | |
| <tr><td style="background-color: Gray"> </td><td style="padding-left: 0.5em">Other</td></tr> | |
| </table> | |
| </div> | |
| <div style="visibility: hidden" id="infos"> | |
| <pre><------------------- | |
| Zoom with mouse wheel | |
| Pan by dragging | |
| Click on a tile for details</pre> | |
| </div> | |
| </td></tr></table> | |
| </body></html> |