Exemple #1
0
        public WaferAreaSim(string wc, string eptParameterFile, string inputDirectory, string outputDirectory, DateTime initialDateTime, Optimiser optimiser, bool useInitialLots = false)
        {
            this.wc = wc;

            this.inputDirectory = inputDirectory;

            this.outputDirectory = outputDirectory;

            this.initialDateTime = initialDateTime;

            this.optimiser = optimiser;

            this.useInitialLots = useInitialLots;

            #region WaferFab settings
            waferFabSettings = Deserializer.DeserializeWaferFabSettings(Path.Combine(inputDirectory, "SerializedFiles", $"WaferFabSettings_{wc}_WithLotStarts.dat"));

            distributionReader = new EPTDistributionReader(Path.Combine(inputDirectory, "CSVs"), waferFabSettings.WorkCenters, waferFabSettings.LotStepsPerWorkStation);

            // Get initial parameters
            waferFabSettings.WCServiceTimeDistributions = distributionReader.GetServiceTimeDistributions(eptParameterFile);

            EPTDistribution initialDist = (EPTDistribution)waferFabSettings.WCServiceTimeDistributions[wc];
            InitialParameters = new Dictionary <string, Distribution> {
                { wc, optimiser.CheckInitialDistBounds(initialDist) }
            };

            waferFabSettings.WCOvertakingDistributions = distributionReader.GetOvertakingDistributions();
            #endregion

            if (useInitialLots)
            {
                initialLots = optimiser.GetInitialLots(wc, inputDirectory, outputDirectory, initialDateTime, waferFabSettings);
            }
        }
Exemple #2
0
        /// <summary>
        /// Reading waferfabsettings
        /// </summary>
        /// <param name="includeLotstarts">True to include lot starts which will be read from serialized file</param>
        /// <param name="includeDistributions">True to include workcenter service time and overtaking distributions. Do not include this if waferfabsettings have to be serialized,
        /// because Random class in distributions cannot be serialized.</param>
        /// <param name="area"></param>
        /// <returns></returns>
        public override WaferFabSettings ReadWaferFabSettings(string eptParameterFile, bool includeLotstarts, bool includeDistributions, DispatcherBase.Type dispatcherType = DispatcherBase.Type.EPTOVERTAKING,
                                                              string area = "COMPLETE")
        {
            Console.Write("Reading waferfabsettings -");

            ReadLotStepsRawAndIRDs();

            lotSteps = fillStepsWithIRDs();

            WaferFabSettings = new WaferFabSettings();

            WaferFabSettings.LotStartsFrequency = 12;

            WaferFabSettings.LotTypes = getProductTypes();

            WaferFabSettings.ManualLotStartQtys = WaferFabSettings.LotTypes.ToDictionary(x => x, x => 0);

            WaferFabSettings.LotSteps = lotSteps;

            WaferFabSettings.WorkCenters = irdMappings.Select(x => x.WorkStation).Distinct().ToList();

            WaferFabSettings.LotStepsPerWorkStation = getLotStepsPerWorkstation();

            WaferFabSettings.WCDispatcherTypes = getDispatchers(dispatcherType);

            WaferFabSettings.Sequences = getSequencesPerIRDGroup();

            processPlans = getProcessPlans();

            if (includeLotstarts)
            {
                if (area == "COMPLETE")
                {
                    WaferFabSettings.RealLotStarts = Deserializer.DeserializeRealLotStarts(Path.Combine(DirectorySerializedFiles, "LotStarts_2019_2020_2021.dat"));
                }
                else
                {
                    WaferFabSettings.LotStarts = GetLotStartsOneWorkCenter(area);
                }
            }

            if (includeDistributions)
            {
                EPTDistributionReader reader = new EPTDistributionReader(DirectoryInputCSVs, WaferFabSettings.WorkCenters, WaferFabSettings.LotStepsPerWorkStation);

                WaferFabSettings.WCServiceTimeDistributions = reader.GetServiceTimeDistributions(eptParameterFile);

                WaferFabSettings.WCOvertakingDistributions = reader.GetOvertakingDistributions();
            }

            return(WaferFabSettings);
        }
