| <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> |