Browse Source

enhance the throughput while loadlock is fixed slot pattern.

sangwq 1 year ago
parent
commit
408e8f0786
1 changed files with 67 additions and 0 deletions
  1. 67 0
      Venus/Venus_RT/Modules/SystemDispatcher.cs

+ 67 - 0
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -3396,6 +3396,40 @@ namespace Venus_RT.Modules
                             return;
                         }
                     }
+
+
+                    // try to return a wafer 
+                    var readyReturnWafer = _lstWaferTasks.Find(wt => ModuleHelper.IsPm(wt.currentMod) && ModuleHelper.IsLoadPort(wt.destMod) && _dictModuleTask[wt.currentMod].TimeToReady <= 2);
+                    if(readyReturnWafer != null)
+                    {
+                        var readyLL = lls.Where(ll => GetLLFixedReadyInOutSlots(ll.Key).tInSlot.Count > 0 && ll.Value.TimeToReady <= 2).OrderBy(ll => ll.Value.Scheduler.IsVac ? 0 : 1);
+                        if(readyLL.Count() > 0)
+                        {
+                            var validHand = (Hand)(1 - robotWafers.First().currentSlot);
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyReturnWafer.currentMod, 0, ModuleName.TMRobot, (int)validHand, validHand) });
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand , readyLL.First().Key, GetLLFixedReadyInOutSlots(readyLL.First().Key).tInSlot.First(), validHand) });
+                            return;
+                        }
+                    }
+
+
+                    // try to push in a wafer 
+                    var readyInLL = lls.Where(ll => GetLLFixedReadyInOutSlots(ll.Key).tOutSlot.Count > 0 && ll.Value.TimeToReady <= 2).OrderBy(ll => ll.Value.Scheduler.IsVac ? 0 : 1);
+                    foreach(var ll in readyInLL)
+                    {
+                        var waferStatus = GetLLFixedReadyInOutSlots(ll.Key);
+                        var wafer = _lstWaferTasks.Find(wt => wt.currentMod == ll.Key && wt.currentSlot == waferStatus.tOutSlot.First());
+                        if( wafer != null && 
+                            ModuleHelper.IsPm(wafer.destMod) && 
+                            !_lstWaferTasks.Exists(wt => wt.currentMod == wafer.destMod) && 
+                            _dictModuleTask[wafer.destMod].TimeToReady <= 2)
+                        {
+                            var validHand = (Hand)(1 - robotWafers.First().currentSlot);
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(wafer.currentMod, wafer.currentSlot, ModuleName.TMRobot, (int)validHand, validHand) });
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, wafer.destMod, 0, validHand) });
+                            return;
+                        }
+                    }
                 }
                 else if (robotWafers.Count() == 0)
                 {
@@ -3582,6 +3616,39 @@ namespace Venus_RT.Modules
                                 return;
                             }
                         }
+
+                        // try to return a wafer 
+                        var readyReturnWafer = _lstWaferTasks.Find(wt => ModuleHelper.IsPm(wt.currentMod) && ModuleHelper.IsLoadPort(wt.destMod) && _dictModuleTask[wt.currentMod].TimeToReady <= 2);
+                        if (readyReturnWafer != null)
+                        {
+                            var readyLL = lls.Where(ll => GetLLFixedReadyInOutSlots(ll.Key).tInSlot.Count > 0 && ll.Value.TimeToReady <= 2).OrderBy(ll => ll.Value.Scheduler.IsVac ? 0 : 1);
+                            if (readyLL.Count() > 0)
+                            {
+                                var validHand = (Hand)(1 - robotWafers.First().currentSlot);
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyReturnWafer.currentMod, 0, ModuleName.TMRobot, (int)validHand, validHand) });
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, readyLL.First().Key, GetLLFixedReadyInOutSlots(readyLL.First().Key).tInSlot.First(), validHand) });
+                                return;
+                            }
+                        }
+
+
+                        // try to push in a wafer 
+                        var readyInLL = lls.Where(ll => GetLLFixedReadyInOutSlots(ll.Key).tOutSlot.Count > 0 && ll.Value.TimeToReady <= 2).OrderBy(ll => ll.Value.Scheduler.IsVac ? 0 : 1);
+                        foreach (var ll in readyInLL)
+                        {
+                            var waferStatus = GetLLFixedReadyInOutSlots(ll.Key);
+                            var wafer = _lstWaferTasks.Find(wt => wt.currentMod == ll.Key && wt.currentSlot == waferStatus.tOutSlot.First());
+                            if (wafer != null &&
+                                ModuleHelper.IsPm(wafer.destMod) &&
+                                !_lstWaferTasks.Exists(wt => wt.currentMod == wafer.destMod) &&
+                                _dictModuleTask[wafer.destMod].TimeToReady <= 2)
+                            {
+                                var validHand = (Hand)(1 - robotWafers.First().currentSlot);
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(wafer.currentMod, wafer.currentSlot, ModuleName.TMRobot, (int)validHand, validHand) });
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, wafer.destMod, 0, validHand) });
+                                return;
+                            }
+                        }
                     }
                 }
                 else // robot empty