public IFeatureCursor Search(IQueryFilter Filter, bool Recycling)
        {
            log.enterFunc("Search");

            if (log.IsDebugEnabled)
            {
                log.Debug(Helper.objectToString(Filter) + "," + Recycling.ToString());
            }

            IFeatureCursor retVal = null;

            try
            {
                string where;
                string fields;
                GeomHelper.aoQryToPostGisQry(Filter, postGisLayer, out fields, out where);
                AutoDataReader dr = postGisLayer.doQuery(fields, where);
#if !STUB_BUILD
                retVal = new PostGisFeatureCursor(this, dr);
#endif
            }
            finally
            {
                log.leaveFunc();
            }
            return(retVal);
        }
Exemple #2
0
        static public ISpatialReference setEsriSpatiaReferenceFromSrText(int srid, Connection conn)
        {
            ISpatialReference sr     = new UnknownCoordinateSystemClass();
            string            srText = "";
            int i = 0;

            try
            {
                //Bill: query srtext associated with srid
                AutoDataReader dr = conn.doQuery("select * from spatial_ref_sys where srid = " + srid.ToString());
                if (dr.Read())
                {
                    srText = dr["srtext"] + "";
                    ISpatialReferenceFactory2 srf = new SpatialReferenceEnvironmentClass();
                    if (srText == "")
                    {
                        sr = new UnknownCoordinateSystemClass();
                    }
                    else
                    {
                        //use srText to construct SR.
                        srf.CreateESRISpatialReference(srText, out sr, out i);
                    }
                }
                return(sr);
            }
            catch
            {
                //PostGis srid is not implemented as an Esri Factory Code
                sr = new UnknownCoordinateSystemClass();
                return(sr);
            }
        }
Exemple #3
0
        static void Main(string[] args)
        {
            string inputDir = @"C:\Users\nx008314\OneDrive - Nexperia\Work\WaferFab\Auto";

            string outputDir = @"C:\Users\nx008314\OneDrive - Nexperia\Work\WaferFab\SerializedFiles";

            AutoDataReader reader = new AutoDataReader(inputDir, outputDir);

            //SerializeWorkCenterLotActivities(reader, "LotActivity2019_2020.csv", "WorkCenterLotActivities_SmallTestSet", true);

            //SerializeWaferFabSettings(reader, false);

            SerializeLotTraces(reader, "LotActivity2019_2020_2021.csv", "LotTraces_2019_2020_2021");

            //WriteLotActivitiesWithEPTsToCSV(reader, "LotTraces_2019_2020_2021.dat", "AllLotActivitiesWithEPTs_201920202021.csv");

            SerializeLotStarts(reader, "2019_2020_2021");

            ////SerializeWaferFabSettings(reader, true);

            //foreach (string wc in reader.WaferFabSettings.WorkCenters)
            //{
            //    SerializeWaferFabSettings(reader, true, wc);
            //}

            //SerializeRealSnaphotsAll(reader, 1);

            SerializeRealSnapshotsPerMonth(reader, 1);
        }
Exemple #4
0
        /// <summary>
        /// Serializes WorkCenterLotActivities. Uses waferfabsettings + raw lot activities (from Excel add-on Nexperia Tools > F/W Queries > LotsProdEqpt).
        /// </summary>
        /// <param name="lotActivitiesFilename"></param>
        public static void SerializeWorkCenterLotActivities(AutoDataReader reader, string filenameLotActivities, string filenameSerializedOutput, bool onlyProductionLots)
        {
            reader.ReadWaferFabSettings(@"FittedEPTParameters.csv", false, true, DispatcherBase.Type.EPTOVERTAKING);

            reader.ReadWorkCenterLotActivities(filenameLotActivities, onlyProductionLots);

            reader.SerializeWorkCenterLotActivities($"{filenameSerializedOutput}");
        }
Exemple #5
0
        /// <summary>
        /// Serialized WaferFabSettings without the Distributions (Random class cannot be serialized).
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="area">Area to serialize, if not specified complete fab will be build.</param>
        /// <param name="withLotStarts">With or without real lot starts</param>
        public static void SerializeWaferFabSettings(AutoDataReader reader, bool withLotStarts, string area = "COMPLETE")
        {
            reader.ReadWaferFabSettings(@"FittedEPTParameters.csv", withLotStarts, false, DispatcherBase.Type.EPTOVERTAKING, area);

            string fileName = withLotStarts ? $"WaferFabSettings_{area}_WithLotStarts" : $"WaferFabSettings_{area}_NoLotStarts";

            reader.SerializeWaferFabSettings(fileName);
        }
