Waferchipberechnung

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Orginator.

    Waferchipberechnung

    Hallo liebe Forummitglieder,


    ich bin ein Novize in Sachen Forum und VB 2010. Ich bin das erste Mal in so einem Forum und bitte jeden um Entschuldigung, wenn ich gegen die Boardregeln verstoßen sollte. Ich erhoffe mir Hilfe bei meinen Problemen und möchte diese gerne hier finden.

    Nun zum Hauptthema:

    Ich habe aus Eigeninteresse mit VB 2010 begonnen und möchte ein Tool erstellen, womit ich auf einer 100mm Scheibe (sprich: Kreis) Chips (sprich: Rechtecke) zählen kann.

    So sieht mein derzeitiger Stand aus: siehe Kreis.png

    1. Jetzt möchte ich, dass die Rechtecke, die nicht komplett in den Kreis hineinpassen, unsichtbar gemacht bzw. gelöscht werden (es müssen logischerweise 9 Rechtecke in der Mitte sein).

    2. Die 9 Rechtecke sollen nach Betätigen eines Buttons eine andere Farbe bekommen (Achtung: es handelt sich um ein Raster was ich über dem Kreis gelegt habe und dieses Raster besteht aus Linien :D).

    Jetzt meine Frage, werte Forummitglieder, ist so etwas realisirbar? Wenn ja, zeigt mir bitte Vorschläge oder komplett neue Ideen zum Thema, ich freue mich.

    Danke im Vorraus

    Orginator
    Bilder
    • Kreis.png

      16,66 kB, 609×672, 270 mal angesehen
    Hallo und willkommen hier im Forum.

    Das was du willst ist auf jeden Fall möglich. Es bietet sich an GDI zu verwenden.
    Hier eine gute Einführung in die Grundlagen.
    Bleibt nur die Frage was du genau damit machen willst.
    Soll der Benutzer da draufklicken können? Willst du das drucken oder als Bild speichern?
    Simpel: Wenn du für jedes Rechteck die vier Eckpunkte hast, kannst du den Kreis mit nem runden GraphicsPath zeichnen und mit graphicsObj.IsVisible(point) überprüfen, ob die vier Punkte im Kreis sind. Wenn ja: zeichnen, wenn nein: nicht zeichnen.

    Waferchipberechnung

    Schönen Abend,

    danke für die ersten Antworten.

    Hier die Aufklärung:

    Comment von markus.obi:

    Der Benutzer soll lediglich eine visuelle Kontrolle erhalten, dass heißt, er gibt seine relevanten Paramter mithilfe einer Maske ein (z.B.: Durchmesser des Kreises, Chipgröße x und y, etc.) und mit denen generiert er eine Map mit den Rechtecken. Da allerdings die Rechtecke außerhalb des Kreises bzw. die nicht zu 100 % in den Kreis passen, nicht Produktionsrelevant sind, soll das Tool die 100%-igen Rechtecke grün markieren (sprich: 9 in der Mitte grün, verbunden mit Buttonklick).

    Eine Druck- bzw. Speicherfunktion ist hier nicht notwendig.

    Comment von Samus Aran:

    Ist eine sehr gute Idee, jedoch ist es ein bisschen aufwendig, bei beispielsweise 16000 Rechtecken alle 4 Eckpunkte zu bestimmen (also 16000 x 4 = :whistling: ). Wäre eine Herausforderung für mich und den Rechner. Oder wie hattest du es gemeint? Gibt es eine Formel? Oder bestimmt der Rechner die Eckpunkte bzw. Koordinaten selbstständig?

    Ich bedanke mich für euren Engagement

    Orginator
    Naja du könntest deine Fläche erst in eine "sinnvolle" Größe zerlegen.
    Zuerst vielleicht zum Beispiel 160 Kacheln berechnen, und wenn eine dieser Kacheln eine "ungültige" Kachel ist, dann weiter in Kacheln zerlegen...
    Also bei den 25 Kacheln oben könntest du ja dadurch schon mal 9 Stück sparen...

    //"Perfekte" Kacheln sind dann sofort grün...

    Orginator schrieb:


    Ist eine sehr gute Idee, jedoch ist es ein bisschen aufwendig, bei beispielsweise 16000 Rechtecken alle 4 Eckpunkte zu bestimmen (also 16000 x 4 = :whistling: ). Wäre eine Herausforderung für mich und den Rechner. Oder wie hattest du es gemeint? Gibt es eine Formel? Oder bestimmt der Rechner die Eckpunkte bzw. Koordinaten selbstständig?


    Sowas ist ganz und gar nicht aufwändig. Dafür gibt es ja Schleifen (for, while).
    Es ist die Frage, ob der Mittelpunkt des Kreises immer auf den 4 Eckpunkten der mittleren Rechtecke liegt. Bei deinem Beispielbild würde man bei einer nicht mittigen Anordnung mindestens 10 Rechtecke reinbekommen.
    Unter der Annahme, dass die Rechtecke immer mittig liegen müssen würde ich so vorgehen:

    Von der Mitte aus jeweils die 4 Eckpunkte eines Rechtecks berechnen. Prüfen ob für alle Punkte x^2 + y^2 < r^2 gilt. (Aufgrund der Symmetrie reicht es einen Quadranten zu berechnen, man kann aber auch alle durchrechnen.)
    Wenn ja, dann Rechteck in List(of Rectangle) einfügen.
    Im PaintEvent alle Rechtecke aus der Liste zeichnen.
    Es reicht, wenn du für jede Reihe das erste und das letzte gültige Quadrat berechnest.
    Also einmal von links und einmal von rechts anfangen.
    Die Quadrate dazwischen sind auf jeden Fall gültig.

    Mir fallen noch weiter Optimierungen ein, wenn du dich von Mitte oben jeweils nach aussen näherst und jeweils nach aussen das letzte gültige Quadrat ermittelst.
    Die Randquadrate eine Zeile darunter grenzen an die beiden Randquadrate dieser Zeile.

    Aber bevor du die Quadratur des Kreises bis zum Wahnsinn treibst, kannst du ruhig auch deinem Prozessor vertrauen.
    Der ist schneller als du denkst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Falls ich beim Überfleigen des Textes nichts übersehen habe, ist deine Frage ja erstmal ein mathematisches Problem. Entweder schaffst du es, dies mathematisch zu lösen, oder du machst das Gitter verschiebbar, sodass der Benutzer die Anordnung optimieren kann. Weil die von dir im Beispiel gezeigte ANordnung führt nicht immer zu der besten Ausbeute.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Hallo.

    Du musst die Teilrechtecke, die nicht komplett auf dem Kreis liegen, nicht "unsichtbar" machen (vielleicht nur für die Ansicht - zum automatischen Zählen aber nicht).

    Berechne zuerst alle Schnittpunkte. Die sind bei mir ein einer PointAttr-Struktur, die so aussieht:

    VB.NET-Quellcode

    1. Structure PointAttr
    2. Dim pt As Point 'Schnittpunkt
    3. Dim distance As Double 'Entfernung zum Mittelpunkt (Pythagoras!)
    4. End Structure

    ("bei mir" heißt: Ich fand das Projekt interessant, deshalb habe ich es kurz geschrieben. Die Struktur ist in Wirklichkeit größer, aber der restliche Inhalt ist nur für die grafische Darstellung relevant.)

    Dann kannst du die Anzahl der Dies auf dem Wafer mit ein bisschen LINQ-Zauberei leicht berechnen, vorausgesetzt die Entfernung zum Mittelpunkt wurde korrekt vorberechnet:

    VB.NET-Quellcode

    1. Dim x = From pa In intersects
    2. Where pa.distance < waferRadius
    3. Order By pa.pt.X
    4. Group By hLine = pa.pt.X
    5. Into pointCount = Count()
    6. 'x enthält eine Liste von Punktlisten, die auf derselben horizontalen Linie und innerhalb des Wafers liegen.
    7. Dim dieCount As Int32 = 0
    8. For i = 0 To x.Count() - 2
    9. If x(i + 1).pointCount >= x(i).pointCount Then
    10. dieCount += x(i).pointCount - 1
    11. Else
    12. dieCount += x(i + 1).pointCount - 1
    13. End If
    14. Next
    15. MessageBox.Show("die count: " & dieCount)


    Die Darstellung / Einfärbung überlasse ich mal als Übung - das sollte mit den vorhandenen Schnittpunkten nicht schwierig sein.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    @Orginator: Vielleicht noch eine Anmerkung:
    Zur symmetrischen Anordnung von Quadraten auf Kreisen gibt es grundsätzlich 4 Arten:
    a) Kreismittelpunkt ist Mittelpunkt eines Quadrars,
    b) Kreismittelpunkt ist Eckpunkt 4er Quadrate,
    c) Kreismittelpunkt ist Mittelpunkt einer x-Kante,
    d) Kreismittelpunkt ist Mittelpunkt einer y-Kante.
    Mit solch Ansätzen kannst Du über Symmetrie-Betrachtung 3/4 der Fälle abdecken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bin mir nicht sicher, ob man bei der Optimierung rein mathematisch ideal vorgehen sollte.
    Zumindest sollte man in der Mathematik dann auch die Fertigungstoleranzen abbilden.
    Die Verschiebung des Wafer um ein paar μm gegen das Raster lässt unter Umständen ganz andere Idealwerte zutage treten.

    Aber eigentlich war nach Optimierung AFAIR gar nicht gefragt, sondern nur nach der Darstellung. Insofern...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Waferchipberechnung

    Hallo liebe Forummitglieder,

    vielen Dank für die großartige Unterstützung. Werde gleich eure Vorschläge in die Tat umsetzten und testen.

    Hier noch ein paar Anmerkungen:

    1. Die Chips sind entweder rechteckig oder quadratisch. Der Kreismittelpunkt muss nicht immer der Chipmittelpunkt sein, ist sozusagen sehr flexibel.

    2. Das Raster ist verschiebbar bis 50 % (horizontal wie vertikal, siehe Stichwort @petaod: Fertigungstoleranz).

    3. Der gesamte Kreis samt Chips sollen schrittweise um 90, 180, 270 und 360° gedreht werden.


    Wie gesagt, oben sind die Anmerkungen, es könnte ja noch jemanden eine gute Idee eingefallen sein. Ich bräuchte ein paar Hilfestellungen beim Codieren (also die Befehleingabe :whistling: ), da ich noch ein Neuling im VB 2010 bin.


    Vielen Dank

    Orginator

    picoflop schrieb:

    Frage:
    Ist eigentlich eine streng horizontal/vertikal Anordnung immer die günstigste? Läßt sich das mathematisch begründen, insb. im Fall, dass der "Chip" zwar rechteckig, aber NICHT quadratisch ist?

    Ich schätze mal nein - Beweis durch Bild (Die-Größe 35x45 Pixel auf 250px-Kreis):


    Schiebt man die unterste Reihe ein Stück nach links, hat man schon einen Chip mehr. Das geht offensichtlich, da links etwa eine halbe Rechteckbreite Platz ist, rechts aber weniger als die Hälfte benötigt wird. Mit der zweituntersten Reihe klappt das ebenfalls.

    Kurz gesagt: Ich kanns nicht mathematisch beweisen. Bilder von "echten" Wafern zeigen übrigens ausnahmslos regelmäßig angeordnete Dies - das kann aber auch eine Frage der Wirtschaftlichkeit sein (einfache Anordnung --> weniger Fehler).
    Gruß
    hal2000
    Mal ne grundlegende Frage. Ich mein, ich hab ja nicht wirklich Plan von der Chipfertigung. Wieso sind Wafer eigentlich immer kreisförmig und nicht von Anfang an rechteckig? Gibts dafür nen Grund?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hallo Forummitglieder,

    speziell eine gerichtete Frage an hal2000:

    ich finde deine Idee ausgezeichnet, habe deinen Code ausprobiert. Jedoch zeigt VB 2010 diese Fehlermeldung:


    Fehler 1 "intersects" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.


    @hal2000: Was mache ich falsch? Wie deklariere ich intersects? Soweit ich es verstanden habe, haben Intersects den Vorteil, dass sie Objekte schneller verarbeiten können als Loops.

    Bei der Schnittpunktberechnung: Brauche ich hier eine Formel oder berechnet er diese selber mit dem Structure-Befehl? Ich tendiere eher zu einer FOrmel. :S

    Bitte verzeiht die vielleicht dummen Fragen, aber nochmals (und zum letzten Mal) ich bin ein Neuling ;( und möchte trotzdem das VB 2010 lernen.

    Danke im Vorraus :D

    Orginator
    "intersects" ist eine Liste von PointAttr-Strukturen. Mit diesem Namen ist kein besonderes Konstrukt verbunden - ich hätte die Liste auch Horst nennen können. Deklariert wird das so:

    VB.NET-Quellcode

    1. Dim intersects As New List(Of PointAttr)
    2. Dim pt As Point
    3. Dim dist As Double
    4. 'Schnittpunkte berechnen:
    5. For i = 0 To diameter - 1 Step dieWidth
    6. For j = 0 To diameter - 1 Step dieHeight
    7. pt = New Point(i, j)
    8. dist = ... 'Betrag der Entfernung von pt zum Mittelpunkt, also sqrt(abs(x2 - x1)^2 + abs(y2-y1)^2)
    9. 'Der Mittelpunkt (x2, y2) liegt im Normalfall bei (radius, radius)
    10. intersects.Add(New PointAttr() With {.pt = pt, .distance = dist})
    11. Next
    12. Next
    Gruß
    hal2000