Beispiel #1
0
        public LibraRequest BuildRequest()
        {
            if (string.IsNullOrEmpty(Expressions))
            {
                throw new LibraException("Expressionsが空です");
            }

            try {
                SqliteFile = FilePath.FilePath.Expand(SqliteFile);
            }
            catch (NullReferenceException) {
                throw new LibraException($"SQLiteへのパスが空です");
            }

            if (!File.Exists(SqliteFile))
            {
                throw new LibraException($"SQLiteファイル {SqliteFile} が見つかりません");
            }

            var seed = ParseRangeRequest(Seed, ',');

            if (string.IsNullOrEmpty(SweepStart))
            {
                throw new NullReferenceException(nameof(SweepStart));
            }

            if (string.IsNullOrEmpty(Sweep))
            {
                throw new NullReferenceException(nameof(Sweep));
            }
            return(new LibraRequest(
                       Expressions, seed, Sweep, SweepStart.ParseLongWithSiPrefix(), SqliteFile));
        }
Beispiel #2
0
        public void Run(CancellationToken token)
        {
            var log = new Logger.Logger();

            // TimeList
            var plotTimeList = GeneratePlotTimeEnumerable(PlotTimeRequest, TimeString).ToList();

            // Configのデフォルトも見る
            var transistors = this.Bind(Config.Config.Instance.ArgoDefault.Transistors);

            if (string.IsNullOrEmpty(NetList) && string.IsNullOrEmpty(Config.Config.Instance.ArgoDefault.NetList))
            {
                throw new AriesException("NetListを空にできません.一番目の引数もしくはコンフィグファイルのArgoDefault.NetListで指定してください");
            }

            // 引数で与えたNetListが優先
            NetList = FilePath.FilePath.Expand(
                string.IsNullOrEmpty(NetList)
                    ? Config.Config.Instance.ArgoDefault.NetList
                    : NetList);

            var guid = Guid.NewGuid();

            // タスクファイルを保存してるディレクトリへのパスを展開
            var baseDir = Path.Combine(Config.Config.Instance.WorkingRoot, "aries", "task");

            if (!Directory.Exists(baseDir))
            {
                Directory.CreateDirectory(baseDir);
            }

            if (!File.Exists(NetList))
            {
                throw new AriesException($"Netlistファイルが見つかりません: {NetList}");
            }

            HspicePath = string.IsNullOrEmpty(HspicePath)
                ? Environment.GetEnvironmentVariable(Argo.Argo.EnvArgoHspice)
                : HspicePath;


            if (string.IsNullOrEmpty(HspicePath) || !File.Exists(HspicePath))
            {
                throw new ArgoException($"Hspice can not found: {HspicePath}");
            }

            try {
                var totalSweep = TotalSweeps.ParseLongWithSiPrefix();
                var seed       = Seed.ParseLongWithSiPrefix();
                var start      = SweepStart.ParseLongWithSiPrefix();

                var include = new[] {
                    Includes,
                    Config.Config.Instance.ArgoDefault.Includes,
                    Environment.GetEnvironmentVariable(Argo.Argo.EnvArgoIncludes)
                    ?.Split(',', StringSplitOptions.RemoveEmptyEntries)
                };


                var baseRequest = new ArgoRequest {
                    GroupId = guid, Gnd = Gnd.ParseDecimalWithSiPrefix(),

                    // Includesは引数、コンフィグ、環境変数のうち最初にNullじゃないやつを選ぶ。全部Nullなら空のリスト
                    Includes = include.Any(s => s.Any()) ? include.First(s => s.Any()).ToList() : new List <string>(),
                    Seed     = seed,
                    // Signalsは引数がNullならコンフィグを選ぶ
                    Signals       = (Signals ?? Config.Config.Instance.ArgoDefault.Signals).ToList(),
                    Sweep         = totalSweep,
                    Temperature   = Temperature.ParseDecimalWithSiPrefix(), Time = new RangeParameter(TimeString),
                    Transistors   = transistors,
                    Vdd           = Vdd.ParseDecimalWithSiPrefix(),
                    HspiceOptions = Options.ToList(), HspicePath = HspicePath,
                    IcCommands    = IcCommands.ToList(), NetList = NetList, SweepStart = start,
                    PlotTimeList  = plotTimeList
                };

                //var dbName = baseRequest.GetHashString();
                //baseRequest.ResultFile = dbName;
                if (SplitOption == "none")
                {
                    WriteTaskFile(Path.Combine(baseDir, $"{guid}.json"), baseRequest);
                }
                else
                {
                    var(by, size) = SplitOption.Split(':', StringSplitOptions.RemoveEmptyEntries) switch {
                        var s when s.Length != 2 => throw new AriesException(
                                  "SplitOptionに与えた引数がフォーマットに従っていません.[seed, sweep]:[size]"),
                              var s when s[1] == "0" => throw new AriesException("[size]に0を指定できません"),