├── App.config ├── LICENSE.txt ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── README.md ├── WafermapControl ├── Wafermap.Designer.cs ├── Wafermap.cs ├── Wafermap.resx └── WafermapTools.cs ├── WafermapDisplay.csproj ├── bin └── Debug │ ├── WafermapDisplay.dll │ ├── WafermapDisplay.dll.config │ └── WafermapDisplay.pdb └── obj └── Debug ├── DesignTimeResolveAssemblyReferences.cache ├── DesignTimeResolveAssemblyReferencesInput.cache ├── TempPE └── Properties.Resources.Designer.cs.dll ├── TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs ├── TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs ├── TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs ├── WAfermapDisplay.csproj.FileListAbsolute.txt ├── WAfermapDisplay.csproj.GenerateResource.Cache ├── WafermapDisplay.dll ├── WafermapDisplay.pdb ├── fratte.at.WafermapDisplay.Properties.Resources.resources └── fratte.at.WafermapDisplay.Wafermap.resources /App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Florian Fratte 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, 8 | this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * Neither the name of fratte.at nor the names of its contributors may be 13 | used to endorse or promote products derived from this software without 14 | specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 | POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die mit einer Assembly verknüpft sind. 8 | [assembly: AssemblyTitle("fratte.at.WafermapDisplay")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("fratte.at.WafermapDisplay")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar 18 | // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("e6571189-9545-42fc-9342-abf3063a9068")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern 33 | // übernehmen, indem Sie "*" eingeben: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.34011 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace fratte.at.WafermapDisplay.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("fratte.at.WafermapDisplay.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.34011 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace fratte.at.WafermapDisplay.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | WafermapDisplay 2 | =============== 3 | 4 | c# project providing a wafer map control 5 | 6 | This project aims to provide a way to visualize wafer map data in windows applications 7 | A wafer map is something specific to semiconductor industry and usually the data is coming from Wafer Probe using ATE 8 | 9 | A more detailed documentation is coming soon (as soon as I've got time to do it) 10 | 11 | Basically the useage should be quite self explaining 12 | In the meantime I'll just provide a snipped out of my test class: 13 | 14 | for (int waferNum = 0; waferNum < nrWafers; waferNum++) 15 | { 16 | // Create sample dataset 17 | int[,] data = new int[300, 300]; 18 | Random binGenerator = new Random(waferNum); 19 | for (int x = 0; x < 300; x++) 20 | { 21 | for (int y = 0; y < 300; y++) 22 | { 23 | data[x, y] = binGenerator.Next(8); 24 | } 25 | } 26 | WafermapImpl wmap = new WafermapImpl(); 27 | wmap.Dataset = data; 28 | wmap.Notchlocation = 90; 29 | wmap.MinimumSize = new Size(250,250); 30 | 31 | wmap.Interactive = true; 32 | //this.Controls.Add(wmap); 33 | flowLayoutPanel1.Controls.Add(wmap); 34 | } 35 | 36 | Here's the implementation class: 37 | class WafermapImpl : Wafermap 38 | { 39 | 40 | public override void dieEntered(int x, int y, int bincode) 41 | { 42 | // Do nothing 43 | } 44 | 45 | public override void dieClicked(int x, int y, int bincode, System.Windows.Forms.MouseButtons btn) 46 | { 47 | // Cast 48 | 49 | if (btn == MouseButtons.Left) 50 | { 51 | // Update dataset 52 | Dataset[x, y] = 2; 53 | // Show the changes 54 | updateDie(x, y, 2); 55 | } 56 | else 57 | { 58 | // Rotation test 59 | int rot=Rotation + 90; 60 | if (rot > 270) 61 | rot = rot - 360; 62 | Rotation = rot; 63 | Invalidate(); 64 | } 65 | } 66 | } 67 | The 2 overwrittern methods get called by the Wafermap class when a die is clicked or when the mouse pointer enters 68 | a die in the visualization 69 | -------------------------------------------------------------------------------- /WafermapControl/Wafermap.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace fratte.at.WafermapDisplay 2 | { 3 | partial class Wafermap 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Komponenten-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.SuspendLayout(); 32 | // 33 | // Wafermap 34 | // 35 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 36 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 37 | this.Name = "Wafermap"; 38 | this.Load += new System.EventHandler(this.Wafermap_Load); 39 | this.ResumeLayout(false); 40 | 41 | } 42 | 43 | #endregion 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /WafermapControl/Wafermap.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Drawing; 5 | using System.Data; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | using System.Drawing.Drawing2D; 11 | 12 | namespace fratte.at.WafermapDisplay 13 | { 14 | 15 | 16 | public partial class Wafermap : UserControl 17 | { 18 | private String tooSmallString = "TOO SMALL"; 19 | 20 | public String TooSmallString 21 | { 22 | get { return tooSmallString; } 23 | set { tooSmallString = value; } 24 | } 25 | 26 | private String noDataString = "NO DATA"; 27 | 28 | public String NoDataString 29 | { 30 | get { return noDataString; } 31 | set { noDataString = value; } 32 | } 33 | 34 | 35 | 36 | private int translation_x=0; 37 | 38 | public int TranslationX 39 | { 40 | get { return translation_x; } 41 | set { translation_x = value; } 42 | } 43 | 44 | private int translation_y=0; 45 | 46 | public int TranslationY 47 | { 48 | get { return translation_y; } 49 | set { translation_y = value; } 50 | } 51 | 52 | private int rotation; 53 | 54 | public int Rotation 55 | { 56 | get { return rotation; } 57 | set { if (value % 90 == 0 && value >= 0 && value < 360) 58 | rotation = value; 59 | else 60 | throw new ArgumentException("Rotation has to be 0, 90, 180 or 270 degrees (Is "+value+")"); 61 | 62 | 63 | } 64 | } 65 | 66 | 67 | private float zoom; 68 | 69 | public float Zoom 70 | { 71 | get { return zoom; } 72 | set { zoom = value; } 73 | } 74 | private int notchLocation = 0; 75 | 76 | public int Notchlocation 77 | { 78 | get { return notchLocation; } 79 | set { 80 | if (value % 90 == 0 && value >= 0 && value <= 270) 81 | notchLocation = value; 82 | else 83 | throw new ArgumentException("NotchLocation has to be 0, 90, 180 or 270 degrees (Is "+value+")"); 84 | } 85 | } 86 | 87 | private int[,] dataset; 88 | 89 | public int[,] Dataset 90 | { 91 | get { return dataset; } 92 | set { dataset = value; } 93 | } 94 | 95 | private Color[] colors; 96 | 97 | public Color[] Colors 98 | { 99 | get { return colors; } 100 | set { colors = value; } 101 | } 102 | 103 | 104 | 105 | public Wafermap() 106 | { 107 | zoom=1f; 108 | InitializeComponent(); 109 | SetStyle(ControlStyles.ResizeRedraw, true); 110 | DoubleBuffered = true; 111 | setupDefaultColors(); 112 | registerEvents(); 113 | } 114 | 115 | 116 | 117 | private void setupDefaultColors() 118 | { 119 | // Just some sample colors to get started 120 | colors = new Color[255]; 121 | colors[0] = Color.Green; 122 | colors[1] = Color.Red; 123 | colors[2] = Color.Yellow; 124 | colors[3] = Color.Blue; 125 | colors[4] = Color.Orange; 126 | colors[5] = Color.Magenta; 127 | colors[6] = Color.DarkBlue; 128 | colors[7] = Color.Pink; 129 | colors[50] = Color.Black; 130 | } 131 | 132 | private void Wafermap_Load(object sender, EventArgs e) 133 | { 134 | this.Dock = DockStyle.Fill; 135 | } 136 | 137 | private bool isScaled; 138 | 139 | public bool IsScaled 140 | { 141 | get { return isScaled; } 142 | 143 | } 144 | 145 | private int scaleFactor; 146 | 147 | public int ScaleFactor 148 | { 149 | get { return scaleFactor; } 150 | } 151 | 152 | 153 | // We need some globals to be available for calculations 154 | RectangleF boundingBox_; 155 | SizeF dieSize_; 156 | 157 | protected override void OnPaint(PaintEventArgs e) 158 | { 159 | 160 | 161 | // set rotation 162 | e.Graphics.RotateTransform((float)rotation); 163 | if(rotation!=0) 164 | { 165 | // When we rotate, we also have to translate 166 | switch (rotation) 167 | { 168 | case 90: 169 | e.Graphics.TranslateTransform(0, -boundingBox_.Width); 170 | break; 171 | case 180: 172 | e.Graphics.TranslateTransform(-boundingBox_.Width,-boundingBox_.Height); 173 | break; 174 | case 270: 175 | e.Graphics.TranslateTransform(-boundingBox_.Height, 0); 176 | break; 177 | } 178 | } 179 | // set additional translation 180 | e.Graphics.TranslateTransform(translation_x, translation_y); 181 | 182 | // Use antialias 183 | e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 184 | 185 | // Here comes everything that has to be calculated on each resize/redraw 186 | // Just do this calculations once 187 | // Let's find the best Size for the outline 188 | float w = this.Width*zoom; 189 | float h = this.Height*zoom; 190 | 191 | float size = w < h ? w : h; 192 | // Wafersize is size-2 because we're not drawing the first and the last pixels 193 | SizeF wafersize = new SizeF(size - 2, size - 2); 194 | PointF starting = new PointF((w - size) / 2f, (h - size) / 2f); 195 | RectangleF boundingBox = new RectangleF(starting, wafersize); 196 | boundingBox_ = boundingBox; 197 | 198 | // Create graphics path. 199 | GraphicsPath clipPath = new GraphicsPath(); 200 | clipPath.AddEllipse(boundingBox); 201 | // Set clipping region to path. 202 | e.Graphics.SetClip(clipPath, CombineMode.Replace); 203 | 204 | 205 | drawCircle(e.Graphics,boundingBox); 206 | drawNotch(e.Graphics, boundingBox, notchLocation); 207 | 208 | // Let's calculate everything needed for drawing the dies 209 | if (dataset != null && dataset.Length > 0) 210 | { 211 | int maxX = dataset.GetLength(0); 212 | int maxY = dataset.GetLength(1); 213 | float sizeX = boundingBox.Width / (float)maxX; 214 | float sizeY = boundingBox.Height / (float)maxY; 215 | 216 | int every = 1; 217 | 218 | // If dieSizeX or dieSizeY is less then 2 pixels 219 | // take only every nth die 220 | while (sizeX <= 2 || sizeY <= 2) 221 | { 222 | every = every * 2; 223 | sizeX = boundingBox.Width / (float)(maxX/every); 224 | sizeY = boundingBox.Height / (float)(maxY/every); 225 | } 226 | SizeF dieSize = new SizeF(sizeX, sizeY); 227 | dieSize_ = dieSize; 228 | // If every != 1 we recalculate the input data 229 | // Otherwise we pass the original dataset 230 | // Caveat: We must not overwrite the original dataset ;) 231 | if (every > 1) 232 | { 233 | // Create a new dataset 234 | // Get the highest bin code in x/y to x/y + every as result for x/y 235 | // First set the property 236 | isScaled = true; 237 | scaleFactor = every; 238 | drawDies(e.Graphics, boundingBox, fratte.at.WafermapDisplay.WafermapTools.scaleArray(dataset,every), dieSize); 239 | // Print "Too small" message 240 | FontFamily myFontFamily = new FontFamily("Arial"); 241 | Font myFont = new Font(myFontFamily, 242 | 10, 243 | FontStyle.Bold, 244 | GraphicsUnit.Pixel); 245 | 246 | e.Graphics.DrawString(tooSmallString, myFont, new SolidBrush(Color.Red), boundingBox.Location); 247 | 248 | } 249 | else 250 | { 251 | // Properties 252 | isScaled = false; 253 | scaleFactor = 1; 254 | 255 | // Simply draw the die 256 | drawDies(e.Graphics, boundingBox, dataset, dieSize); 257 | } 258 | } 259 | else 260 | { 261 | // Display "No Data" message 262 | FontFamily myFontFamily = new FontFamily("Arial"); 263 | Font myFont = new Font(myFontFamily, 264 | 10, 265 | FontStyle.Bold, 266 | GraphicsUnit.Pixel); 267 | 268 | e.Graphics.DrawString(noDataString, myFont,new SolidBrush( Color.Red), boundingBox.Location); 269 | } 270 | 271 | 272 | } 273 | 274 | // Try to reuse - only instantiated once 275 | SolidBrush waferFillbrush = new SolidBrush(Color.Silver); 276 | Pen blackPen = new Pen(Color.Black); 277 | SolidBrush notchFillBrush = new SolidBrush(Color.Black); 278 | private void drawCircle(Graphics g, RectangleF boundingBox) 279 | { 280 | g.FillEllipse(waferFillbrush, boundingBox); 281 | g.DrawEllipse(blackPen, boundingBox); 282 | } 283 | 284 | private void drawNotch(Graphics g, RectangleF boundingBox, int location) 285 | { 286 | // Draw the notch (Phyical property on the wafer for alignment. Can be at 0, 90, 180, 270 degrees 287 | // starting from 0° at the bottom CCW) 288 | // The Shape is fixed to a cut circle 289 | float size=boundingBox.Width 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /WafermapControl/WafermapTools.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace fratte.at.WafermapDisplay 8 | { 9 | class WafermapTools 10 | { 11 | public static int[,] scaleArray(int[,]data, int scale){ 12 | // Create the scaled array 13 | int[,] newdata = new int[(int)Math.Ceiling((double)data.GetLength(0) / (double)scale), (int)Math.Ceiling((double)data.GetLength(1) / (double)scale)]; 14 | // Fill the array 15 | int temp = newdata.GetLength(0); 16 | int temp1 = newdata.GetLength(1); 17 | for (int x = 0; x < temp; x++) 18 | { 19 | for (int y = 0; y < temp1; y++) 20 | { 21 | // Slice array 22 | newdata[x, y] = getMaxArray(data,x,y,scale); 23 | } 24 | } 25 | return newdata; 26 | } 27 | 28 | private static int getMaxArray(int[,] data, int xFrom, int yFrom, int size){ 29 | int temp = data.GetLength(0); 30 | int temp1 = data.GetLength(1); 31 | int max = 0; 32 | 33 | if (xFrom + size < temp) 34 | temp = xFrom + size; 35 | if (yFrom + size < temp1) 36 | temp1 = yFrom + size; 37 | 38 | for (int x = xFrom; x < temp; x++) 39 | { 40 | for (int y = yFrom; y < temp1; y++) 41 | { 42 | if (data[x, y] > max) 43 | { 44 | max = data[x, y]; 45 | } 46 | } 47 | } 48 | return max; 49 | } 50 | 51 | public double getYield(int[,] data, int[] goodBins, int[] ignoreBins) 52 | { 53 | double y = -1.00; 54 | int total = 0; 55 | int good = 0; 56 | foreach (int bin in data) 57 | { 58 | if (!ignoreBins.Contains(bin)) 59 | { 60 | total += 1; 61 | if (goodBins.Contains(bin)) 62 | { 63 | good += 1; 64 | } 65 | } 66 | } 67 | y = (double)good / (double)total; 68 | return y; 69 | } 70 | } 71 | 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /WafermapDisplay.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {303C3301-3E16-4E88-991B-68AD9D66B11C} 8 | Library 9 | Properties 10 | fratte.at.WafermapDisplay 11 | WafermapDisplay 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | UserControl 53 | 54 | 55 | Wafermap.cs 56 | 57 | 58 | 59 | ResXFileCodeGenerator 60 | Resources.Designer.cs 61 | Designer 62 | 63 | 64 | True 65 | Resources.resx 66 | True 67 | 68 | 69 | Wafermap.cs 70 | 71 | 72 | SettingsSingleFileGenerator 73 | Settings.Designer.cs 74 | 75 | 76 | True 77 | Settings.settings 78 | True 79 | 80 | 81 | 82 | 83 | 84 | 85 | 92 | -------------------------------------------------------------------------------- /bin/Debug/WafermapDisplay.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/bin/Debug/WafermapDisplay.dll -------------------------------------------------------------------------------- /bin/Debug/WafermapDisplay.dll.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /bin/Debug/WafermapDisplay.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/bin/Debug/WafermapDisplay.pdb -------------------------------------------------------------------------------- /obj/Debug/DesignTimeResolveAssemblyReferences.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/DesignTimeResolveAssemblyReferences.cache -------------------------------------------------------------------------------- /obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /obj/Debug/TempPE/Properties.Resources.Designer.cs.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs -------------------------------------------------------------------------------- /obj/Debug/WAfermapDisplay.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | c:\users\florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\bin\Debug\WAfermapDisplay.pdb 2 | c:\users\florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\obj\Debug\WAfermapDisplay.csproj.GenerateResource.Cache 3 | c:\users\florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\obj\Debug\WAfermapDisplay.pdb 4 | C:\Users\Florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\obj\Debug\fratte.at.WafermapDisplay.Properties.Resources.resources 5 | C:\Users\Florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\obj\Debug\fratte.at.WafermapDisplay.Wafermap.resources 6 | C:\Users\Florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\bin\Debug\WafermapDisplay.dll.config 7 | C:\Users\Florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\bin\Debug\WafermapDisplay.dll 8 | C:\Users\Florian\documents\visual studio 2013\Projects\WAfermapDisplay\WAfermapDisplay\obj\Debug\WafermapDisplay.dll 9 | -------------------------------------------------------------------------------- /obj/Debug/WAfermapDisplay.csproj.GenerateResource.Cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/WAfermapDisplay.csproj.GenerateResource.Cache -------------------------------------------------------------------------------- /obj/Debug/WafermapDisplay.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/WafermapDisplay.dll -------------------------------------------------------------------------------- /obj/Debug/WafermapDisplay.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/WafermapDisplay.pdb -------------------------------------------------------------------------------- /obj/Debug/fratte.at.WafermapDisplay.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/fratte.at.WafermapDisplay.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/Debug/fratte.at.WafermapDisplay.Wafermap.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8forbidden/WafermapDisplay/f9f28c68cef344d87cea81086725ac98e0831c91/obj/Debug/fratte.at.WafermapDisplay.Wafermap.resources --------------------------------------------------------------------------------