Exemple #6
0
        static void Main(string[] args)
        {
            string inputDir = @"C:\CSSLWaferFab\Input\";

            string outputDir = @"C:\CSSLWaferFab\Output\WaferFabSim\";

            string parameters = @"FittedEPTParameters - 2019-8-1_4months.csv";

            DateTime initialDateTime = new DateTime(2019, 8, 1);

            Settings.WriteOutput = true;
            Settings.FixSeed     = true;

            ShellModel WaferFabSim = new ShellModel(outputDir);

            // Load WaferFab settings
            AutoDataReader reader = new AutoDataReader(inputDir + @"CSVs\", inputDir + @"SerializedFiles\");

            WaferFabSettings waferFabSettings = reader.ReadWaferFabSettings(parameters, true, true, DispatcherBase.Type.EPTOVERTAKING);

            waferFabSettings.SampleInterval       = 1 * 60 * 60; // seconds
            waferFabSettings.LotStartsFrequency   = 1;           // hours
            waferFabSettings.UseRealLotStartsFlag = true;

            // MIVS Settings
            //waferFabSettings.WIPTargets = reader.ReadWIPTargets(waferFabSettings.LotSteps, "WIPTargets.csv");
            //waferFabSettings.MIVSjStepBack = 2;
            //waferFabSettings.MIVSkStepAhead = 2;

            // Read Initial Lots
            WaferFabSim.ReadRealSnaphots(inputDir + @$ "SerializedFiles\RealSnapShots_2019-{initialDateTime.Month}-1_2019-{initialDateTime.Month + 1}-1_1h.dat");
            waferFabSettings.InitialRealLots = WaferFabSim.RealSnapshotReader.RealSnapshots.Where(x => x.Time.Date == initialDateTime).OrderBy(x => x.Time).First().GetRealLots(1);

            // Experiment settings
            ExperimentSettings experimentSettings = new ExperimentSettings();

            int count = waferFabSettings.InitialRealLots.Where(x => x.StartTime == null).Count();

            experimentSettings.NumberOfReplications = 30;
            experimentSettings.LengthOfReplication  = 121 * 24 * 60 * 60; // seconds
            experimentSettings.LengthOfWarmUp       = 0 * 60 * 60;        // seconds

            // Connect settings
            WaferFabSim.MyWaferFabSettings = waferFabSettings;

            WaferFabSim.MyExperimentSettings = experimentSettings;

            // Run simulation
            WaferFabSim.RunSimulation();

            // Report summary
            SimulationReporter reporter = WaferFabSim.MySimulation.MakeSimulationReporter();

            reporter.PrintSummaryToFile();
            reporter.PrintSummaryToConsole();
        }
Exemple #7
0
        /// <summary>
        /// Serializes LotTraces. Gets the WorkCenterLotActivities from serialized files. Combines the individual activities from one lot into a trace.
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="workCenterLotAcitivitiesSerializedFile"></param>
        public static void SerializeLotTraces(AutoDataReader reader, string filenameLotActivities, string filenameOutputFile)
        {
            if (reader.WaferFabSettings == null)
            {
                reader.ReadWaferFabSettings(@"FittedEPTParameters.csv", false, false, DispatcherBase.Type.EPTOVERTAKING);
            }

            reader.ReadWorkCenterLotActivities(filenameLotActivities, true);

            reader.SerializeLotTraces(filenameOutputFile);
        }
Exemple #8
0
        /// <summary>
        /// Serializes LotStarts. Reads the LotTraces from serialized file, gets from all traces the starts and transfers this into LotStarts.
        /// </summary>
        /// <param name="reader"></param>
        public static void SerializeLotStarts(AutoDataReader reader, string timeframe)
        {
            if (reader.WaferFabSettings == null)
            {
                reader.ReadWaferFabSettings(@"FittedEPTParameters.csv", false, false, DispatcherBase.Type.EPTOVERTAKING);
            }

            reader.LotTraces = Deserializer.DeserializeLotTraces(Path.Combine(reader.DirectorySerializedFiles, $"LotTraces_{timeframe}.dat"));

            reader.GetLotStarts();

            reader.SerializeLotStarts($"LotStarts_{timeframe}");
        }
 /// <summary>
 /// Create a SelectionSet from a dataReader
 /// </summary>
 /// <param name="postGisFeatureClass"></param>
 /// <param name="dataReader"></param>
 public PostGisSelectionSet(PostGisFeatureClass postGisFeatureClass, AutoDataReader dataReader)
 {
     System.Diagnostics.Debug.WriteLine("NOT-Empty PostGisSelectionSet...");
     m_featClass = postGisFeatureClass;
     //oids.Add(1);
     m_dr = dataReader;
     if (dataReader != null)
     {
         while (dataReader.Read())
         {
             oids.Add((object)dataReader[PostGisConstants.idField]);
         }
         dataReader.Close();
     }
 }
Exemple #10
0
        static void Main(string[] args)
        {
            string inputDir = @"C:\Users\nx008314\OneDrive - Nexperia\Work\WaferFab\";

            string outputDir = @"C:\CSSLWaferFab\";

            Settings.Output  = true;
            Settings.FixSeed = true;

            ShellModel WaferFabSim = new ShellModel(inputDir, outputDir);

            // Load WaferFab settings
            //ManualDataReader reader = new ManualDataReader(inputDir + "CSVs");
            AutoDataReader reader = new AutoDataReader(inputDir + "Auto");

            WaferFabSettings waferFabSettings = reader.ReadWaferFabSettings();

            waferFabSettings.SampleInterval       = 1 * 60 * 60; // seconds
            waferFabSettings.LotStartsFrequency   = 1;           // hours
            waferFabSettings.UseRealLotStartsFlag = true;

            // Read Initial Lots
            WaferFabSim.ReadRealSnaphots(inputDir + @"SerializedFiles\RealSnapshots_2019-12-1_2020-1-1_1h.dat");

            waferFabSettings.InitialRealLots = WaferFabSim.RealSnapshotReader.RealSnapshots.First().RealLots;

            // Experiment settings
            ExperimentSettings experimentSettings = new ExperimentSettings();

            experimentSettings.NumberOfReplications = 1;
            experimentSettings.LengthOfReplication  = 1 * 24 * 60 * 60; // seconds
            experimentSettings.LengthOfWarmUp       = 0 * 60 * 60;      // seconds

            // Connect settings
            WaferFabSim.MyWaferFabSettings = waferFabSettings;

            WaferFabSim.MyExperimentSettings = experimentSettings;

            // Run simulation
            WaferFabSim.RunSimulation();

            // Report summary
            SimulationReporter reporter = WaferFabSim.MySimulation.MakeSimulationReporter();

            reporter.PrintSummaryToFile();
            reporter.PrintSummaryToConsole();
        }
Exemple #11
0
        public static void SerializeRealSnaphotsAll(AutoDataReader reader, int waferQtyThreshold)
        {
            if (reader.LotTraces == null)
            {
                reader.LotTraces = Deserializer.DeserializeLotTraces(Path.Combine(reader.DirectorySerializedFiles, "LotTraces_2019_2020.dat"));
            }

            DateTime start = reader.LotTraces.StartDate;
            DateTime end   = reader.LotTraces.EndDate;

            DateTime from      = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0, 0);
            DateTime until     = new DateTime(end.Year, end.Month, end.Day, end.Hour, 0, 0, 0);
            TimeSpan frequency = new TimeSpan(1, 0, 0);

            reader.ReadRealSnapshots(from, until, frequency, waferQtyThreshold);

            reader.SerializeRealSnapshots($"{from.Year}-{from.Month}-{from.Day}_{until.Year}-{until.Month}-{until.Day}_{frequency.Hours}h");
        }
