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)); }
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を指定できません"),