public List <Lot> GetInitialLots(string wc, string inputDirectory, string outputDirectory, DateTime initialDateTime, WaferFabSettings waferFabSettings) { // Create an instance of a simulation class to retrieve lot steps Simulation simulation = new Simulation("CSSLWaferFabArea", outputDirectory); WaferFab waferFab = new WaferFab(simulation.MyModel, "WaferFab", new ConstantDistribution(60 * 60 * 24), initialDateTime); WorkCenter workCenter = new WorkCenter(waferFab, $"WorkCenter_{wc}", waferFabSettings.WCServiceTimeDistributions[wc], waferFabSettings.LotStepsPerWorkStation[wc]); // Sequences foreach (var sequence in waferFabSettings.Sequences) { waferFab.AddSequence(sequence.Key, sequence.Value); } // LotSteps waferFab.LotSteps = waferFab.Sequences.Select(x => x.Value).Select(x => x.GetCurrentStep(0)).ToDictionary(x => x.Name); // Read initial lots RealSnapshotReader reader = new RealSnapshotReader(); List <RealSnapshot> realSnapshots = reader.Read(Path.Combine(inputDirectory, "SerializedFiles", reader.GetRealSnapshotString(initialDateTime)), 1); RealSnapshot realSnapShot = realSnapshots.Where(x => x.Time == initialDateTime).First(); List <RealLot> initialRealLots = realSnapShot.GetRealLots(1).Where(x => x.LotActivity.WorkStation == wc).ToList(); List <Lot> initialLots = initialRealLots.Select(x => x.ConvertToLotArea(0, waferFabSettings.Sequences, initialDateTime)).ToList(); return(initialLots); }
static void Main(string[] args) { List <DateTime> DateTimes = ReadDateTimes(@"C:\CSSLWaferFab\Input\WIPBalanceWeights\DateTimes.csv"); int jStepBack = 0; int kStepAhead = 1; string inputDir = @"C:\CSSLWaferFab\Input\"; string eptParameterFile = @"FittedEPTParameters - 2019-06-01.csv"; // Get WaferFabSettings AutoDataReader reader = new AutoDataReader(inputDir + @"CSVs\", inputDir + @"SerializedFiles\"); WaferFabSettings waferFabSettings = reader.ReadWaferFabSettings(eptParameterFile, false, false, DispatcherBase.Type.MIVS); waferFabSettings.WIPTargets = reader.ReadWIPTargets(waferFabSettings.LotSteps, "WIPTargets.csv"); // Get all lots from snapshot LotTraces lotTraces = Deserializer.DeserializeLotTraces(inputDir + @"SerializedFiles\LotTraces_2019_2020_2021.dat"); foreach (DateTime time in DateTimes) { RealSnapshot realSnapshot = lotTraces.GetWIPSnapshot(time, 0); List <Lot> lots = realSnapshot.GetRealLots(0).Select(x => x.ConvertToLot(0, waferFabSettings.Sequences, false, time)).Where(x => x != null).ToList(); // Construct current WIP levels and WIP targets Dictionary <string, int> WIPlevels = realSnapshot.WIPlevelsInWafers; Dictionary <LotStep, double> WIPtargets = waferFabSettings.WIPTargets; // Construct weights per lot Dictionary <Lot, double> weights = new Dictionary <Lot, double>(); foreach (Lot lot in lots) { double weight = 0.0; for (int relStep = -jStepBack; relStep <= 0; relStep++) { if (lot.HasRelativeStep(relStep)) { LotStep step = lot.GetRelativeStep(relStep); if (WIPlevels.ContainsKey(step.Name)) { weight += WIPlevels[step.Name] - WIPtargets[step]; } else // WIP level of step is not know in snapshot, so it has to be 0 { weight -= WIPtargets[step]; } } } for (int relStep = 1; relStep <= kStepAhead; relStep++) { if (lot.HasRelativeStep(relStep)) { LotStep step = lot.GetRelativeStep(relStep); if (WIPlevels.ContainsKey(step.Name)) { weight += WIPtargets[step] - WIPlevels[step.Name]; } else // WIP level of step is not know in snapshot, so it has to be 0 { weight += WIPtargets[step]; } } } weights.Add(lot, weight); } WriteWeightsToCSV(weights, time); } }
static void Main(string[] args) { List <string> workcenters = new List <string>() { "BACKGRIND", "BATCH UP", "CMP", "DICE", "DRY ETCH", "ELEC TEST", "EVAPORATION", "FURNACING", "IMPLANT", "INSPECTION", "LPCVD", "MERCURY", "NITRIDE DEP", "OFF LINE INK", "PACK", "PHOTOLITH", "PROBE", "REPORTING", "SAMPLE TEST", "SPUTTERING", "WET ETCH" }; DateTime initialDateTime = new DateTime(2019, 10, 1); string inputDirectory = @"C:\CSSLWaferFab\Input"; string outputDirectory = @"C:\CSSLWaferFab\Output\WaferFabArea"; string eptParameterFile = @"FittedEPTParameters - 2019-6-1.csv"; RealSnapshotReader reader = new RealSnapshotReader(); List <RealSnapshot> realSnapshots = reader.Read(Path.Combine(inputDirectory, "SerializedFiles", reader.GetRealSnapshotString(initialDateTime)), 1); RealSnapshot realSnapShot = realSnapshots.Where(x => x.Time == initialDateTime).First(); //workcenters = new List<string>() {"INSPECTION"}; foreach (string workcenter in workcenters) { #region Parameters string wc = workcenter; bool isFitted = false; // true = fitted, false = optimised bool lotStepOvertaking = true; #endregion #region Initializing simulation Simulation simulation = new Simulation(wc, outputDirectory); #endregion #region Experiment settings simulation.MyExperiment.NumberOfReplications = 30; DateTime finalDateTime = new DateTime(2019, initialDateTime.Month + 2, 1); simulation.MyExperiment.LengthOfReplication = (finalDateTime - initialDateTime).TotalSeconds; // Number of seconds between two months simulation.MyExperiment.LengthOfWarmUp = 60 * 60 * 24 * 0; #endregion #region WaferFab settings WaferFabSettings waferFabSettings = Deserializer.DeserializeWaferFabSettings(Path.Combine(inputDirectory, "SerializedFiles", $"WaferFabSettings_{wc}_WithLotStarts.dat")); EPTDistributionReader distributionReader = new EPTDistributionReader(Path.Combine(inputDirectory, "CSVs"), waferFabSettings.WorkCenters, waferFabSettings.LotStepsPerWorkStation); waferFabSettings.WCServiceTimeDistributions = distributionReader.GetServiceTimeDistributions(eptParameterFile); waferFabSettings.WCOvertakingDistributions = distributionReader.GetOvertakingDistributions(lotStepOvertaking); waferFabSettings.WCDispatcherTypes[workcenter] = DispatcherBase.Type.EPTOVERTAKING; #endregion #region Make starting lots AutoDataReader dataReader = new AutoDataReader(Path.Combine(inputDirectory, "Auto"), Path.Combine(inputDirectory, "SerializedFiles")); #endregion #region Building the model WaferFab waferFab = new WaferFab(simulation.MyModel, "WaferFab", new ConstantDistribution(60 * 60 * 24), initialDateTime); WorkCenter workCenter = new WorkCenter(waferFab, $"WorkCenter_{wc}", waferFabSettings.WCServiceTimeDistributions[wc], waferFabSettings.LotStepsPerWorkStation[wc]); // Connect workcenter to WIPDependentDistribution EPTDistribution distr = (EPTDistribution)waferFabSettings.WCServiceTimeDistributions[wc]; distr.WorkCenter = workCenter; EPTOvertakingDispatcher dispatcher = new EPTOvertakingDispatcher(workCenter, workCenter.Name + "_EPTOvertakingDispatcher", waferFabSettings.WCOvertakingDistributions[wc]); workCenter.SetDispatcher(dispatcher); // Connect workcenter to OvertakingDistribution waferFabSettings.WCOvertakingDistributions[wc].WorkCenter = workCenter; waferFab.AddWorkCenter(workCenter.Name, workCenter); // Sequences foreach (var sequence in waferFabSettings.Sequences) { waferFab.AddSequence(sequence.Key, sequence.Value); } // LotSteps waferFab.LotSteps = waferFab.Sequences.Select(x => x.Value).Select(x => x.GetCurrentStep(0)).ToDictionary(x => x.Name); // LotGenerator waferFab.SetLotGenerator(new LotGenerator(waferFab, "LotGenerator", new ConstantDistribution(60), true)); // Add lotstarts waferFab.LotStarts = waferFabSettings.LotStarts; // Add initial lots List <RealLot> initialRealLots = realSnapShot.GetRealLots(1).Where(x => x.LotActivity.WorkStation == wc).ToList(); waferFab.InitialLots = initialRealLots.Select(x => x.ConvertToLotArea(0, waferFabSettings.Sequences, initialDateTime)).ToList(); // Add observers LotOutObserver lotOutObserver = new LotOutObserver(simulation, wc + "_LotOutObserver"); dispatcher.Subscribe(lotOutObserver); TotalQueueObserver totalQueueObserver = new TotalQueueObserver(simulation, wc + "_TotalQueueObserver"); workCenter.Subscribe(totalQueueObserver); #endregion simulation.Run(); #region Reporting SimulationReporter reporter = simulation.MakeSimulationReporter(); reporter.PrintSummaryToConsole(); #endregion } }