Exemple #12
0
        static void LotArrivalAndDepartures()
        {
            string inputDir = @"C:\Users\nx008314\OneDrive - Nexperia\Work\WaferFab\Auto";

            string outputDir = @"C:\Users\nx008314\OneDrive - Nexperia\Work\WaferFab\SerializedFiles";

            AutoDataReader reader = new AutoDataReader(inputDir, outputDir);

            reader.LotTraces = Deserializer.DeserializeLotTraces(Path.Combine(reader.DirectorySerializedFiles, $"LotTraces_2019_2020_2021.dat"));

            using (StreamWriter writer = new StreamWriter(Path.Combine(outputDir, "LotStartsDeparturesFab_2019_2020_2021.txt")))
            {
                writer.WriteLine("LotID,ProductType,StartTime,EndTime,Status");

                foreach (LotTraces.LotTrace trace in reader.LotTraces.All)
                {
                    writer.WriteLine($"{trace.LotId},{trace.ProductType},{trace.StartDate},{trace.EndDate},{trace.Status}");
                }
            }
        }
        /// <summary>
        /// Get a ISelectionSet from the feature class (Paolo, march 2007)
        /// </summary>
        /// <param name="QueryFilter"></param>
        /// <param name="selType"></param>
        /// <param name="selOption"></param>
        /// <param name="selectionContainer"></param>
        /// <returns></returns>
        public ISelectionSet Select(IQueryFilter QueryFilter, esriSelectionType selType, esriSelectionOption selOption, IWorkspace selectionContainer)
        {
            log.enterFunc("Select");

            if (log.IsDebugEnabled)
            {
                log.Debug(Helper.objectToString(QueryFilter) + "," + selType.ToString() + "," + selOption.ToString() + "," + Helper.objectToString(selectionContainer));
            }

            ISelectionSet retVal = null;

            try
            {
                //retVal = new PostGisSelectionSet(this);

                //2 cases, with null QueryFilter and without
                if (QueryFilter == null)
                {
                    retVal = new PostGisSelectionSet(this);
                }
                else
                {
                    string sql    = "";
                    string fields = "";
                    string where = "";
                    GeomHelper.aoQryToPostGisQry(QueryFilter, postGisLayer, out fields, out where);
                    AutoDataReader dr = postGisLayer.doQuery(fields, where);
                    retVal = new PostGisSelectionSet(this, dr);
                }
            }
            finally
            {
                log.leaveFunc();
            }

            return(retVal as ISelectionSet);
        }