Exemple #3
0
        public override WaferFabSettings DeserializeWaferFabSettings(string serializedFileName, string eptParameterFile)
        {
            Console.Write("Reading waferfabsettings -");

            WaferFabSettings = Deserializer.DeserializeWaferFabSettings(Path.Combine(DirectorySerializedFiles, serializedFileName));

            EPTDistributionReader reader = new EPTDistributionReader(DirectoryInputCSVs, WaferFabSettings.WorkCenters, WaferFabSettings.LotStepsPerWorkStation);

            WaferFabSettings.WCServiceTimeDistributions = reader.GetServiceTimeDistributions(eptParameterFile);

            WaferFabSettings.WCOvertakingDistributions = reader.GetOvertakingDistributions();

            Console.Write(" done.\n");

            return(WaferFabSettings);
        }
Exemple #4
0
        static void Main(string[] args)
        {
            string inputDirectory   = @"C:\CSSLWaferFab\Input\WSC2021paper";
            string outputDirectory  = @"C:\CSSLWaferFab\Output\WSC2021paper";
            string eptParameterFile = @"FittedEPTParameters - 2019-6-1.csv";

            List <string> workcenters = new List <string> {
                "PHOTOLITH", "FURNACING", "DRY ETCH"
            };
            List <string> SOvsLDO = new List <string> {
                "SO", "LDO"
            };

            //List<string> SOvsLDO = new List<string> { "LDO"};

            foreach (string wc in workcenters)
            {
                WaferFabSettings waferFabSettings = Deserializer.DeserializeWaferFabSettings(Path.Combine(inputDirectory, "SerializedFiles", $"WaferFabSettings_{wc}_WithLotStarts.dat"));

                foreach (string overtaking in SOvsLDO)
                {
                    bool lotStepOvertaking = overtaking == "SO" ? false : true;

                    #region Initializing simulation
                    Simulation simulation = new Simulation(wc, outputDirectory);
                    #endregion

                    #region Experiment settings
                    simulation.MyExperiment.NumberOfReplications = 10;
                    simulation.MyExperiment.LengthOfReplication  = 60 * 60 * 24 * 91; // September and October
                    simulation.MyExperiment.LengthOfWarmUp       = 60 * 60 * 24 * 30;
                    DateTime initialDateTime = new DateTime(2019, 08, 01);
                    #endregion

                    #region WaferFab settings

                    EPTDistributionReader distributionReader = new EPTDistributionReader(Path.Combine(inputDirectory, "CSVs"), waferFabSettings.WorkCenters, waferFabSettings.LotStepsPerWorkStation);

                    waferFabSettings.WCServiceTimeDistributions = distributionReader.GetServiceTimeDistributions(eptParameterFile);
                    waferFabSettings.WCOvertakingDistributions  = distributionReader.GetOvertakingDistributions(lotStepOvertaking);
                    waferFabSettings.WCDispatcherTypes[wc]      = 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 observers
                    LotOutObserver lotOutObserver = new LotOutObserver(simulation, wc + "_" + overtaking + "LotOutObserver");
                    dispatcher.Subscribe(lotOutObserver);
                    OptimiserObserver optimiserObserver = new OptimiserObserver(simulation, "TotalQueueObserver");
                    workCenter.Subscribe(optimiserObserver);
                    #endregion

                    #region 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<string> lotSteps = workCenter.LotSteps.Select(x => x.Name).ToList();

                    //List<RealLot> initialRealLots = realSnapShot.GetRealLots(1).Where(x => lotSteps.Contains(x.IRDGroup)).ToList();

                    //List<Lot> initialLots = initialRealLots.Select(x => x.ConvertToLotArea(0, waferFabSettings.Sequences, initialDateTime)).ToList();

                    //waferFab.InitialLots = initialLots;
                    #endregion

                    simulation.Run();

                    #region Reporting
                    SimulationReporter reporter = simulation.MakeSimulationReporter();

                    reporter.PrintSummaryToConsole();
                    #endregion
                }
            }
        }
Exemple #5
0
        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
            }
        }