@wafertools/wafermap 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -13
- package/CHANGELOG.md +334 -1
- package/README.md +3 -3
- package/dist/packages/canvas-adapter/charts/chartShell.d.ts +2 -12
- package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
- package/dist/packages/canvas-adapter/dieList.js +7 -7
- package/dist/packages/canvas-adapter/drilldown.js +1 -1
- package/dist/packages/canvas-adapter/insightsTab.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferMap.d.ts +47 -4
- package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
- package/dist/packages/canvas-adapter/summaryPanel.d.ts +22 -3
- package/dist/packages/canvas-adapter/summaryPanel.js +4 -3
- package/dist/packages/canvas-adapter/toCanvas.d.ts +23 -2
- package/dist/packages/canvas-adapter/toCanvas.js +1 -1
- package/dist/packages/canvas-adapter/toolbar.d.ts +54 -1
- package/dist/packages/canvas-adapter/toolbar.js +2 -2
- package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
- package/dist/packages/canvas-adapter/userGuideHtml.js +100 -27
- package/dist/packages/canvas-adapter/version.d.ts +2 -2
- package/dist/packages/canvas-adapter/version.js +1 -1
- package/dist/packages/core/aggregates.d.ts +6 -0
- package/dist/packages/core/aggregates.js +1 -1
- package/dist/packages/core/compact.d.ts +205 -0
- package/dist/packages/core/compact.js +3 -0
- package/dist/packages/core/dieTable.d.ts +137 -0
- package/dist/packages/core/dieTable.js +1 -0
- package/dist/packages/core/dies.d.ts +22 -0
- package/dist/packages/core/dies.js +1 -1
- package/dist/packages/core/passBins.d.ts +6 -0
- package/dist/packages/core/passBins.js +1 -1
- package/dist/packages/core/utils.d.ts +14 -0
- package/dist/packages/core/utils.js +1 -1
- package/dist/packages/renderer/axisTicks.d.ts +14 -0
- package/dist/packages/renderer/axisTicks.js +1 -1
- package/dist/packages/renderer/buildView.d.ts +29 -4
- package/dist/packages/renderer/buildView.js +1 -1
- package/dist/packages/renderer/buildWaferMap.d.ts +29 -11
- package/dist/packages/renderer/buildWaferMap.js +1 -1
- package/dist/packages/renderer/columnarInput.d.ts +87 -0
- package/dist/packages/renderer/columnarInput.js +1 -0
- package/dist/packages/renderer/compactView.d.ts +22 -0
- package/dist/packages/renderer/compactView.js +1 -0
- package/dist/packages/renderer/derivedTests/apply.d.ts +8 -6
- package/dist/packages/renderer/derivedTests/apply.js +1 -1
- package/dist/packages/renderer/index.d.ts +1 -0
- package/dist/packages/renderer/spec.d.ts +3 -7
- package/dist/packages/renderer/spec.js +1 -1
- package/dist/packages/renderer/xyIndicator.d.ts +27 -0
- package/dist/packages/renderer/xyIndicator.js +1 -0
- package/dist/packages/stats/analyzeWaferLot.d.ts +28 -0
- package/dist/packages/stats/analyzeWaferLot.js +1 -1
- package/dist/packages/stats/analyzeWaferMap.d.ts +169 -2
- package/dist/packages/stats/analyzeWaferMap.js +1 -1
- package/dist/packages/stats/binRows.d.ts +38 -0
- package/dist/packages/stats/binRows.js +1 -0
- package/dist/packages/stats/boxplot.js +1 -1
- package/dist/packages/stats/capability.d.ts +7 -7
- package/dist/packages/stats/capability.js +1 -1
- package/dist/packages/stats/clusterDetection.js +1 -1
- package/dist/packages/stats/connectedComponents.js +1 -1
- package/dist/packages/stats/correlation.js +1 -1
- package/dist/packages/stats/filterFindings.d.ts +30 -0
- package/dist/packages/stats/filterFindings.js +1 -1
- package/dist/packages/stats/findingText.d.ts +9 -0
- package/dist/packages/stats/findingText.js +2 -0
- package/dist/packages/stats/histogram.js +1 -1
- package/dist/packages/stats/lotDrift.d.ts +16 -0
- package/dist/packages/stats/lotDrift.js +1 -0
- package/dist/packages/stats/lotPattern.d.ts +33 -0
- package/dist/packages/stats/lotPattern.js +1 -0
- package/dist/packages/stats/math.d.ts +73 -6
- package/dist/packages/stats/math.js +1 -1
- package/dist/packages/stats/normalizeInput.js +1 -1
- package/dist/packages/stats/patternClassification.d.ts +34 -3
- package/dist/packages/stats/patternClassification.js +1 -1
- package/dist/packages/stats/presentation.d.ts +42 -0
- package/dist/packages/stats/presentation.js +1 -0
- package/dist/packages/stats/regions.d.ts +16 -0
- package/dist/packages/stats/regions.js +1 -1
- package/dist/packages/stats/renderSummaryReport.d.ts +15 -2
- package/dist/packages/stats/renderSummaryReport.js +32 -27
- package/dist/packages/stats/reportHtml.d.ts +54 -9
- package/dist/packages/stats/reportHtml.js +130 -47
- package/dist/packages/stats/scatter.js +1 -1
- package/dist/packages/stats/sweep.js +1 -1
- package/dist/packages/stats/synthesis.d.ts +66 -0
- package/dist/packages/stats/synthesis.js +2 -0
- package/dist/packages/stats/testPassRate.js +1 -1
- package/dist/packages/stats/trend.js +1 -1
- package/dist/packages/stats/types.d.ts +6 -1
- package/dist/packages/stats/yieldRows.d.ts +31 -0
- package/dist/packages/stats/yieldRows.js +1 -0
- package/dist/packages/worker/index.js +1 -1
- package/dist/packages/worker/wafermap.worker.d.ts +3 -0
- package/dist/packages/worker/wafermap.worker.js +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/dist/packages/stats/findingsNarrative.d.ts +0 -3
- package/dist/packages/stats/findingsNarrative.js +0 -1
|
@@ -72,7 +72,7 @@ export const USER_GUIDE_HTML=`<div class="wmap-guide">
|
|
|
72
72
|
.wmap-guide-toc{display:none!important}
|
|
73
73
|
}
|
|
74
74
|
</style>
|
|
75
|
-
<h1 id="wafer-map-user-guide">Wafer Map \u2014 User Guide<span class="wmap-guide-version" title="Built 2026-
|
|
75
|
+
<h1 id="wafer-map-user-guide">Wafer Map \u2014 User Guide<span class="wmap-guide-version" title="Built 2026-10-02T10:01:50.772Z">v0.33.0</span></h1>
|
|
76
76
|
<p class="wmap-guide-online-link">This is a quick reference. <a href="https://wafertools.github.io/wafermap/user-guide/" target="_blank" rel="noopener">View the full illustrated guide online \u2197</a></p>
|
|
77
77
|
<p>This guide describes the display and analysis features of the wafer map viewer.
|
|
78
78
|
It is written for users who may be semiconductor test engineers, device engineers, and yield engineers
|
|
@@ -97,7 +97,10 @@ display does not change the coordinate labels \u2014 a die at (3, \u22122) alway
|
|
|
97
97
|
<h3 id="12-wafer-orientation">1.2 Wafer orientation</h3>
|
|
98
98
|
<p>The notch (shown as a V-notch or flat edge) marks the physical reference edge of
|
|
99
99
|
the wafer as configured. Use the <strong>Orientation</strong> toolbar controls to rotate or flip
|
|
100
|
-
the display to match your convention; die coordinates are unaffected
|
|
100
|
+
the display to match your convention; die coordinates are unaffected. The first rotate
|
|
101
|
+
or flip also switches on the <strong>XY indicator</strong> (the +X/+Y arrows in the Overlays menu), so
|
|
102
|
+
you can see which way the die coordinates now run. It stays on until you switch it off
|
|
103
|
+
there; <strong>Reset orientation</strong> leaves it as it is.</p>
|
|
101
104
|
<div data-wmap-demo="bin-map" class="wmap-demo"></div><p><em>An example wafer bin map above and below the same wafer rotated 90\xB0. The notch has moved, but die coordinates \u2014 shown in tooltips \u2014 remain their original grid/prober values.</em></p>
|
|
102
105
|
<div data-wmap-demo="orientation" class="wmap-demo"></div><h3 id="13-die-appearance">1.3 Die appearance</h3>
|
|
103
106
|
<table>
|
|
@@ -144,7 +147,9 @@ automatically, since there is nothing to plot on a gradient.</p>
|
|
|
144
147
|
<p>Every map also shows a short <strong>title</strong> by the colorbar or legend naming what is
|
|
145
148
|
displayed \u2014 the test name (and number, in limit pass/fail mode), the bin type, or the stacked
|
|
146
149
|
wafer count.</p>
|
|
147
|
-
<p>Clicking a bin swatch in the legend filters the display to that bin
|
|
150
|
+
<p>Clicking a bin swatch in the legend filters the display to that bin: every other bin is
|
|
151
|
+
greyed out. <strong>Ctrl / Cmd + click</strong> adds or removes further bins, so several can be shown
|
|
152
|
+
together. Clicking the only bin shown again clears the filter
|
|
148
153
|
(see <a href="#3-toolbar-controls" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'3-toolbar-controls\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Highlight bin</a>).</p>
|
|
149
154
|
<h3 id="15-wafers-and-dies-with-no-position-data">1.5 Wafers and dies with no position data</h3>
|
|
150
155
|
<p>Not every die necessarily has a reported grid position \u2014 some data sources supply bin or test
|
|
@@ -261,7 +266,7 @@ appears in a <strong>Derived from</strong> column instead.</p>
|
|
|
261
266
|
<p>The toolbar sits at the top-right of the map and is always visible. Controls that
|
|
262
267
|
are not applicable to the current mode are hidden automatically. (Hovering the map
|
|
263
268
|
shows die tooltips \u2014 a separate thing from the toolbar, which is always present.)</p>
|
|
264
|
-
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA94AAAA+CAIAAABSo1RjAAAQAElEQVR4nOydB3wTR9rGR3I3bmCKKcbGYAwYDAYceovpHVNDCSXUEAJcyOVS7ktyd7nk0gslhCTUEHrvvfdebMDg3ntvkqXv2R17o0iysKy2IvM//bi1tFJGq9mZ5y3zjm1WXhEhRMlTXq6Ql9NDoiQMBoPBYDAYDAbD+EjwkBCpRGJjgwf+nwPP2yorKZMpyhVMkDMYDAaDwWAwGKZFyXnGiUKplCuUtgqlnW2FOq+Q5qVlCryG85wd7fBwwOtSCWEwGJagXEFK5bhduQNLmcu4/22kRColDjbcAYPBYDAYDCMC5V0qkxeVyPCQlysVynIHOxs8L0nPzpfJuTwWaPG67s4O9raEwWBYjmIZp8tFhYMtcbIjDAaDwWAwjE5JmTwztwhK3dZGwvnGyxWcLscLdT1qMV3OYFgQ3Ih5JaLT5QBNyi8h5SzfjcFgMBgMY+NobwvnOA4437lCKS0v556t5WRPvegMBsNSlPFJLOIEurxMfDYDg8FgMBgvAHCOQ4oTTp0rpEKKOWEwGJaD5peLGTSPOc4ZDAaDwTAFzg6cFIcql/LKnDjYsVQWBsOSlJYT8SNy44HBYDAYDCvFjs9eURBSocglrBwLg2FR4DUXPwpraCSDwWAwGFaHDS2NqCTMWc5giAKrkOZW0UgGg8FgMKwXJs0ZDEZ1YanmDAaDwWCYFLaVCIPBYDAYDAaDIQqs2GseGxuLf318fAiDYW2w3svQhPUKc/JiXG32LcQD+xbiwdq/BUtoYTAYDIbVUFJadj8iKjM7z7O2W1Dr5g4OrPIvg8F4oWDSnMFgMBjWQXJa5g+/7k7PzKF/1q/rsWhWmFe9OoRRU4pLSuOT0pVK9YUktd1dcXkJg8EwO0yaMxh/4l5E1I27j+VyeY+QdoEBvsRqWXVShn8XhDKfIuMFISE5/YtVW4uKS3DcoG7t1IzstIyc5b/u/vCt6Xa2bC6rCYdPX9t16FxVrwY09142fyKxZgqKimMTUnPzCvMLivCnm6uzh5uLr7eXk6MDYTD0pKi49MGjKAxEOZU9ytXF2cPdxbthvcCAZs5ORutUbDjTTkZWLm5mJyeH2u4uYr6HWTuNy96jFw+cuEyPr999PGZwz6GhXYkV8tn+sguPuU2MCorJ28MtrM5LSstS0rIaedW1r9zaLDs3H6IKPaFp4/rCaXGJaXDgwVEHdx19pqxMlpSaWbeOu0stJ2JK0BgbG6lnbTfyQoN7MCevAAdQJ+5utYhVEZuY+tWP29BDnJ0cF88e69e04ZOoeCh1CPT7EdEd2/kThp7kFRTp0OXg8bP4i9cf9AhpS3i7aM+RC7j+VZ3csL7n1LEDiDgoLZUdOXPtbvhTBAS0ntDCt3GnoJb9e3UiouEvMgqpkZWTLwTBVMHgX9fTHZ2KiIPI6MSdh84+i0nScY5/syZjh/Vu7tOIGAyT5n+A/nHs7I3I6ITElAzV5zGH4TZ+qUNrkYz+rJ0m4pffD125FY4DJ0d7hUJZWibbfeRCclrWa68MJVbF8mMVuhycfSR3ticLB1pMnR89e33HgbM4CGrtt2hWGOEC6GXvfrqmnK+RPmPCYDrxn718d9Ou4zjA5PTNRwup/bZy/d6HT2Jw0K5Vs5kTh8A/QUwANMfHX6/HwSfvzH7BIviPnsbdj4iKjEnMzsmnopxmLdAt5iDQa3u4YjrBTwP/KBEBsOIePIqGJY/fuqVfk3qeFT9HTHzKl6u3Qm+hY7w1bwK16Fr6ebu5OENfpqRnEYb+oFfQg2njBiIKofbqmt8O5OYXwvKhfx46eeVu+DMdn/YkKgFhxuC2lh/VEfbcsvcUGi88g35CDX44BfJ4Z+fTmEQ8IN9HDezRq0sQsTQv8CikA1h673yyWvtrSm6w+vyDeXU8XIlFKSwqQXei2kA3UDufLd+MGW3iyH4GuiCNKc1xZ+LWjUtMVajsGSiVSps2btC+TXOMs0TE7D9+ad+xS1pfgqvp5r0neEAfTBs3CH5fYjlYO00BQuQ//LobIzWOMbvMmTwcw8Ivmw89eByNGzIzO++NmWOMGKsyKT8cKzt6j9Pl3MimlEgk5PA9uYIoFw20J2bnzOU7VJeTP9VE/+NQLi/X9j6J2v/ffxT9+56Tc6eOICYAHn16EJ+U9mJMilFxyWcu3b794CmUrsaLf4hziHU8ouOSj5297uhgD1O5X49g3yZexEJAf/+4cR9uN+GZ8SP6DuzdGV/n65+2QZc7ONgJupzwfnQqszRlJUMvfJo08GncQO1JOxrjqsxBnzymv4+3F36Fqj6kYQNPi+tyuFrXbTuCgCf9s11rvy7BrTu0aaG6VhiuAXjTr9wMh9mPyWjDjmN3wp/NnDDY1KE53bx4o1CNUSqV3P70mLuUJD0rx7LSHMPRN2u2p6ZXGKjoSCHtWwUHtqhftzY19rJy89Izcm49iESvQ/fDMwg0YVBdMmecEP6tAUaT5tduR6zZfFDrS/DcYOifM3nYS8GtifgoKi5duX4PInf0TzdXZ0xOvt5eGKrSMnNiE1IxYVCvDPTBv7/dsHDGaKMELFg7LdtOgfTMXEz8cNThGO6TV8cNpM8jaI5R+/zVezCF0c6/zZ1Qz9OdiJsVx2VUl3t7SuIyOQGGg/hMJZ60lcoW9De375zq8sCWvqG9Ogl+WbgTPn13jlpCS59u7X28G2Dix7SEqAV98vVXRz2OSsDogTEEA5+JpPmLBGTHum2Hb92PFJ5xd60V0qGVB59I5uRgv+fYBXSL0QN7FJeWwWWVlZ0HIxn+RYj4Szce4hHSPmD6hMEO9ubuKogXf7tme5lMjmOv+nWoUtm+/wxGjDsPn2LOs7e3wz0IEUnPh5fx69XbCb8SFAqMiAl046exibmq2ahuLhjlrLqYDJTroD4hRMRARf3w6y4apO3cPmDUoB5a1wdjeOnasQ0emIb2HL5w8/6Te+HP/vvDprfmTbSKZJIT52/CDTostKtwL1gvGJT+9/481YSWtIzsbftPl5TKeJNQ6eRgSY8YBplvftqeV7lKYejLXXt3DVJb1tKwviceQW2aw3aFWkBwCecnpWZ+8t2mv80d38irLqkRxpHmz2KSqC7HkNqpXUt4yoWX4EHH0I97ACd41nG3rAjTpKCw+NPlv0El4LiWsyMu7ksdWmmehnni162HYQlhqEXAAqKtbUAzYkZYO00EBMHytbtgTuAYQSi11EPI9EYNPLfuOw3h/p/vNiyePc6vaUMiVhKylIfvcsrG30s6s7fde9u4L7Ug1H7tWVlkquLgHfmYzrZeHhJiLhAKL+W9CIP6hrT2/1N9WbgTND0Kmv5aqDGEVqQSCaQ54XMxWckIHSD488WqrZhOSKV3p3vntv7NGquec/TsdUjzEJW78pXRoZjp4Vu5ducRxDpMoJT07LcXTBIMJDOAfrJy3R6qy1+fPgrOV9xxkFmY4dAwes4SPr+cHqvknTssnDFGWMNgccKfxJ67ehdTntZXOwW17N21fRt/Vrfe+MAohYeFTj2jB/ccVo01QhDu818deeDE5b1HL8JBAxH2/uJp5uz2NQCCdd+xi/iysPemNRFLZr8hwCku+MURMdi2/wx0uaODHb4j7ze32A7UcFjAX051eVBrPziGdDssMAqF9uyIIXf1xn1cQCa/8Ouftv9zyas1W9Vjs3TZP/B/7i6OpKZgDF2+djdGSbhnPl42ExoL7jHh0apF0x6d28LDj8EX82uHwBbOTjX/b6mSm8u5OT08aj5VYyb48setGP1xDI/+0jnj4NzVeiYcBvCn4qaFA7VcoUCkuH2b5m6uZlpHxdppIqBFMP3L5OW4qSAIunUO1DzHz6eRb5MG8NthvLhw7X6ThvUQtyUGo9l7S+TEQNycJE9SFN51pO+NdiiRKan7fHiw7cjOdjHpiqZ1pUM7GEHBOFbb8efi7ITft24d95EDexADgBynnzOgt0nWbKHHUi0FT1ujBpZcdWTgmLZx5/FwPjUfd9+bs8IQytf0Ap67eg/SHL4f1Se5AuFtmiOygcEcTse8/MKComLcksRcIJJ2+tJtTMLtW/uNGtQTz2Ca6BwUgBkOUyMstCWzxwlRF5z89Wro8jIMIMvmT8ItSWqE4TOIKrCIfvrtAHReMj8AEt5Z3rBeHfjLFUoljXTjpSs3w5/GJPo08TLWwglDvgX8+nx/IDAY0E61V09euAWfBUy71qa3JQz/LTCSI8CCg0mjXoYvoPpvbOnnDS/Sg8fRhUUlsYkp3ToFkppiyLeo5igkkZBdh8/joJ6nB24QYgKMe19UH+jyz1duQfgO9/WUsAFQBaSKnlkdDPwWEDMYZKilN7B355mThtja2FTnjXa2Nl07tYGXBJ5HiN7HUfH4CkQf8go5n1pNpmp04ht3H2MQp5VQo+KSacIobgmtVgX8N/BHYtjCWz76ah2NwsAegqmEu6LnS+2IhUDoIS4xDQe4G2dNGvLc8wf07uxV3/P7X3ZinF29cf+//z6LmAXWTlOw79il/ce5bHg3F+elc8frmOChWt5dNIUGtlZt2Is46fD+3Ygo+ShMS/jPxYF8NNYyYcG35k0gxsBYn2MgGHB3HDyHGdS1llP3zoGiqt6DueTyzYcYkpv7NoR3+UZluq0acjlMQAlUl9ZX8caMrJxnMcmIzGI8N5s3uoVv4zrurlm5+fcionCFxw3rTXhpi/sOMxysMsHG+HPe+UTVCj8WRLWyU2CAb9eObWDYqK4Dg+sK5v3lm+ERkbF4fPjlWjEPI1VBayhV9apqbSUzg/6Mq4qDoS93geeS6AnekpNXcOT0NQQ9zly+07dbB8IwL7C3v1q9DbocGvKt+RMt5yuv4MDxS1TM4F4eP6Kv6ksyuRxd5drtRzQvtwlXNtF33LA+qudg8MwvLEbED+YiBgfc7ERP9B55dx46h2ZpPj9hRF9Ye1W9C/FT6HJYezAjEDwVnsdQBaE/f9pIYnZgIh8/f5PwuZgI6VbzXQiv9wjhggD4VeBz1ZqtYVx0t7OgsPjq7YiWfk28G9UXczurwvztpMBQvH7nEeHvqzdfG/vcpag47YMlr0KdJ6dl4k6Dh2PulOGE8VcCHhTEN+maBGj03Ucu3A1/BqPO0UEUEfDsXFptQ5mZlXf64u2qT+QWWVV5goSrkcKFkYkkN69AKJBiasIjY7P49sO0OHrmmoO97YgB3QkfI1YtHfMsJgk/ASYRPK+ad25Zft588CqfdYNg4KxJQzGmaZ4DmQ6HBR637kdu2HEUoyWGEfSlGRMGEytBqKFUFaq1lcwJ+gO1ixCiHzOkF6kRY4f2Ru9CdG7/sUv4mcy/1uKvDFd/6cet+B1x2f82b4JP4wY0AGIpYKdRMdPIq65afTaM/DAhqGqnIFyGB0JhS2ePV11MMmfysLiEVAibo2eu9+3ewV3PpAD9pHlsYirV5bgH4Ofgqj/wwdDW/k0Rt9P93iEvd4FAf/wsni7Ax/yA2wB/wgWFOI1b7wAAEABJREFUW6K5r7lz0C/eeECDjHOmDBfSyxC/W7Fut2dtd8HpC7tnz9GLGECFCjPQnTAnEAo8c+m2GaSk1nYKwLkFg6dZ04bvLZqi9pKo2qkDM7cTfL7y98horhhL24BmC14daV+9URjy/f03p67auPfh4xjIegiXtxdMIpYmLV9Z37Um6ePp+cp6ribPO6d60XBfmrE+p8Zg2vjulx1Ul9PNbgjvwV2+drdI9mRBq2xtbeDRcXZ21CH4Nu08Btlddf1p5dotR3JJIW4Ks+lyGDkIuBE+6xRTSmZ2PiJaJaWy8cP/5IjCT/D9r7vwL77mkjnjRbLqY8W6PXCHEz7gsOi1MBfnP1X5QIfBLKmaVtSxnb9/s8bf/bwTkylcEphxXp8+ilgIoSbJuq1HNCtQ0d6uZ56h+ZayCFy5FQ4XFQ7Cqq3LcZvARoIQ7BDYQngSsZpPl29GaBTDuwWD+TWD/liILxFrQ9DlnL09b4IY7mtYoTQTZLSGt3vL3lOCLm/UwLNcoaDFWyBiD566otYDRw7q8dOm/ehs0Gn6hsj0k+ZC2Y2axZfRb1S7DpTcwve/w0F0fLL5pfkdPpPJu1E9Va/Mz78f5J36CWOG9KQ6AMZTembOqvV7/+9v06lvFfdzn67tMXlA3mFEMHXFJa3tFCjiw4sFhUWaL4mqnTowczt/+f0Q1eX9uneYPKa/Xu+FTbxk9ji4jnDrop+s3Xp45sTn5+2YjgO35T+elA1oZ7N4kH6O228Ol518WD4/1G54sAkzFmj9cu4/Z5gvzVifYwjoNhV5h31CIBmfxSatXLcHsziGxKNnr4ukcsXIAd1hqCenZq757cDk0aFa65bwa/QlWue/63cf7zhwNiuHc52MGtidmBiM/+ev3T9+7gZ11iDu9+ZrYRCyX6zagtnu2NnrdrY2owf3FM5PSEqn+4DCqam2ttVS/LrlMNXl8FW9MXOMqqv18OlrZy7doRcTs16/HsEDe3emL7m6OL/9+qTvft6Bgej2g0iMJ1PDLLOeDzYD/IJJKRl06bBWBPEq1FCq6kzV2krmhKZo+zbxavY8VQch9fhp/NXb4dDliA69+8Zk1Vf9fBph/opPSscHWpc0j09K+9c3G3Dw77dnedWvQ6wH1TiYeOxtGgRzc3FWKwaam194+SZX3Ryt/fvrr9CoHVx13/68Awcnz99Uk+Yh7QM27TyOUQs9yrTSnJaC0l1CDj0e7aAiHt70ju1aVhUbgmMGYxasvTyVrQHMBnz2+LepSjFXxB3uR0QRPutf8M9NHNnvfyt+Lygqxkz8/uKp9EnhXQi7mHovd812Vh/WTjXKZHK6ccCA3p0n/DmBrPpgHrW1sTl54dalGw/hfbTUDuH7b8lXn+KmSe2VwXUi5zcegKxXKsmIjqZqf2pGFt1XCKLWkNwDY31OjcGwAAlFeMuTunKb+zRaOnc8fGzQl5CzAX7eVa14NieITMrLy2HlYlCFgxkDdZuWvoEtfdv4+1ZVtg9KKzwy5uGTGEww1PEGxgzuOdBkxgYMret3Iu4/isZ/USavWPuMgOrMiYPprYRgFIZcOEQOnryi5BtDz4H7hot0J6bCBYUp3OLiCcbD5ZsPCb+bvZqv6j/fbkQ7hT9xYbfvPwNfLMJu9BnMieg/367ZAQsfdr5XvTqW2pbyvTemoANAmis1snvhikL/UXX5W7DmfVVA99As884ddK2JhC199VY4jE/qXyd8LbxmTdUdgp3bt4I0RxQXMkYkiWrVIaWy6jZ+RyuS5mjtl6u3Uv/0ollhqva2UImrvqe5tyxITMmgxRw1i31LiAS9An0DoX5hJoJigfnKFXiVyRHdVQvtdgludfrSHXxTBFr12n7ByLMyjNHfdh/Py69w4mLk2nnwHOSLathIDBQWldADIUUbt+6Og1wNZoz+qln/LXwbjx3ae+ehczEJKZiDx/ETs7D2qDK/03ztJHx+OS4sZjgcP+UdwIVFpXR/H6lU0r5Nc+Fk8bRTDUu1MzmtonhCF8NK7OPtdCFdSlo25BoxOwfvVOjyoKbSGuwlBC97dmHpvTgFPgRe1GEdLGNdWAvCCr/ZrwwTnmzSsN7cKcOXr92N41Ub9n34t+li2JRqxIDuEOKI/kEOpmfmQvbhQXghUsfdrbaHaxa/AeTK9Xuzc/LhFRHGako9T495U0eYzv6Bg/yT7zdRFw8Fns4R/bupOvjdXWv9443JX6zckpKedQjqXKkUfFGYv/+3cjO+F8LKGEBMtDtsdcD8vZ2v2Y8rppaRgqGY6nLYG3Tiu3Wf22ENgXt0JMF5Bjtk4YzRuBowOLfuOw2/e41LzRgCbDa4BsWwhWfNiI5LoQch7atMhvz46/WaYYGuHQMlGtk3XTu23s3XP8GPhV+EMEzJvfBnVJfDTFW72ny987k2Njbmj8NExSbRA80COBhFP142A+OPWmqAkPQFtVP7z47rzu0DIM0JHx+wmDSHublqw17Cp4TSofZ+xLPs3IIV6/Zg3rLIuFMVdM9qwrvB6AEGR3rwxqwxaicP7vfS3fBnT2MSEbkO7dUJvgR8QXSd4pJS4XPM1k5SmV+ueho8B7TYCLgXESXknYutnapYpJ1/rPvWlhKJBqAPK1XcRwiv4xtpJlEIlfsVSgUxO+vPybZf49yNfvWlY1+ye5SspQ0JWQr6NSJTFcXaQtB4Y36pLCpVsfKELD1fOaOX8Zc9wcc2Z8pwXEMDpZ6xPqdmPHoaFxWXTHgnitr+EVCHdBFzVk7ev75ZDwUZ1Ka5BZ1tkN1QG/Auf7xs5rXbEfD0h0fG0skPEhwP+Bdo96ZBAAFbW5s2/j7QZ106toZkpJ9jisz+a3ceUV1OS+sGBjTTGsJGKPmdha98tmJzanr24VNXETOhwQp3t1pzp4yAnEUEHK5NQ+rcGcjaLYcJf93efC1MrRzwyQvcAjKEXgUXz0sdWm3ec/L0xdunLt5WjWvjjYtmhv3zi19xvG7bkQ8WTyMMPaHeHFzJqvaMRABfa7pOp3ZarJE6Hm6wVRBKgm4hDBPTt3uwQqls3cJHaz7zc5cvmgjhp9fqdEOr1BqWkpZ17spdeqxZ9VLwP+rrdjSmNKfLt+HeXzJ7HH1GJu/3/S+7MLdt3n3i76+/QkSDvV2FEMmtdBrBOx7NT8AQlLQ4gAC3gWUCZ5ojQCyU8qA1pEydzKDZTsL7mQSjDQYcZIGdna0ww+GLqH6CSNqpiUXaqYPDp6/tOnRO60sTRvQdUJknanFWHC87fJdPYVESCOsPd1RZy4xaHyuPy3R8Gj1nx1V5mUwy92XjX3xjres1W+keTfYdu0gPRmhLFpw8pj88wRji8O+azQeh3T9+awaxBLiD3vlkNQ6+//ciGJM9X2qHB2Ks4U9iMIIVFpeUlJQhFFtaykWxHBzs4Y6CFQFNA4NHNaqp9jnEqAhbzikUCrVhVg2XWk6YMr5YtQUz37Gz122kkrChXEVFX28vz9puuNrZOaaNsOng8s1w6hcfP7yv2n6TsGro/mVBf64KDysO0hxmCQwk+N6E573q15k4sh8cQ/iNYE1ZZMNsOC/xdbQmtHRs17KWs3H2ITER1JvjWPU2q9f4SlxqaM1moTja20Oa5+RarHf9dUCYUYT1QwUN/dz6EAVFxQdPXDnB13Ih/FbimucIQ6i+45XRJmN48mkgILTnHzlzUFqhPTti3oqMTsQkIZ4929wqI6HxSWkhfM1HyK/I6ASEsRCOhINfCPBhMP3h113wPDnY2y1+rcLkECr7mHqXHM12En7JkRD9obUsPdxqaS0TIZ526sZs7ayKvIKiqnQ52Lb/DJyjxtoqy1gojVoNQa6wdCFZUULHLsJXt9WaxIkxDX7TPUcuHuN22bQkQuYYhOPLPYLpMZoH2a1XPiGCAPSgpFRmdGne0q/JyIHd6Zrv73/d9easMB0nY1T5+4JJn/PqHL7znLzCWZOGwN9Pl43WeAdsw5FKK+48zYJoksokCdgeWt+r1JDA7hYa9Cjf/7Lz/qPoql7ddej8R2/NELYzFG1dc3m59gU3uNh3HkZqPt8h0F9SxeipoBvEK9l4+BdF+OnLymQ61HlKetYXK7fkVebmNW1cX620OYXuh034JchEH4ymlYX0QbV4rpB/mZtXqHv9qDlB0AqNgcs5TmWxzuLXxv7rmw2wmX75/dBX//c6XTj1264Tufwq1blTRzSoV5EqJCzxMfWGF1rbWX1YO6uJYNFOGzdQNSEMt9+mnVwsCGpAJNJ84QD7WvayHdflmFr86kun97az07ZJWUKWYgXvL184wK5JHanmCbJysu48l9CC4/FdbE2R0EIqXVaG+7yN9Tn6IuS56djQFA6I8cP7jBrUIyklw4JrsBDQ93BzoTunBLb0FQYrvUCHP3LmGv205xb7rxlwlkfFJj94HH0/ImreO18FBjRDa1v7+2jdAdFVUOepWZdvPkxNz0pIySB8zRNTr2vXQZfg1nCBP4tN2rjzWEALb9WCibhocDMXFpXci4hS3UTzbvgzwhsbart2w/G2kStnycUYze8yx4hNdTm8UZorJZ5EJaB51+8+oktUxVnXnBo2aksmBJ5ExWt9ScdIQpWMu5tJOr++RMUl43aGQWupVcLGBaYdHKDdOwdaqtBWdRD8jLn5RTokK9y4VJdjjBrUN6SqIl3QvRUfa9K65jqAxYwpSiaXxyakqK60pas0+Cq54qq4GdS6+ckLtx4+jklKzaSzAkKoi2aFfbb8N5hN3K5UvDSnToKxQ3sHqSxUoht2YJBtbHrPjWY7qw9rp74guO+jUmRGsDMVYnKizOhjV89dsuqELCpNsfOa7KMwB3uN+9jJrsKn7t9A6u+lLs3L5OSjXaXRqQqcs6C/nYmWgcLZuea3A4Qv+WxIwV1jfY6+HDx5hWapDuwT8tzhC/5pixdpmTp2wPK1u+Fc+ODzX4b0e6l/785u1V4oiWkG2ncHv7SR8DYqMRnzp41c8tEKuVyuUCjvh0fRulhUbQe18kOoTdVZhZnvjemjP+ATsmnSP3jtlaEWTH4DMyYO/ufnv0KC//DLrmULJqo2BoFihAUQ5oZPB9HX8vLyOw+f0gJ/ahtVwi2Ht9Nwh9rOJuaBFqMk/Nfx0Siu9e6na/Svn2buuuaC4klMydCcPq7xVfDUgB1SVaYlor70QM2CshRnLt1BmOjxs3j0HInEAjXja0BVK1WEIoNwJA99uQsRKyo9Kl3HsB8c6A9bumWzJn26tdfxafHJFT3Kw1LSHAS38+c26DlyoWnjBnSDHoSD9/HLEzu1a0lERu+u7WmRjZ83H/i/pdPpk96N6v1z6as2UhvhzlwwfRRuV/9mTYQ3HjhxmU7YL3cPJqZHazsF4HCKjktWy9sm4munDszczhcDiGkYCz+elN2LU/xwrOytofotPfzuaBneiIP5oXamK89SUlaRYgEFY4ikNtbn6AXcuhjKCC8Za7DNskVo36b5zIlD1kA2A8cAABAASURBVG7lVigePn0ND+9G9dv4+3Al8Oq4adYHSM3IzsjMDY+MDX8So7pUbt7UEW0DmhGTAa/He4smf7Z8c5lMDi2nJEoJkUAFCvVkoM7RACh1Wjzg5v0n9I0408HeftHMMVpHPHPiVa/O5NGhm/echLWwYt0eYXkV4cMCt+5H4npev/Poukqis28Tr6GhXVU/5Ie1u6mxMW3sAL2qN1gEcdY1F5aGR0TGqklzLpsl/KnwJ1xvIe0DunRsIyx40CScr8NI+CUNRASUybirDQvKWnR5VStV8OtQXQ6ru2M7UZcDEnoUOoOOVEAMYnMmD3veh5GIyh6lbw0DY87KE0f2uxf+DP7mL1ZtQWC3vFxBy0Pilpgwsi8RGfDsdm4fcOPu4/ik9MOnrg6pNOPUlvXAb6qqy+k+7YTL7rcPNUuMqap2UqrK5xZbO6vC/O18YaC7BUGda01o0Y0t/xZTbzkEtYEYN+HmbINkh7E+p/qs3370wrX7hB9/F84YLZ5FMs8FweKmjevvOnSOJirArYDH0co8eBdnJ2h0KNyM7Fyh4Kkq7Vo1Gz+ib8P6+kW9agBshiVzxn++8nfCF2jq3TUoKiYZ3kFa6Rw+HTx2HDyLuQMqnG7r0yW4Ta8u7WApqVbatiD9egTHJaWhn8AdiC+yePY4YQePf7wxecOOY6ouW/wuqjuwwnH4zZrtz2K41Vn9e3WCX4NYAyKsa+7h5oIOH5eYBg2klvVBs1kwg0MLovMEtPC2kUp1f1rEE05IITqntqsro5rQfdm4g8wcIQ5DF5YQvpz/svkT1SSW2IDegxpBLIt2BgOh0ryWs6Ofj367ahpzykHw9L03p6xcvxcBaDzokw3q1X5j5hhxdvRJo15+Gp2Yk1ew6/B5hE2fu4cFJrmvVm+nx7NfGeZgb5L0XE1q0E54pJT8QkHWzhcYCOsuLWzquertUFk62H5qD2UN3qgX8Jp8+u4c/sAgX5qxPqf60Mxg6PI3Z40VVdVX3UALwrsW0qHVm6+NhRMazmZEw6n+oxQUFeOh+UbI3w5tW3QOCqCqV/gcYkr8mzXGiLFl76mc3AKo238s5LZmhJyKiIzDfPaMLypQUFjMbTMsIXa2NlPCQsWWojp9/CCuhQ+fQnx8uWrrotfCaAYRhjJ41KaMCc3IyoO7E+aEasuhF7//ZSddYAPVCJcWYRgAXJuQ5vciotIzc1UzEOBsxg9E64FW53NS0rMePokhfPSJMIwEbo1v12yXy8thI701b4JIwhG6QY+6fDMc/QEDkeqKEVXgRNi4g1t6MW1cldsOYlijtkoN9g0wsjcI7pYPFk9DeBQTAwZ3mj5o2aRAHbi71nrztbBPf9iMqww/2Y17jxEOrmq9/IETl6l/l3DlbG1rm7Hopr7t3HOEayeuv1QqNWcgzFra+SJRY3ltal1OMVbFBjNXfhg/vA+MzJGDeli2eoZeZOcWrNl8kPC7ZtbxcMPYO6gPtzgJ2hE2cFFJqVrxRMyUjo72zo4OTRs3UC2Qh6Gbfk5LP29TZ9yG9uwYm5B6+eZD2A8YMSCk8B/FY9SgHvArP3kWv/PQuUR+3WdQaz9xLh1DUGXTruNnL9+NSUh5/7Ofh4V2HdzvJfqSs5Nj08bqa8cPnbxy6NRVWrehV5egV02Z0/8XoXeX9kdOXyuTyTfsOKq6Lau+emjd1iOEN8itJYghfqLikqHL8dNgtPn765NUdyQUM/17dYY0xwFiX9QrpAlCfHQz4B4hbbUuXcC3Xr/9CD2uQfFl44tmOAysaGsx9BX0GERb8guKOM/Nf39q3aJp+8AWwYH+bq7OtCownCL3I6KEKjn29rZlZfIvf9z69oKJZvOo6dVOXuUq7ezsZDL5yg17l84ZT1P/WTsZjOrQrVOgBbezqRlCpZ5TF2+rlvFyqeVUleNHK6f4NdnEXDGKWZOGwDsVHZd84dr9po3q96ss+4h5BPM61eVwYs1/dRQRK1PDBtT39Nh+4CwsH9gSUN5ocOf2ATQyTvgE3CdRCTfuPkY0Rig+CGe5dZXd0LG7M8Wrfh2L7D8AA3LkwB47Dp599DROdb9Vvdh37BIN1Iwe1BO3DBEHnYICMGOqLfzoFNQSkaWOKuv3Avy8abwLZi0RDbh/v169zep0OeErxdG95KifQmtOedNGDeg1ryr97+fNB+nuRbD09C2MQfSV5tSHhLARQkWG15IrKi7FN8dBLYveCYiwfLh0+sadx+7y28befxSNx6adxxt51U3iJwYB/BKvjhtUx8P1fyt/xzj1xSqzqnN92+nq4gT7ARcZwVMEuM2meq2lnS8kH+3iJv5lw/7kXywoJV8eLIUd9GGYuf2OcIUiHmK4a9BYn/MC4+Ls1NynEeTF6Yu3MVtgaiH6c/bK3TP8ttKQlfbmSjBbNHPMx1+vz80v3LznZMMGnnTxzI4DZ2mKPL7U3KnDibgZ2CekZXPvbfvOREYnQHxDwlKPGr/mqhwzpurJGOImjnzZUoVi/0Rl5AyxixINzQ2PCX9OxUm6d3emmLmGksCgviEPHkdDmiOybSOVDtGzAAic7nQ77cCWvqKyl0LaBwj7hAjMnzZS7Rm4vT57by4RE8lpmZt2HEd0yNnJYdn8iVakyym4Q6Nik/Etrt2OcHNx1sw6033Nt+w9RXdcbuxVd0LlrsB6oZ80F/z2GEm7dmxjY6P/ArRKMGBduRVOjy2+LABm9xszx8Qlpp04f+Pm/cgyPtqoqiPxxXuEtOvWqQ39853XX/l0+WbYJ2ZW5/q2E7eEoHrfXjDJbPuci7adQjFErtqoATUehA3DRJUfn5yjvBHF1V355/bSmb0rGlZcxv0ZmcI9n5qrbOBuvsQhKBK6mLJTu5aGVKG+FxFFP2dIv5fqeXoQRhW8On7Qf3/YVFoqW7ftyLmr917uEdyulZ9mvWpNCotKoGyOn71BE6Dh650+fhAxF64uzrDJ//3tBhyvWLfng8XTdh85T6sNYmhdMmecaFMiVfFt4gXX4MMnMZdvPLxauQBUWHNF6RLculvnQOg/Ig48K9MyN+44VtU59SvvON27OxO+rrlFdDnl9emjP/luY2pGNuyH+KS0uVNHVPONP23af/3uY8LbUfM0VC+jBiiJ8redFbocYqmRpWsi1wCMgUvnjvvPdxvz8otOnL+Zmp41b+pIB4fnT/cIK63euI8uWoCmV10drheSuBQuS927QXXvKISNjp4x5r53cPV/vGwm0Z/YWG7pq4+PHrHa6iCTy5/FJGVm5+XmFTg5OdZ2d8GQpJlympCcDl1OowfmVOf6thODFFW9aOff5o43mzoXbTvfeP87DBkYhUcN7OFaWfU5NT2bbvyhtuWQ1ufh3tt39CLmAByv+WIZqRGavTenmBjOyhOyQ3c4X5e3pzQuk5PjTT2l8fzB8GDb+aFGMCQ89AlxCVd7zOBebVs1E0qdwLZJy8hx4hKd//Cm0L0GVfcUhFEHXb7nyAUDr7Zubtx9vHrTfsLtK9Td8IiwISVEDB/T4pPSYd/S3cspkIyt/ZsiRo+r7ejo4OLsqOS1eElJKa52fmFxRGSssB0v4TYbclsyZ6wZirSoATn7M5/jLuDfrPGiWWGmSzE30QwCYB0hfIFfIS+/ENEejDMebi5w/1dnatcXA7+FIEy1gm7z33/MNkOWv1F+C8wyy9fupmVAG9SrPTVsgO7tqMMjY3/bdZwu1Kvn6Q4PUR3DlpAZ8i1ejFEoJiHlP99u5AMtEkcHu0mjQlWtNXPuF2uUHoW+9M1P22kyM/rG1LD+7VT2t9HkzsOnm3efpJ476PK35k2ogVkSn8oF2fSW5oSv+ItulJGVa8hmthiw6ni4NvNu2LVTYM2SGk03sFYTXp1vgZrEb/Cfd2abv6RrNYHi+Wo1p3r5cXbOX7ydZy7f+W3XCWIMEGqsvm9GDRNJc7DimOzwPT4STe9O3ks+JMh24UDjyAK9pLnq1Q5q7beI35gdfoWlHy0vL+cMhhkTBtPUC2GvQdU9Bb9ds4O6H4hhV1s3wqRoLD55ZzYmIaI/RhnTYAyfunAbnh5VgV4dYDaH9uoEX7ulvNTwdx4+dZUeh3RoNXeKafNYLD6DGAXDv0VkdIJCoX0qh8tJdYmw6TDWbwFjfr1K2crW/j4w8Jr7NIY/qDLvvywqLikqNulJVMKjp3H0tKA2zWeMH+Ra7f25qsIo0txYWGQUevw0/osft0Dd8dpQqVndQa3euekwVo/Kysn/+qdtcNLRP1v6NQlo3rS5byNEnGp7uGKSzcrNy8rOfxqTiO6Ef+lpXvXqLJ07HhKX6A+V5jUZgtsGNDPphhTWAoattxdM+mbNdr7/iWi3SDXgmIQ/ACrHxsZGzHVQzNPOvt06uDg7QQTQovs1BtbzpNGhRHxAgiuI8ui9ciGRdFCQjbF0ub5UcbX/uFnk8nJt75Oo/b9Jr3YN1uiIGQhrbuPoviHwYN1+8PTOg8ik1Ewd58Ov0yGwRXDbFhavWh02pBemNDh9Gjbw1EyxZZgI1Y07rB17vmwl+vOWPSfh7ERESNjzBbE7OBMFjUVxc3VG+FQMJVlejFGorqe7hEi4gsgS/n9asLJSbJDX7y2aeuDE5ePnbhCuumsCHjrOt7W16dc9eMSAbgZaIDXxmosEkfg8EBSWSqXir8lNV9aL1mUuYLZ2IvQv7FNNuI3KC22kNpouIs3n7Wxt6tetbeAqftN5zSmf7C29HMm5pbv727w3ypgX06NG3zsxJaOep4fuhBZIydJSmVpCC2QlQqKmrpmQnpmblZNHjAEi4zUOi5tuTCtAX68onsgt/HBwsKPFE//KW6swr7l4MPq3QD8/du46TNP4pDStJ7TwbdwpqKVxF30a+C1ejFEoKSUjMydf6zZtsI7MVo7W6D0qN6/w1MVb9yKiVDdOVgW+WtiE/XoEuxkWfql5QotIeDGGJMZfE1NLc/Dd0TKphCwaaGQjx+Ovq+VMDhvTzAkTteLBpEZpbEJqTm5BPleuVwI3uYebi6+3lynSKthvIR5M9y3QkZ7GJEKgw7snlUoae9WFKIelZ3hCFKXmCS0MBkP8LB4k9ggJg8FgmBTEhcRTEofxAgAJHtzW39S790gJg8FgMBgMBoPBEAFMmjMYDAaDwWAwGKLAinPNGYwXCaPnmpsIlmvOYDAYDIYpoLnmzGvOYDAYDAaDwWCIAibNGQxRYBXlXq2sJi2DwWAwGNYGk+YMhiiwsYZ70SoayWAwGAyG9SKlO/NVtU8vg8EwD0yaMxgMBoPxl6VSiisrZtoy7dtlMxgMM+FgDXsMWEUjGQwGg8GwOspkvBSXEKlUwon0gqIywmAwLIdUQhztiJhxsuMayWAwGAwGw+jkF5XiX4lSKaVu8+JSWWmZnDAYDMvhaEtsxKp90TDmMmcwGAwGwxQUl8pLyuQSLnFUwv1PQhR4NiO3qISpcwbDorg6ilEBo0loGIPBYDAYDKMD+Z2VV4ST4LPeAAAA4ElEQVQDiUQBUS5JychRKBRyhYQWRnN2tHN2tHews5Gy0DWDYSHKFaS0nCgU3IGlFmjztjuXwQJdzlZ/MhgMBoNhXMoVyjKZvKhEhgf/hNJWqpRKpbYSHhuJolyJuViqcgaDwWAwGAwGg8EwLRKikEqUEi6VRVIhzSHSuaotSih46iyXss1FGAwGg8FgMBgMk8BXL+eyVjhRTiDFqSa3pbpcoVDgX6VSKVFSypV8eUUcEQaDwWAwGAwGg2EMoL3pv2pQdW5LX6a6XA3hI5hAZzAYDAaDwWAwDIGqbuFYK/8PAAD//+6Af10AAAAGSURBVAMA6Bzq9zfdJHQAAAAASUVORK5CYII=" alt="Single-map toolbar"></p>
|
|
269
|
+
<p><img src="data:image/png;base64,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" alt="Single-map toolbar"></p>
|
|
265
270
|
<h3 id="single-map">Single map</h3>
|
|
266
271
|
<table>
|
|
267
272
|
<thead>
|
|
@@ -279,7 +284,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
|
|
|
279
284
|
<tr>
|
|
280
285
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yIDEyczMuNi03IDEwLTcgMTAgNyAxMCA3LTMuNiA3LTEwIDctMTAtNy0xMC03eiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMiLz48L3N2Zz4K" width="20" height="20"></td>
|
|
281
286
|
<td>Overlays</td>
|
|
282
|
-
<td>Check-menu of optional display layers: XY axis indicator, ring boundaries, quadrant lines, die coordinate labels, reticle grid (when geometry is configured), Limit pass/fail (Test Value mode with limits), Test pass/fail (Test Value mode, active test is functional or has recorded verdicts), and <strong>Mark failing dies</strong> (bin modes only). <strong>Clear overlays</strong> at the foot turns off everything in the menu at once, and is greyed when nothing is on \u2014 so the menu also answers "is anything active?" without you auditing every row.</td>
|
|
287
|
+
<td>Check-menu of optional display layers: axis labels, XY axis indicator, ring boundaries, quadrant lines, die coordinate labels, reticle grid (when geometry is configured), Limit pass/fail (Test Value mode with limits), Test pass/fail (Test Value mode, active test is functional or has recorded verdicts), and <strong>Mark failing dies</strong> (bin modes only). <strong>Compact layout</strong> and <strong>Layout diagnostics</strong> sit at the top of the menu (see <a href="#compact-layout" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'compact-layout\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Compact layout</a>). <strong>Clear overlays</strong> at the foot turns off everything in the menu at once, and is greyed when nothing is on \u2014 so the menu also answers "is anything active?" without you auditing every row.</td>
|
|
283
288
|
</tr>
|
|
284
289
|
<tr>
|
|
285
290
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Im0xNC42MjIgMTcuODk3LTEwLjY4LTIuOTEzIi8+PHBhdGggZD0iTTE4LjM3NiAyLjYyMmExIDEgMCAxIDEgMy4wMDIgMy4wMDJMMTcuMzYgOS42NDNhLjUuNSAwIDAgMCAwIC43MDdsLjk0NC45NDRhMi40MSAyLjQxIDAgMCAxIDAgMy40MDhsLS45NDQuOTQ0YS41LjUgMCAwIDEtLjcwNyAwTDguMzU0IDcuMzQ4YS41LjUgMCAwIDEgMC0uNzA3bC45NDQtLjk0NGEyLjQxIDIuNDEgMCAwIDEgMy40MDggMGwuOTQ0Ljk0NGEuNS41IDAgMCAwIC43MDcgMHoiLz48cGF0aCBkPSJNOSA4Yy0xLjgwNCAyLjcxLTMuOTcgMy40Ni02LjU4MyAzLjk0OGEuNTA3LjUwNyAwIDAgMC0uMzAyLjgxOWw3LjMyIDguODgzYTEgMSAwIDAgMCAxLjE4NS4yMDRDMTIuNzM1IDIwLjQwNSAxNiAxNi43OTIgMTYgMTUiLz48L3N2Zz4K" width="20" height="20"></td>
|
|
@@ -304,7 +309,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
|
|
|
304
309
|
<tr>
|
|
305
310
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBvbHlnb24gcG9pbnRzPSIxNi4yNCA3Ljc2IDE0LjEyIDE0LjEyIDcuNzYgMTYuMjQgOS44OCA5Ljg4IDE2LjI0IDcuNzYiIGZpbGw9IiMzNzQxNTEiIHN0cm9rZT0ibm9uZSIvPjwvc3ZnPgo=" width="20" height="20"></td>
|
|
306
311
|
<td>Orientation</td>
|
|
307
|
-
<td>Menu of display transforms: <strong>Rotate 90\xB0 clockwise</strong> (applies cumulatively), <strong>Flip horizontal</strong>, <strong>Flip vertical</strong>, and <strong>Reset orientation</strong>. These change only how the wafer is drawn \u2014 die coordinates in tooltips and labels are always the original values, whatever the orientation. Reset is worth knowing about: rotation and mirroring do not combine in the order you applied them, so undoing a few clicks by clicking again does not reliably get you back \u2014 Reset does, and is greyed when you are already there.</td>
|
|
312
|
+
<td>Menu of display transforms: <strong>Rotate 90\xB0 clockwise</strong> (applies cumulatively), <strong>Flip horizontal</strong>, <strong>Flip vertical</strong>, and <strong>Reset orientation</strong>. The first rotate or flip also switches on the XY indicator (see Overlays), which stays on until you switch it off. These change only how the wafer is drawn \u2014 die coordinates in tooltips and labels are always the original values, whatever the orientation. Reset is worth knowing about: rotation and mirroring do not combine in the order you applied them, so undoing a few clicks by clicking again does not reliably get you back \u2014 Reset does, and is greyed when you are already there.</td>
|
|
308
313
|
</tr>
|
|
309
314
|
<tr>
|
|
310
315
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Im0xMyAxMy41IDItMi41LTItMi41Ii8+PHBhdGggZD0ibTIxIDIxLTQuMy00LjMiLz48cGF0aCBkPSJNOSA4LjUgNyAxMWwyIDIuNSIvPjxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiLz48L3N2Zz4K" width="20" height="20"></td>
|
|
@@ -334,7 +339,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
|
|
|
334
339
|
<tr>
|
|
335
340
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik01IDNhMiAyIDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik0xOSAzYTIgMiAwIDAgMSAyIDIiLz48cGF0aCBkPSJNMjEgMTlhMiAyIDAgMCAxLTIgMiIvPjxwYXRoIGQ9Ik01IDIxYTIgMiAwIDAgMS0yLTIiLz48cGF0aCBkPSJNOSAzaDEiLz48cGF0aCBkPSJNOSAyMWgxIi8+PHBhdGggZD0iTTE0IDNoMSIvPjxwYXRoIGQ9Ik0xNCAyMWgxIi8+PHBhdGggZD0iTTMgOXYxIi8+PHBhdGggZD0iTTIxIDl2MSIvPjxwYXRoIGQ9Ik0zIDE0djEiLz48cGF0aCBkPSJNMjEgMTR2MSIvPjwvc3ZnPgo=" width="20" height="20"></td>
|
|
336
341
|
<td>Box select</td>
|
|
337
|
-
<td>Click and drag to select a rectangular group of dies (see <a href="#43-box-select" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'43-box-select\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 4.3</a>).</td>
|
|
342
|
+
<td>Click and drag to select a rectangular group of dies (see <a href="#43-box-select" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'43-box-select\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 4.3</a>). This is the mode a map opens in.</td>
|
|
338
343
|
</tr>
|
|
339
344
|
<tr>
|
|
340
345
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMyAzdjE4aDE4Ii8+PHBhdGggZD0iTTcgMTZjMy0xIDQtOSA3LTlzMyA1IDYgNSIvPjwvc3ZnPgo=" width="20" height="20"></td>
|
|
@@ -349,7 +354,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
|
|
|
349
354
|
<tr>
|
|
350
355
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xNSAzaDZ2NiIvPjxwYXRoIGQ9Ik05IDIxSDN2LTYiLz48cGF0aCBkPSJNMjEgM2wtNyA3Ii8+PHBhdGggZD0iTTMgMjFsNy03Ii8+PC9zdmc+Cg==" width="20" height="20"></td>
|
|
351
356
|
<td>Expand</td>
|
|
352
|
-
<td>Opens the map in an enlarged modal overlay. A maximise button in the modal grows it to fill the window (or press <strong>F</strong>). Press <strong>Esc</strong> or click outside to close. Useful for detailed inspection without changing the main view. Works in the Insights view too, where it opens the whole chart suite in a wide modal \u2014 useful because those charts interact and are best read side by side. Individual charts also have their own expand button.</td>
|
|
357
|
+
<td>Opens the map in an enlarged modal overlay. Opening the Summary panel in it widens the modal by the panel's width, so the map keeps its size. A maximise button in the modal grows it to fill the window (or press <strong>F</strong>). Press <strong>Esc</strong> or click outside to close. Useful for detailed inspection without changing the main view. Works in the Insights view too, where it opens the whole chart suite in a wide modal \u2014 useful because those charts interact and are best read side by side. Individual charts also have their own expand button.</td>
|
|
353
358
|
</tr>
|
|
354
359
|
<tr>
|
|
355
360
|
<td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMy45OTcgNGEyIDIgMCAwIDEgMS43NiAxLjA1bC40ODYuOUEyIDIgMCAwIDAgMTguMDAzIDdIMjBhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjlhMiAyIDAgMCAxIDItMmgxLjk5N2EyIDIgMCAwIDAgMS43NTktMS4wNDhsLjQ4OS0uOTA0QTIgMiAwIDAgMSAxMC4wMDQgNHoiLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEzIiByPSIzIi8+PC9zdmc+Cg==" width="20" height="20"></td>
|
|
@@ -394,6 +399,8 @@ highlighting one bin at a time.</p>
|
|
|
394
399
|
<h3 id="overlays">Overlays</h3>
|
|
395
400
|
<p>Use the <strong>Overlays</strong> menu to toggle optional display layers on and off:</p>
|
|
396
401
|
<ul>
|
|
402
|
+
<li><strong>Axis labels</strong> \u2014 the die coordinates along the bottom and left edges. They appear when you zoom; this row shows
|
|
403
|
+
them all the time, or hides them. <strong>Clear overlays</strong> returns to showing them on zoom</li>
|
|
397
404
|
<li><strong>XY axis indicator</strong> \u2014 shows X and Y axis lines through the wafer centre</li>
|
|
398
405
|
<li><strong>Ring boundaries</strong> \u2014 concentric ring divisions that match the spatial analysis zones</li>
|
|
399
406
|
<li><strong>Quadrant lines</strong> \u2014 divides the wafer into N, S, E, W quadrants</li>
|
|
@@ -403,6 +410,33 @@ highlighting one bin at a time.</p>
|
|
|
403
410
|
<li><strong>Test pass/fail</strong> \u2014 pass/fail colouring for Test Value mode, coloured by the tester's recorded verdict; always on for a functional (no measured value) active test</li>
|
|
404
411
|
</ul>
|
|
405
412
|
<div data-wmap-demo="overlays" class="wmap-demo"></div><p><em>Ring boundaries, quadrant lines, and XY indicator all active.</em></p>
|
|
413
|
+
<h3 id="compact-layout">Compact layout</h3>
|
|
414
|
+
<p>On a multi-project wafer, each reticle holds only a few of your dies, so the map is mostly empty and the dies you care
|
|
415
|
+
about are small. When the occupied columns and rows repeat at a regular pitch, the Overlays menu offers
|
|
416
|
+
<strong>Compact layout</strong>. Switch it on and the empty rows and columns disappear, so your dies are drawn as one grid at a
|
|
417
|
+
much larger size, with each group of dies outlined so you can still see the reticles they came from.</p>
|
|
418
|
+
<ul>
|
|
419
|
+
<li><strong>Nothing is left out.</strong> Only the arrangement changes. Every die is still drawn and counted, so the legend, yield
|
|
420
|
+
and statistics are the same as in the wafer view. A die that has no bin (for example one that carries metadata only)
|
|
421
|
+
keeps its place, shown in the no-data grey.</li>
|
|
422
|
+
<li><strong>Coordinates stay original.</strong> Hovering a die and the axis labels give its real die coordinates, not its position
|
|
423
|
+
in the compact grid.</li>
|
|
424
|
+
<li><strong>Orientation.</strong> The notch marker shows the wafer orientation and follows rotation and flips. The <strong>XY indicator</strong>
|
|
425
|
+
works as it does on the wafer view, drawn in a margin beside the grid.</li>
|
|
426
|
+
<li><strong>No wafer outline.</strong> The wafer circle, ring boundaries, quadrant lines and reticle grid describe the physical
|
|
427
|
+
wafer, which the compact grid no longer follows, so those rows are greyed out while the layout is on.</li>
|
|
428
|
+
<li><strong>Galleries.</strong> All cards share one layout, built from every wafer shown, so wafers can be compared cell for cell.
|
|
429
|
+
Each card is as tall as its map needs, so more of them fit on screen; a quarter turn swaps a card's width and height.</li>
|
|
430
|
+
<li><strong>Axis labels.</strong> With the Axis labels row on, the first column of each group of dies is labelled with its real die
|
|
431
|
+
coordinate, which marks the reticle boundaries; zoom in far enough and every die is labelled.</li>
|
|
432
|
+
<li><strong>When it is offered.</strong> The layout is offered when the occupied columns and rows repeat. If you supply
|
|
433
|
+
<code>reticleConfig</code>, it is offered when they repeat at the reticle width and height or a multiple of it (a product on every second reticle repeats at twice the width). Random missing dies do not repeat, so
|
|
434
|
+
a wafer that merely has holes is not offered it. Developers can switch it on regardless with
|
|
435
|
+
<code>viewOptions: { compact: true }</code>.</li>
|
|
436
|
+
</ul>
|
|
437
|
+
<p><strong>Layout diagnostics</strong> (also in the Overlays menu) shows what the detector saw as counts and scores only: it holds no
|
|
438
|
+
die positions, bins, test values or wafer names. If a layout is not recognised the way you expect, copy the text or save
|
|
439
|
+
it as a file and send it to whoever supports this software.</p>
|
|
406
440
|
<h3 id="keyboard-shortcuts">Keyboard shortcuts</h3>
|
|
407
441
|
<table>
|
|
408
442
|
<thead>
|
|
@@ -555,18 +589,24 @@ outside the test limits, with the remaining tests summarised as "+N more te
|
|
|
555
589
|
<li><strong>Stacked modes</strong> \u2014 the single aggregated value or count at that position</li>
|
|
556
590
|
</ul>
|
|
557
591
|
<h3 id="42-zoom-and-pan">4.2 Zoom and pan</h3>
|
|
558
|
-
<p>Scroll to zoom in and out.
|
|
559
|
-
|
|
592
|
+
<p>Scroll to zoom in and out. To pan, hold <strong>Space</strong> and drag, use the arrow keys,
|
|
593
|
+
or choose Pan mode in the toolbar so that a plain drag pans. The toolbar also
|
|
594
|
+
provides dedicated <strong>Zoom mode</strong> (drag to draw a zoom region), <strong>Zoom in</strong>,
|
|
560
595
|
<strong>Zoom out</strong>, and <strong>Reset zoom</strong> buttons. Tooltips and die selection remain
|
|
561
596
|
accurate at all zoom levels.</p>
|
|
562
597
|
<h3 id="43-box-select">4.3 Box select</h3>
|
|
563
|
-
<p>
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
598
|
+
<p>Click and drag on the map to draw a selection rectangle \u2014 Box select is the mode
|
|
599
|
+
a map opens in. Click a die to select just that die, and click it again to clear
|
|
600
|
+
it. The application may display statistics or details for the selected dies.
|
|
601
|
+
This is useful for comparing a sub-region against the full wafer.</p>
|
|
602
|
+
<p>Selected dies keep their full colour and every other die is faded, with an
|
|
603
|
+
outline round the selection, so it is clear which dies are selected whatever
|
|
604
|
+
their shape \u2014 a block, a ring or scattered dies. A finding highlighted from the
|
|
605
|
+
Summary panel is shown the same way.</p>
|
|
606
|
+
<p>Use <strong>Ctrl / Cmd + click</strong> to add or remove individual dies. Press <strong>Esc</strong>, or
|
|
607
|
+
click outside the wafer, to clear the selection.</p>
|
|
608
|
+
<div data-wmap-demo="box-select" class="wmap-demo"></div><p><em>A block of dies near the centre is shown pre-selected. Drag on the map to make
|
|
609
|
+
your own selection, or Ctrl/Cmd + click individual dies.</em></p>
|
|
570
610
|
<h3 id="44-charting-dies-and-wafers">4.4 Charting dies and wafers</h3>
|
|
571
611
|
<p><strong>Right-click</strong> a population to open a menu of charts drawn from just those
|
|
572
612
|
dies. Picking one opens it in a window over the map. This is how you look at a
|
|
@@ -616,10 +656,12 @@ there does what it normally does.</p>
|
|
|
616
656
|
detected patterns on the wafer. Open it from the toolbar.</p>
|
|
617
657
|
<p>Each finding shows:</p>
|
|
618
658
|
<ul>
|
|
619
|
-
<li><strong>Severity</strong> \u2014 Unusual, Notable, or
|
|
659
|
+
<li><strong>Severity</strong> \u2014 Unusual, Notable, or Minor (ordered most to least significant)</li>
|
|
620
660
|
<li><strong>Description</strong> \u2014 plain-language summary of what was detected and where</li>
|
|
621
|
-
<li><strong>Click to highlight</strong> \u2014 clicking a finding
|
|
622
|
-
|
|
661
|
+
<li><strong>Click to highlight</strong> \u2014 clicking a finding fades the rest of the wafer and outlines the
|
|
662
|
+
affected dies. A finding about a bin also filters the legend to that bin, so the legend
|
|
663
|
+
always names what the finding describes; a finding about yield or a test clears the
|
|
664
|
+
filter. Changing the selection or the legend filter yourself releases the finding.</li>
|
|
623
665
|
</ul>
|
|
624
666
|
<p><strong>Severity</strong> reflects how strong the statistical evidence is. <em>Unusual</em> findings
|
|
625
667
|
have both a very low adjusted p-value and a large effect size \u2014 they are reliably
|
|
@@ -688,31 +730,56 @@ highlight the affected dies.</em></p>
|
|
|
688
730
|
panel is computed over. For several wafers the heading names them: <strong>Lot
|
|
689
731
|
LOT123 \xB7 13 wafers</strong> when every wafer comes from that one lot, otherwise
|
|
690
732
|
<strong>26 wafers from 2 lots</strong> (or just <strong>13 wafers</strong> when the data records no lot).
|
|
691
|
-
The panel only says "lot" when it really is one lot. "Mean wafer yield" is an
|
|
733
|
+
The panel only says "lot" when it really is one lot. "Mean per-wafer yield" is an
|
|
692
734
|
<em>unweighted</em> mean of each wafer's own yield; it is deliberately not the same
|
|
693
735
|
statistic as the bin breakdown's pass-bin share, which weights every die
|
|
694
736
|
equally. The two agree only when die counts are even across the wafers.</li>
|
|
695
|
-
<li><strong>
|
|
737
|
+
<li><strong>What stands out</strong> \u2014 the headline (the yield, and for a lot its spread across
|
|
738
|
+
wafers), then up to three items ranked by how many dies each costs, an "also"
|
|
739
|
+
line for any others over a yield point, and a line saying what was compared. An
|
|
740
|
+
item names a region, a wafer or a test and, for a region, the failing bins that make up
|
|
741
|
+
its shortfall; a test is an item when it is outside its limits (or a functional test
|
|
742
|
+
fails) on a share of the dies that clears the same floor. Its three dots and word (High, Moderate or Low impact) say how
|
|
743
|
+
much of the lot it costs: the higher of its share of all the dies (2% moderate, 4% high)
|
|
744
|
+
and its share of the dies that fail (15% moderate, 40% high), so a small area that is most
|
|
745
|
+
of a good lot's loss still reads as high. Click a name to highlight that finding on the map.
|
|
746
|
+
A <strong>Watch</strong> line (at most two) follows for things that cost no dies yet: a lot of five or more
|
|
747
|
+
wafers whose yield, or a test's mean, trends up or down across the wafers <em>in the order given</em>
|
|
748
|
+
(said as "input order": the order is only a physical one if you know it is), and a test whose
|
|
749
|
+
Ppk against its limits is under 1.0.
|
|
750
|
+
A wafer or lot with nothing over a yield point says so: "Nothing stands out".
|
|
751
|
+
The reports open with the same section, and <strong>Full report</strong> at the foot of it opens the
|
|
752
|
+
report; in a report opened from the panel, clicking a finding's row shows it on the map.</li>
|
|
753
|
+
<li><strong>Findings</strong> \u2014 detected anomalies, most severe first, each group marked with
|
|
754
|
+
three dots filled by severity (Unusual, Notable, Minor). Severity chips narrow
|
|
696
755
|
the list; Kind and Region dropdowns appear once there are enough findings to
|
|
697
|
-
be worth narrowing.</li>
|
|
756
|
+
be worth narrowing. <strong>Detail</strong> opens the same sentences above a readable list.</li>
|
|
698
757
|
<li><strong>Bin breakdown</strong> \u2014 bars as a share of dies, pass bins first and then failing
|
|
699
758
|
bins by descending count, so the dominant failure mode is at the top. It
|
|
700
759
|
follows the map's plot mode: a soft-bin map gets a soft-bin breakdown. When a
|
|
701
760
|
wafer carries both bin types, a <strong>Hard / Soft</strong> selector in the section header
|
|
702
761
|
overrides that.</li>
|
|
703
762
|
<li><strong>Region yield</strong> \u2014 ring yield by default, with a <strong>Ring / Quadrant</strong> selector.
|
|
763
|
+
Each row prints its difference from the wafer's yield in points and is tinted
|
|
764
|
+
when it is 1, 2 or 4 or more points below it (nothing above is tinted).
|
|
704
765
|
Ring is the default because edge roll-off is the pattern that dominates real
|
|
705
766
|
wafer maps; a genuinely asymmetric quadrant is reported as a finding above,
|
|
706
767
|
with a significance test behind it.</li>
|
|
707
768
|
<li><strong>Wafer yield</strong> (several wafers only) \u2014 one bar per wafer with the median
|
|
708
|
-
marked
|
|
769
|
+
marked, each row's difference from the median in points, and a tint when it is
|
|
770
|
+
1, 2 or 4 or more points below it. Wafers are in slot order by default, since that is what makes a
|
|
709
771
|
slot-correlated pattern visible; a <strong>Slot / Yield</strong> selector re-sorts. Wafers
|
|
710
|
-
|
|
772
|
+
well below or above the rest are labelled "low outlier" or "high outlier"
|
|
773
|
+
(3 or more wafers, and at least 3 points from the median \u2014 the same rule as the
|
|
774
|
+
outlier-wafer findings).</li>
|
|
711
775
|
<li><strong>Test values</strong> \u2014 per test: mean, <strong>Ppk</strong>, and limit yield. Ppk (not Cpk)
|
|
712
776
|
because it measures against the <em>overall</em> spread, including wafer-to-wafer
|
|
713
777
|
variation, which is what the dies actually ship against. The full descriptive
|
|
714
778
|
statistics \u2014 min, quartiles, median, max, \u03C3, both test limits, and all four
|
|
715
|
-
capability indices \u2014 are in the
|
|
779
|
+
capability indices \u2014 are in the CSV export, and the wafer summary report shows
|
|
780
|
+
N, min, quartiles, median, mean, max, \u03C3 and limit yield (a lot's report has N, min, mean,
|
|
781
|
+
max, \u03C3 and limit yield: quartiles cannot be combined from each wafer's own). Both reports
|
|
782
|
+
also carry the full Cp, Cpk, Pp and Ppk table.</li>
|
|
716
783
|
<li><strong>Functional tests</strong> \u2014 pass/fail counts and pass rate per functional test.</li>
|
|
717
784
|
</ul>
|
|
718
785
|
<p>Every section header can be collapsed, and stays collapsed as the panel
|
|
@@ -720,7 +787,13 @@ re-renders.</p>
|
|
|
720
787
|
<p>A <strong>Summary report</strong> button (when present) opens a printable full-detail
|
|
721
788
|
report \u2014 yield, bin breakdown, ring and quadrant statistics, the full per-test
|
|
722
789
|
table with Cp/Cpk/Pp/Ppk, and the findings list \u2014 and can be saved as a PDF
|
|
723
|
-
from your browser's print dialog
|
|
790
|
+
from your browser's print dialog. It opens with <strong>What stands out</strong>: the yield,
|
|
791
|
+
up to three regions, fail bins or wafers ranked by how many dies each costs, and a
|
|
792
|
+
line saying what was compared. An item is listed only when it costs at least one
|
|
793
|
+
yield point of the dies analysed; a lot with none says so. Each figure links to its
|
|
794
|
+
row in the Findings table below. Severity is drawn as three dots and a word, so it reads in a
|
|
795
|
+
black-and-white print; yields carry a bar, and a wafer or region is tinted only when it is
|
|
796
|
+
at least a point below the rest.</p>
|
|
724
797
|
<h3 id="why-some-findings-name-two-bins">Why some findings name two bins</h3>
|
|
725
798
|
<p>A finding may read <strong>"hard bin and soft bin 3 (Fail) (same dies)"</strong>. That is one
|
|
726
799
|
group of dies counted in two bin spaces, not two separate groups added together.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const WMAP_VERSION = "0.
|
|
2
|
-
export declare const WMAP_BUILD_TIME = "2026-
|
|
1
|
+
export declare const WMAP_VERSION = "0.33.0";
|
|
2
|
+
export declare const WMAP_BUILD_TIME = "2026-10-02T10:03:26.613Z";
|
|
3
3
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const WMAP_VERSION="0.
|
|
1
|
+
export const WMAP_VERSION="0.33.0",WMAP_BUILD_TIME="2026-10-02T10:03:26.613Z";
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
export type AggregationMethod = 'mean' | 'median' | 'stddev' | 'min' | 'max' | 'count';
|
|
2
|
+
/**
|
|
3
|
+
* Whether a stack by this method holds measurements of the test, in its units.
|
|
4
|
+
* A mean, median, minimum or maximum does; a standard deviation is a spread and a
|
|
5
|
+
* count is a tally, so the test's limits say nothing about them.
|
|
6
|
+
*/
|
|
7
|
+
export declare function stackHoldsMeasurements(method: string): boolean;
|
|
2
8
|
/** Minimal die shape required by aggregation functions — satisfied by both Die and DieResult. */
|
|
3
9
|
export interface DieLike {
|
|
4
10
|
x: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{copyDie as p,testValue as m}from"./dieTable.js";import{minOf as M,maxOf as V}from"./utils.js";import{positionKey as d}from"./dies.js";export function stackHoldsMeasurements(n){return n!=="stddev"&&n!=="count"}export function aggregateValues(n,o,c=0){if(!n.length)return[];const a=new Map,f=new Map;for(const g of n)for(const t of g){const e=d(t),s=m(t,c);s!==void 0?(a.has(e)||(a.set(e,[]),f.set(e,t)),a.get(e).push(s)):f.has(e)||f.set(e,t)}const r=[];for(const[g,t]of f){const e=a.get(g);if(!e?.length){r.push(p(t,{testValues:void 0,testPass:void 0}));continue}let s;if(o==="mean")s=e.reduce((i,u)=>i+u,0)/e.length;else if(o==="median"){const i=[...e].sort((l,h)=>l-h),u=Math.floor(i.length/2);s=i.length%2?i[u]:(i[u-1]+i[u])/2}else if(o==="stddev"){if(e.length<2){r.push(p(t,{testValues:{0:0},testPass:void 0}));continue}const i=e.reduce((u,l)=>u+l,0)/e.length;s=Math.sqrt(e.reduce((u,l)=>u+(l-i)**2,0)/(e.length-1))}else o==="min"?s=M(e):o==="max"?s=V(e):s=e.length;r.push(p(t,{testValues:{0:s},testPass:void 0}))}return r}export function aggregateBinCounts(n,o,c="hard"){if(!n.length)return[];const a=new Map;for(const f of n)for(const r of f)if((c==="soft"?r.sbin:r.hbin)===o){const t=d(r);a.set(t,(a.get(t)??0)+1)}return(n[0]??[]).map(f=>p(f,{testValues:{0:a.get(d(f))??0},testPass:void 0,...c==="soft"?{sbin:o}:{hbin:o}}))}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection of a repeating multi-project-wafer (MPW) layout, the gate for the compact view.
|
|
3
|
+
*
|
|
4
|
+
* On an MPW only a few parts sit in each reticle, so the occupied columns and rows form a
|
|
5
|
+
* pattern that repeats at the reticle pitch. Random missing data does not repeat, which is
|
|
6
|
+
* what separates the two: hiding the empty rows of a wafer that merely has holes could hide
|
|
7
|
+
* a real problem, so compaction is only offered when a clear period is found.
|
|
8
|
+
*
|
|
9
|
+
* "Occupied" means a die EXISTS at that index, whether or not it carries a bin: a die with
|
|
10
|
+
* only metadata still has a position, and the layout must not change with the colour mode.
|
|
11
|
+
*/
|
|
12
|
+
export interface MpwDetectOptions {
|
|
13
|
+
/** Fewest whole repeats of the period the axis must span. Default 3. */
|
|
14
|
+
minRepeats?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Lowest lag correlation of the occupancy signal that counts as a period. Default 0.75:
|
|
17
|
+
* random sparse layouts score under 0.5 at every lag, while a clean MPW with a few
|
|
18
|
+
* reticle columns missing outright still scores above it.
|
|
19
|
+
*/
|
|
20
|
+
minScore?: number;
|
|
21
|
+
/** Occupied fraction above which an axis is dense: nothing worth compacting. Default 0.8. */
|
|
22
|
+
maxDensity?: number;
|
|
23
|
+
/**
|
|
24
|
+
* A unit the host already knows, such as a reticle width or height in dies. Only that unit and
|
|
25
|
+
* its multiples are tested (devices on every second reticle repeat at twice the reticle, a
|
|
26
|
+
* cluster that repeats within a reticle at a divisor of it, which the multiples reach too), so
|
|
27
|
+
* the check still has to pass (the occupied indices must actually repeat) but nothing else is
|
|
28
|
+
* inferred.
|
|
29
|
+
*/
|
|
30
|
+
expectedPeriod?: number;
|
|
31
|
+
}
|
|
32
|
+
/** A period found on one axis. */
|
|
33
|
+
export interface MpwPeriod {
|
|
34
|
+
/** Indices between one repeat and the next. */
|
|
35
|
+
period: number;
|
|
36
|
+
/** Lag correlation of the occupancy signal at `period`, 0 to 1. */
|
|
37
|
+
score: number;
|
|
38
|
+
/** Whole repeats of the period within the occupied span. */
|
|
39
|
+
repeats: number;
|
|
40
|
+
/** Occupied indices as a fraction of the span between the first and last. */
|
|
41
|
+
occupiedFraction: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find the smallest period at which the occupied indices of one axis repeat.
|
|
45
|
+
*
|
|
46
|
+
* `indices` are the distinct integer indices that hold at least one die, in any order.
|
|
47
|
+
* Returns `null` when the axis is nearly full (nothing to compact), spans too few repeats,
|
|
48
|
+
* or does not repeat: random sparse data scores near zero at every period.
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectMpwPeriod(indices: readonly number[], options?: MpwDetectOptions): MpwPeriod | null;
|
|
51
|
+
/** What one axis looks like for the purposes of the compact gate. */
|
|
52
|
+
export type AxisPattern = ({
|
|
53
|
+
kind: 'periodic';
|
|
54
|
+
} & MpwPeriod) | {
|
|
55
|
+
kind: 'dense';
|
|
56
|
+
occupiedFraction: number;
|
|
57
|
+
} | {
|
|
58
|
+
kind: 'none';
|
|
59
|
+
};
|
|
60
|
+
export interface MpwLayout {
|
|
61
|
+
x: AxisPattern;
|
|
62
|
+
y: AxisPattern;
|
|
63
|
+
/** True when compaction should be offered. */
|
|
64
|
+
offered: boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Decide whether the compact view applies to a set of dies.
|
|
68
|
+
*
|
|
69
|
+
* Offered when both axes repeat, or one repeats and the other is dense (a layout that is
|
|
70
|
+
* sparse in one direction only still has empty rows or columns worth removing). Pass the
|
|
71
|
+
* dies of every wafer in the selection, so the answer, and the layout built from it, is
|
|
72
|
+
* the same for every card in a gallery. Unpositioned dies are ignored.
|
|
73
|
+
*/
|
|
74
|
+
export declare function detectMpwLayout(dies: readonly {
|
|
75
|
+
x?: number | null;
|
|
76
|
+
y?: number | null;
|
|
77
|
+
}[], options?: Omit<MpwDetectOptions, 'expectedPeriod'> & {
|
|
78
|
+
reticle?: {
|
|
79
|
+
width: number;
|
|
80
|
+
height: number;
|
|
81
|
+
};
|
|
82
|
+
}): MpwLayout;
|
|
83
|
+
/**
|
|
84
|
+
* The compact layout of a set of dies: which original columns and rows survive, and the
|
|
85
|
+
* indices they take. Only the layout, never the dies themselves, so one map can be built
|
|
86
|
+
* from every wafer in a selection and applied to each, giving all gallery cards one grid.
|
|
87
|
+
*/
|
|
88
|
+
export interface CompactMap {
|
|
89
|
+
/** Original die `x` of each compact column, ascending. All coordinates shown to a user are these. */
|
|
90
|
+
readonly columns: readonly number[];
|
|
91
|
+
/** Original die `y` of each compact row, ascending. */
|
|
92
|
+
readonly rows: readonly number[];
|
|
93
|
+
/** Compact columns that follow a skipped range of original columns (so a group of columns starts there). */
|
|
94
|
+
readonly columnBreaks: readonly number[];
|
|
95
|
+
/** Compact rows that follow a skipped range of original rows. */
|
|
96
|
+
readonly rowBreaks: readonly number[];
|
|
97
|
+
/**
|
|
98
|
+
* The blocks the layout falls into: each is a run of compact columns and a run of compact
|
|
99
|
+
* rows, `[start, end)`, with no skipped original index inside either, and at least one
|
|
100
|
+
* die of the layout in it. On an MPW these are the reticle groups the dies sit in, so
|
|
101
|
+
* drawing each as a box keeps them distinct once the gaps between them are gone.
|
|
102
|
+
*/
|
|
103
|
+
readonly groups: readonly CompactGroup[];
|
|
104
|
+
/** Compact column of an original `x`, or `undefined` when no die of the layout sits in it. */
|
|
105
|
+
columnOf(x: number): number | undefined;
|
|
106
|
+
/** Compact row of an original `y`, or `undefined` when no die of the layout sits in it. */
|
|
107
|
+
rowOf(y: number): number | undefined;
|
|
108
|
+
}
|
|
109
|
+
/** A block of compact cells with no skipped original index inside it; see `CompactMap.groups`. */
|
|
110
|
+
export interface CompactGroup {
|
|
111
|
+
readonly columns: readonly [start: number, end: number];
|
|
112
|
+
readonly rows: readonly [start: number, end: number];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Build the compact layout for `dies`: the columns and rows that hold at least one die,
|
|
116
|
+
* renumbered 0..n-1 in order. A die EXISTS there whether or not it carries a bin (see the
|
|
117
|
+
* note at the top of this file), so the layout never depends on colour mode, filters or
|
|
118
|
+
* which wafer has data. Unpositioned dies are ignored.
|
|
119
|
+
*/
|
|
120
|
+
export declare function buildCompactMap(dies: readonly {
|
|
121
|
+
x?: number | null;
|
|
122
|
+
y?: number | null;
|
|
123
|
+
}[]): CompactMap;
|
|
124
|
+
/** A die with the compact cell it is drawn in. */
|
|
125
|
+
export interface CompactPlacement<T> {
|
|
126
|
+
die: T;
|
|
127
|
+
column: number;
|
|
128
|
+
row: number;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Place `dies` on a compact grid. With no `basis` the layout is built from `dies`; pass the
|
|
132
|
+
* dies of every wafer in a selection as `basis` so each wafer lands on the same grid. Every
|
|
133
|
+
* positioned die is placed, none dropped: a die whose column or row is missing from the
|
|
134
|
+
* layout throws, since that is a layout built from the wrong dies, not data to hide.
|
|
135
|
+
*/
|
|
136
|
+
export declare function compactDies<T extends {
|
|
137
|
+
x?: number | null;
|
|
138
|
+
y?: number | null;
|
|
139
|
+
}>(dies: readonly T[], basis?: readonly {
|
|
140
|
+
x?: number | null;
|
|
141
|
+
y?: number | null;
|
|
142
|
+
}[] | CompactMap): {
|
|
143
|
+
placements: CompactPlacement<T>[];
|
|
144
|
+
map: CompactMap;
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Whether the compact layout should be offered for the dies of one map or of every map in a
|
|
148
|
+
* gallery. The single rule both renderers use: `reticles` holds one entry per map, and a
|
|
149
|
+
* reticle size fixes the period only when every map supplies the same one; otherwise the
|
|
150
|
+
* period is inferred from the dies.
|
|
151
|
+
*/
|
|
152
|
+
export declare function compactLayoutOffered(dies: readonly {
|
|
153
|
+
x?: number | null;
|
|
154
|
+
y?: number | null;
|
|
155
|
+
}[], reticles: readonly ({
|
|
156
|
+
width: number;
|
|
157
|
+
height: number;
|
|
158
|
+
} | undefined)[], options?: Omit<MpwDetectOptions, 'expectedPeriod'>): boolean;
|
|
159
|
+
/** What the detector saw on one axis. Counts and scores only: no index or coordinate. */
|
|
160
|
+
export interface AxisDiagnostics {
|
|
161
|
+
/** Distinct indices that hold a die. */
|
|
162
|
+
occupied: number;
|
|
163
|
+
/** Indices from the first occupied to the last. */
|
|
164
|
+
span: number;
|
|
165
|
+
/** Maximal runs of consecutive occupied indices. */
|
|
166
|
+
runs: number;
|
|
167
|
+
pattern: AxisPattern;
|
|
168
|
+
/** The best-scoring candidate periods, whether or not any passed. */
|
|
169
|
+
bestPeriods: {
|
|
170
|
+
period: number;
|
|
171
|
+
score: number;
|
|
172
|
+
}[];
|
|
173
|
+
}
|
|
174
|
+
export interface MpwDiagnostics {
|
|
175
|
+
wafers: number;
|
|
176
|
+
positionedDies: number;
|
|
177
|
+
unpositionedDies: number;
|
|
178
|
+
/** Blocks of compact cells that hold dies. */
|
|
179
|
+
groups: number;
|
|
180
|
+
reticle: {
|
|
181
|
+
width: number;
|
|
182
|
+
height: number;
|
|
183
|
+
} | undefined;
|
|
184
|
+
offered: boolean;
|
|
185
|
+
thresholds: Required<Omit<MpwDetectOptions, 'expectedPeriod'>>;
|
|
186
|
+
columns: AxisDiagnostics;
|
|
187
|
+
rows: AxisDiagnostics;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Everything the compact gate saw, as numbers a host can show a user and ask them to send
|
|
191
|
+
* back. It exists because the detector's thresholds cannot be tuned on data nobody can
|
|
192
|
+
* share, so what it needs to report must carry no die position, bin, value or identity:
|
|
193
|
+
* counts, fractions, scores and periods only. `reticles` holds one entry per map, as for
|
|
194
|
+
* `compactLayoutOffered`, which this agrees with by construction.
|
|
195
|
+
*/
|
|
196
|
+
export declare function diagnoseMpwLayout(dies: readonly {
|
|
197
|
+
x?: number | null;
|
|
198
|
+
y?: number | null;
|
|
199
|
+
}[], reticles: readonly ({
|
|
200
|
+
width: number;
|
|
201
|
+
height: number;
|
|
202
|
+
} | undefined)[], options?: Omit<MpwDetectOptions, 'expectedPeriod'>): MpwDiagnostics;
|
|
203
|
+
/** The text a user copies and sends back. Plain lines, so it can be read before it is sent. */
|
|
204
|
+
export declare function formatMpwDiagnostics(d: MpwDiagnostics, library: string): string;
|
|
205
|
+
//# sourceMappingURL=compact.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{hasPosition as a}from"./dies.js";const h={minRepeats:3,minScore:.75,maxDensity:.8};function w(t,e){const s=t.length-e;if(s<2)return 0;let r=0,o=0,n=0,i=0,d=0;for(let u=0;u<s;u++){const p=t[u],l=t[u+e];r+=p,o+=l,n+=p*p,i+=l*l,d+=p*l}const f=n-r*r/s,c=i-o*o/s;return f<=0||c<=0?0:(d-r*o/s)/Math.sqrt(f*c)}function x(t,e,s){const r=Math.floor(t/e),o=[];if(s!==void 0&&s>=1){const n=Math.floor(s);for(let i=n;i<=r;i+=n)i>=2&&o.push(i)}else for(let n=2;n<=r;n++)o.push(n);return o}function g(t){if(t.length===0)return null;let e=1/0,s=-1/0;for(const n of t)n<e&&(e=n),n>s&&(s=n);const r=new Uint8Array(s-e+1);let o=0;for(const n of t)r[n-e]||(r[n-e]=1,o++);return{signal:r,count:o}}export function detectMpwPeriod(t,e={}){const{minRepeats:s,minScore:r,maxDensity:o}={...h,...e},{expectedPeriod:n}=e,i=g(t);if(!i)return null;const d=i.signal.length,f=i.count/d;if(f>o)return null;for(const c of x(d,s,n)){const u=w(i.signal,c);if(u>=r)return{period:c,score:u,repeats:Math.floor(d/c),occupiedFraction:f}}return null}function m(t,e){const{minRepeats:s,maxDensity:r}={...h,...e},o=detectMpwPeriod(t,e);if(o)return{kind:"periodic",...o};const n=g(t);return n&&n.count>=s&&n.count/n.signal.length>r?{kind:"dense",occupiedFraction:n.count/n.signal.length}:{kind:"none"}}export function detectMpwLayout(t,e={}){const{reticle:s,...r}=e,o=new Set,n=new Set;for(const c of t)a(c)&&(o.add(c.x),n.add(c.y));const i=m([...o],{...r,expectedPeriod:s?.width}),d=m([...n],{...r,expectedPeriod:s?.height}),f=i.kind==="periodic"&&(d.kind==="periodic"||d.kind==="dense")||d.kind==="periodic"&&i.kind==="dense";return{x:i,y:d,offered:f}}function y(t,e){const s=[0,...e,t],r=new Int32Array(t);for(let o=0;o+1<s.length;o++)r.fill(o,s[o],s[o+1]);return{ids:r,bounds:s}}function $(t){const e=[...t].sort((o,n)=>o-n),s=[],r=new Map;return e.forEach((o,n)=>{r.set(o,n),n>0&&o-e[n-1]>1&&s.push(n)}),{sorted:e,breaks:s,indexOf:r}}export function buildCompactMap(t){const e=new Set,s=new Set;for(const c of t)a(c)&&(e.add(c.x),s.add(c.y));const r=$(e),o=$(s),n=y(r.sorted.length,r.breaks),i=y(o.sorted.length,o.breaks),d=new Set;for(const c of t)a(c)&&d.add(n.ids[r.indexOf.get(c.x)]*i.bounds.length+i.ids[o.indexOf.get(c.y)]);return{groups:[...d].sort((c,u)=>c-u).map(c=>{const u=Math.floor(c/i.bounds.length),p=c%i.bounds.length;return{columns:[n.bounds[u],n.bounds[u+1]],rows:[i.bounds[p],i.bounds[p+1]]}}),columns:r.sorted,rows:o.sorted,columnBreaks:r.breaks,rowBreaks:o.breaks,columnOf:c=>r.indexOf.get(c),rowOf:c=>o.indexOf.get(c)}}export function compactDies(t,e){const s=e&&"columnOf"in e?e:buildCompactMap(e??t),r=[];for(const o of t){if(!a(o))continue;const n=s.columnOf(o.x),i=s.rowOf(o.y);if(n===void 0||i===void 0)throw new RangeError(`compactDies: die (${o.x}, ${o.y}) is outside the compact layout`);r.push({die:o,column:n,row:i})}return{placements:r,map:s}}export function compactLayoutOffered(t,e,s={}){return detectMpwLayout(t,{...s,reticle:b(e)}).offered}function b(t){const e=t[0];return e&&t.every(s=>s&&s.width===e.width&&s.height===e.height)?{width:e.width,height:e.height}:void 0}function k(t,e){const{minRepeats:s}={...h,...e},r=g(t);if(!r)return{occupied:0,span:0,runs:0,pattern:{kind:"none"},bestPeriods:[]};let o=0;r.signal.forEach((i,d)=>{i&&!r.signal[d-1]&&o++});const n=[];for(const i of x(r.signal.length,s,e.expectedPeriod))n.push({period:i,score:w(r.signal,i)});return n.sort((i,d)=>d.score-i.score||i.period-d.period),{occupied:r.count,span:r.signal.length,runs:o,pattern:m(t,e),bestPeriods:n.slice(0,5)}}export function diagnoseMpwLayout(t,e,s={}){const r=b(e),o=new Set,n=new Set;let i=0;for(const d of t)a(d)&&(i++,o.add(d.x),n.add(d.y));return{wafers:e.length,positionedDies:i,unpositionedDies:t.length-i,groups:buildCompactMap(t).groups.length,reticle:r,offered:detectMpwLayout(t,{...s,reticle:r}).offered,thresholds:{...h,...s},columns:k([...o],{...s,expectedPeriod:r?.width}),rows:k([...n],{...s,expectedPeriod:r?.height})}}function D(t,e){const s=e.span>0?` (${(100*e.occupied/e.span).toFixed(1)}%)`:"",r=e.pattern.kind==="periodic"?`periodic, period ${e.pattern.period}, score ${e.pattern.score.toFixed(3)}, ${e.pattern.repeats} repeats`:e.pattern.kind==="dense"?"dense, nothing to compact":"no repeating pattern found",o=e.bestPeriods.length?`
|
|
2
|
+
best periods: ${e.bestPeriods.map(n=>`${n.period} (${n.score.toFixed(3)})`).join(", ")}`:"";return`${t}: ${e.occupied} occupied of ${e.span}${s}, ${e.runs} runs; ${r}${o}`}export function formatMpwDiagnostics(t,e){return["wafermap compact-layout diagnostics (format 1)",`library: ${e}`,"Counts and scores only: no die coordinates, bins, test values or wafer identity.",`wafers: ${t.wafers}`,`dies: ${t.positionedDies} positioned, ${t.unpositionedDies} without a position`,`reticle size: ${t.reticle?`${t.reticle.width} x ${t.reticle.height} (supplied by every wafer)`:"not supplied"}`,`compact layout offered: ${t.offered?"yes":"no"}`,`groups of dies: ${t.groups}`,`thresholds: minRepeats ${t.thresholds.minRepeats}, minScore ${t.thresholds.minScore}, maxDensity ${t.thresholds.maxDensity}`,D("columns",t.columns),D("rows",t.rows)].join(`
|
|
3
|
+
`)}
|