Exemple #14
0
        public static void SerializeRealSnapshotsPerMonth(AutoDataReader reader, int waferQtyThreshold)
        {
            if (reader.LotTraces == null)
            {
                reader.LotTraces = Deserializer.DeserializeLotTraces(Path.Combine(reader.DirectorySerializedFiles, "LotTraces_2019_2020.dat"));
            }

            DateTime start = reader.LotTraces.StartDate;
            DateTime end   = reader.LotTraces.EndDate;

            DateTime from      = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0, 0);
            DateTime until     = new DateTime(start.AddMonths(1).Year, start.AddMonths(1).Month, 1, 0, 0, 0, 0); // Until first of next month
            TimeSpan frequency = new TimeSpan(1, 0, 0);

            while (until < end.AddMonths(1))
            {
                reader.ReadRealSnapshots(from, until, frequency, waferQtyThreshold);

                reader.SerializeRealSnapshots($"{from.Year}-{from.Month}-{from.Day}_{until.Year}-{until.Month}-{until.Day}_{frequency.Hours}h");

                from  = until;
                until = until.AddMonths(1);
            }
        }
Exemple #15
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 #16
0
        static void SnapshotsWorksstationQueueLenthsJeroen()
        {
            /// //////////////////////////////////////////////
            /// SnapShots Workstation Queue Lengths //////////

            /*
             * DateTime date = new DateTime(2019, 6, 1);
             * int monthsToEvaluate = 12;
             *
             * string inputDir = @"C:\CSSLWaferFab\Input\";
             *
             * string outputDir = @"C:\CSSLWaferFab\Output";
             *
             * string parameters = @"FittedEPTParameters - 2019-06-01.csv";
             *
             * AutoDataReader autoDataReader = new AutoDataReader(inputDir + @"CSVs\", inputDir + @"SerializedFiles\");
             * WaferFabSettings waferFabSettings = autoDataReader.ReadWaferFabSettings(parameters, true, false);
             *
             * List<string> workCenters = new List<string>();
             * foreach (string workCenter in waferFabSettings.WorkCenters)
             * {
             *  workCenters.Add(workCenter);
             * }
             *
             * // Write headers
             * StreamWriter writer = new StreamWriter(Path.Combine(outputDir, "Snapshots", $"Snapshots Workcenter - Complete - 06-2019.txt"));
             * writer.Write("Time,");
             * foreach (string workCenter in workCenters)
             * {
             *  if (workCenter != workCenters.Last())
             *  {
             *      writer.Write($"{workCenter},");
             *  }
             *  else
             *  {
             *      writer.Write($"{workCenter}\n");
             *  }
             * }
             *
             * RealSnapshotReader realSnapshotReader = new RealSnapshotReader();
             * for (int j = 0; j < monthsToEvaluate; j++)
             * {
             *  DateTime n = date.AddMonths(j);
             *  DateTime m = date.AddMonths(j + 1);
             *
             *  string filename = inputDir + @$"SerializedFiles\RealSnapShots_{n.Year}-{n.Month}-{n.Day}_{m.Year}-{m.Month}-{m.Day}_1h.dat";
             *  realSnapshotReader.Read(filename, 1);
             *
             *  List<RealSnapshot> realSnaphshots = new List<RealSnapshot>();
             *  if (j == 0)
             *  {
             *      realSnaphshots = realSnapshotReader.RealSnapshots;
             *  }
             *  else
             *  {
             *      realSnaphshots = realSnapshotReader.RealSnapshots.Skip(1).ToList();
             *  }
             *
             *  // Write Data
             *  foreach (RealSnapshot realSnapshot in realSnaphshots)
             *  {
             *      writer.Write($"{realSnapshot.Time},");
             *      foreach (string workCenter in workCenters)
             *      {
             *          if (workCenter != workCenters.Last())
             *          {
             *              int count = realSnapshot.RealLots.Where(x => x.LotActivity.WorkStation == workCenter).Count();
             *              writer.Write($"{count},");
             *          }
             *          else
             *          {
             *              int count = realSnapshot.RealLots.Where(x => x.LotActivity.WorkStation == workCenter).Count();
             *              writer.Write($"{count}\n");
             *          }
             *      }
             *  }
             * }
             *
             * writer.Close();
             */


            /// //////////////////////////////////////////////
            /// SnapShots IRD Queue Lengths //////////////////

            DateTime date             = new DateTime(2019, 6, 1);
            int      monthsToEvaluate = 12;

            string inputDir = @"C:\CSSLWaferFab\Input\";

            string outputDir = @"C:\CSSLWaferFab\Output";

            string parameters = @"FittedEPTParameters - 2019-06-01.csv";


            AutoDataReader   autoDataReader   = new AutoDataReader(inputDir + @"CSVs\", inputDir + @"SerializedFiles\");
            WaferFabSettings waferFabSettings = autoDataReader.ReadWaferFabSettings(parameters, true, false);

            List <string> orderedLotSteps = new List <string>();

            foreach (var step in waferFabSettings.LotSteps.OrderBy(x => x.Value.Id))
            {
                orderedLotSteps.Add(step.Key);
            }

            //Write headers
            StreamWriter writer = new StreamWriter(Path.Combine(outputDir, "Snapshots", $"Snapshots IRD Wafers - {date.Year}-{date.Month}-{date.Day}.txt"));

            writer.Write("Time,");
            foreach (string lotStep in orderedLotSteps)
            {
                if (lotStep != orderedLotSteps.Last())
                {
                    writer.Write($"{lotStep},");
                }
                else
                {
                    writer.Write($"{lotStep}\n");
                }
            }

            RealSnapshotReader realSnapshotReader = new RealSnapshotReader();

            for (int j = 0; j < monthsToEvaluate; j++)
            {
                DateTime n = date.AddMonths(j);
                DateTime m = date.AddMonths(j + 1);

                string filename = inputDir + @$ "SerializedFiles\RealSnapShots_{n.Year}-{n.Month}-{n.Day}_{m.Year}-{m.Month}-{m.Day}_1h.dat";
                realSnapshotReader.Read(filename, 1);

                List <RealSnapshot> realSnaphshots = new List <RealSnapshot>();
                if (j == 0)
                {
                    realSnaphshots = realSnapshotReader.RealSnapshots;
                }
                else
                {
                    realSnaphshots = realSnapshotReader.RealSnapshots.Skip(1).ToList();
                }

                //Write Data
                foreach (RealSnapshot realSnapshot in realSnaphshots)
                {
                    writer.Write($"{realSnapshot.Time},");
                    foreach (string lotStep in orderedLotSteps)
                    {
                        if (lotStep != orderedLotSteps.Last())
                        {
                            if (realSnapshot.LotSteps.Contains(lotStep))
                            {
                                List <RealLot> realLots   = realSnapshot.RealLots.Where(x => x.IRDGroup == lotStep).ToList();
                                int            nrOfWafers = 0;
                                for (int k = 0; k < realLots.Count(); k++)
                                {
                                    nrOfWafers += realLots[k].Qty;
                                }
                                writer.Write($"{nrOfWafers},");
                            }
                            else
                            {
                                writer.Write("0,");
                            }
                        }
                        else
                        {
                            if (realSnapshot.LotSteps.Contains(lotStep))
                            {
                                List <RealLot> realLots   = realSnapshot.RealLots.Where(x => x.IRDGroup == lotStep).ToList();
                                int            nrOfWafers = 0;
                                for (int k = 0; k < realLots.Count(); k++)
                                {
                                    nrOfWafers += realLots[k].Qty;
                                }
                                writer.Write($"{nrOfWafers}\n");
                            }
                            else
                            {
                                writer.Write("0\n");
                            }
                        }
                    }
                }
            }

            writer.Close();



            /// //////////////////////////////////////////////
            /// SnapShots IRD Queue Lengths //////////////////

            /*
             * DateTime i = new DateTime(2019, 10, 1);
             *
             * string inputDir = @"E:\OneDrive - Nexperia\CSSLWaferFab\Input\";
             *
             * string outputDir = $@"C:\CSSLWaferFab\Output";
             *
             *
             * AutoDataReader autoDataReader = new AutoDataReader(inputDir + @"CSVs\", inputDir + @"SerializedFiles\");
             * WaferFabSettings waferFabSettings = autoDataReader.ReadWaferFabSettings(true, false);
             * List<string> orderedLotSteps = new List<string>();
             * foreach (var step in waferFabSettings.LotSteps.OrderBy(x => x.Value.Id))
             * {
             *  orderedLotSteps.Add(step.Key);
             * }
             *
             * // Write headers
             * StreamWriter writer = new StreamWriter(Path.Combine(outputDir, "Snapshots", $"Snapshots IRD Lots - {i.Year}-{i.Month}-{i.Day}.txt"));
             * writer.Write("Time,");
             * foreach (string lotStep in orderedLotSteps)
             * {
             *  if (lotStep != orderedLotSteps.Last())
             *  {
             *      writer.Write($"{lotStep},");
             *  }
             *  else
             *  {
             *      writer.Write($"{lotStep}\n");
             *  }
             * }
             *
             * RealSnapshotReader realSnapshotReader = new RealSnapshotReader();
             * for (int j = 0; j < 2; j++)
             * {
             *  string filename = inputDir + @$"SerializedFiles\RealSnapShots_{i.Year}-{i.Month + j}-{i.Day}_{i.Year}-{i.Month + 1 + j}-{i.Day}_1h.dat";
             *  realSnapshotReader.Read(filename, 1);
             *
             *  List<RealSnapshot> realSnaphshots = new List<RealSnapshot>();
             *  if (j == 0)
             *  {
             *      realSnaphshots = realSnapshotReader.RealSnapshots;
             *  }
             *  else
             *  {
             *      realSnaphshots = realSnapshotReader.RealSnapshots.Skip(1).ToList();
             *  }
             *
             *  // Write Data
             *  foreach (RealSnapshot realSnapshot in realSnaphshots)
             *  {
             *      writer.Write($"{realSnapshot.Time},");
             *      foreach (string lotStep in orderedLotSteps)
             *      {
             *          if (lotStep != orderedLotSteps.Last())
             *          {
             *              if (realSnapshot.LotSteps.Contains(lotStep))
             *              {
             *                  int count = realSnapshot.RealLots.Where(x => x.IRDGroup == lotStep).Count();
             *                  writer.Write($"{count},");
             *              }
             *              else
             *              {
             *                  writer.Write("0,");
             *              }
             *          }
             *          else
             *          {
             *              if (realSnapshot.LotSteps.Contains(lotStep))
             *              {
             *                  int count = realSnapshot.RealLots.Where(x => x.IRDGroup == lotStep).Count();
             *                  writer.Write($"{count}\n");
             *              }
             *              else
             *              {
             *                  writer.Write("0\n");
             *              }
             *          }
             *      }
             *  }
             * }
             *
             * writer.Close();
             *
             *
             *
             * /// ///////////////////////////////////////////////////
             * /// Gamma analysis ///////////////////////////////
             * /*
             * bool write = true;
             *
             * GammaDistribution gammaDistribution = new GammaDistribution(90, 72900);
             * double alpha = 0.11;
             * double beta = 0.001235;
             *
             * Console.WriteLine("{0}, {1}", gammaDistribution.Alpha, gammaDistribution.Beta);
             * List<double> values = new List<double>();
             * double sumx = 0;
             * double sumxx = 0;
             * double sumw = 0;
             *
             * for (int i = 0; i < 1000000; i++)
             * {
             *  double value = gammaDistribution.Next();
             *  values.Add(value);
             *  sumx += value;
             *  sumxx += value * value;
             *  sumw += 1;
             * }
             *
             * double mean = sumx / sumw;
             * double variance = sumxx / sumw - sumx / sumw * sumx / sumw;
             * double stdev = Math.Sqrt(variance);
             *
             * Console.WriteLine("{0}, {1}, {2}", mean, variance, stdev);
             * Console.WriteLine("{0}, {1}", gammaDistribution.Alpha, gammaDistribution.Beta);
             * if (write)
             * {
             *  using (StreamWriter writer = new StreamWriter(@$"E:\OneDrive - Nexperia\OUTPUT\Python\Gamma Test\Alpha = {alpha}, Beta = {beta}.txt"))
             *  {
             *      writer.WriteLine("Gamma rvs");
             *
             *      foreach (double i in values)
             *      {
             *          writer.WriteLine(i);
             *      }
             *  }
             * }
             */

            /// ///////////////////////////////////////////////////
            /// Read Queue lengths ///////////////////////////////

            /*
             * DateTime initialDateTime = new DateTime(2019, 4, 1);
             *
             * DateTime finalDateTime = new DateTime(2022, 4, 1);
             *
             * string DirectorySerializedFiles = @"E:\OneDrive - Nexperia\CSSLWaferFab\Input\SerializedFiles";
             *
             * string outputDirectory = $@"C:\CSSLWaferFab\LotActivities\{initialDateTime.ToString("yyyy-MM-dd")}";
             *
             * List<WorkCenterLotActivities> workCenterLotActivities = Deserializer.DeserializeWorkCenterLotActivities(Path.Combine(DirectorySerializedFiles, "WorkCenterLotActivities_2019_2020.dat"));
             *
             * //string wc = "PHOTOLITH";
             *
             * 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"};
             *
             *
             * foreach (string wc in workCenters)
             * {
             *  List<Tuple<DateTime, int>> queueLengths = workCenterLotActivities.Where(x => x.WorkCenter == wc).First()
             *      .WIPTrace.Where(x => x.Item1 >= initialDateTime && x.Item1 <= finalDateTime).OrderBy(x => x.Item1).ToList();
             *
             *  // Write all results to a text file
             *  using (StreamWriter writer = new StreamWriter(Path.Combine(outputDirectory, $"{wc}_QueueLength.txt")))
             *  {
             *      writer.WriteLine("Time,QueueLength");
             *
             *      foreach (Tuple<DateTime, int> queueLength in queueLengths)
             *      {
             *          writer.WriteLine(queueLength.Item1 + "," + queueLength.Item2);
             *      }
             *  }
             * }
             */
        }
Exemple #17
0
        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);
            }
        }
Exemple #18
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
            }
        }
Exemple #19
0
        public static void WriteLotActivitiesWithEPTsToCSV(AutoDataReader reader, string serializedLotTracesFile, string filenameCSVOutput)
        {
            reader.LotTraces = Deserializer.DeserializeLotTraces(Path.Combine(reader.DirectorySerializedFiles, serializedLotTracesFile));

            reader.WriteLotActivitiesToCSV(filenameCSVOutput);
        }