Beispiel #1
0
        /// <summary>
        /// Replace ckt-> stuff
        /// </summary>
        /// <param name="code">The code</param>
        /// <returns></returns>
        private string ApplyCircuit(string code, string ckt = "ckt", string state = "state", string rstate = "rstate", string method = "method")
        {
            // States
            Regex sr = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTstate(?<state>\d+)\s*\+\s*(?<var>\w+)\s*\)");

            code = sr.Replace(code, (Match m) => $"{state}.States[{m.Groups["state"].Value}][{states} + {m.Groups["var"].Value}]");

            // Old solution
            Regex oldsol = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTrhsOld\s*\+\s*(?<node>\w+)\s*\)");

            code = oldsol.Replace(code, (Match m) => $"{rstate}.OldSolution[{m.Groups["node"].Value}]");

            // RHS vector
            Regex rhs = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTrhs\s*\+\s*(?<node>\w+)\s*\)");

            code = rhs.Replace(code, (Match m) => $"{rstate}.Rhs[{m.Groups["node"].Value}]");

            // Integration slope
            code = Regex.Replace(code, $@"{ckt}\s*\-\>\s*CKTag\s*\[\s*0\s*\]", $"{method}.Slope");

            // Find temperature stuff
            code = Regex.Replace(code, @"ckt\s*\-\>\s*CKTtemp", "ckt.State.Temperature");
            code = Regex.Replace(code, @"ckt\s*\-\>\s*CKTnomTemp", "ckt.State.NominalTemperature");

            // Nodes
            foreach (string n in matrixnodes.Keys)
            {
                // Remove from the variables of the load method
                DeviceVariablesExtra.Remove(n);

                // Replace the nodes
                Regex mn = new Regex($@"\*\s*\(\s*{n}\s*\)");
                code = mn.Replace(code, (Match m) => $"{rstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}]");
            }
            code = Regex.Replace(code, $@"\((?<mat>{rstate}\.[^;]+)\);", (Match m) => m.Groups["mat"].Value + ";");

            // Apply state logic
            code = ApplyStateLogic(code, ckt, state, method);

            // -> Is never possible, so let's go for dots
            code = Regex.Replace(code, @"\s*\-\>\s*", ".");

            return(code);
        }
Beispiel #2
0
        /// <summary>
        /// Replace ckt-> stuff
        /// </summary>
        /// <param name="code">The code</param>
        /// <returns></returns>
        private string ApplyCircuit(string code, string ckt = "ckt", string state = "state", string cstate = "cstate")
        {
            Regex sr = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTstate(?<state>\d+)\s*\+\s*(?<var>\w+)\s*\)");

            code = sr.Replace(code, (Match m) => $"{state}.States[{m.Groups["state"].Value}][{states} + {m.Groups["var"].Value}]");

            code = Regex.Replace(code, $@"{ckt}\s*\-\>\s*CKTomega", "cstate.Laplace");

            // Nodes
            foreach (string n in matrixnodes.Keys)
            {
                // Remove from the variables of the load method
                DeviceVariablesExtra.Remove(n);

                // Replace the nodes
                Regex mn = new Regex($@"\*\s*\(\s*{n}\s*\)");
                code = mn.Replace(code, (Match m) => $"{cstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}]");
                Regex cmn = new Regex($@"\*\s*\(\s*{n}\s*\+\s*1\s*\)");
                code = cmn.Replace(code, (Match m) => $"{cstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}].Imag");
            }

            return(code);
        }
Beispiel #3
0
        /// <summary>
        /// Replace ckt-> stuff
        /// </summary>
        /// <param name="code">The code</param>
        /// <returns></returns>
        private string ApplyCircuit(string code, string ckt = "ckt", string state = "state", string rstate = "rstate")
        {
            Regex sr = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTstate(?<state>\d+)\s*\+\s*(?<var>\w+)\s*\)");

            code = sr.Replace(code, (Match m) => $"{state}.States[{m.Groups["state"].Value}][{states} + {m.Groups["var"].Value}]");

            Regex oldsol = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTrhs(?<old>(Old)?)\s*\+\s*(?<node>\w+)\s*\)");

            code = oldsol.Replace(code, (Match m) => $"{rstate}.{m.Groups["old"].Value}Solution[{m.Groups["node"].Value}]");

            // Nodes
            foreach (string n in matrixnodes.Keys)
            {
                // Remove from the variables of the load method
                DeviceVariablesExtra.Remove(n);

                // Replace the nodes
                Regex mn = new Regex($@"\*\s*\(\s*{n}\s*\)");
                code = mn.Replace(code, (Match m) => $"{rstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}]");
            }

            return(code);
        }
Beispiel #4
0
        /// <summary>
        /// Replace ckt-> stuff
        /// </summary>
        /// <param name="code">The code</param>
        /// <returns></returns>
        private string ApplyCircuit(string code, string ckt = "ckt", string state = "state", string cstate = "cstate", string method = "method")
        {
            Regex sr = new Regex($@"\*\s*\(\s*{ckt}\s*\-\>\s*CKTstate(?<state>\d+)\s*\+\s*(?<var>\w+)\s*\)");

            code = sr.Replace(code, (Match m) => $"{state}.States[{m.Groups["state"].Value}][{states} + {m.Groups["var"].Value}]");

            code = Regex.Replace(code, $@"{ckt}\s*\-\>\s*CKTomega", "cstate.Laplace.Imaginary");

            // Nodes
            foreach (string n in matrixnodes.Keys)
            {
                // Remove from the variables of the load method
                DeviceVariablesExtra.Remove(n);

                // Replace the nodes
                Regex mn = new Regex($@"\*\s*\(\s*{n}\s*\)");
                code = mn.Replace(code, (Match m) => $"{cstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}]");
                Regex cmn = new Regex($@"\*\s*\(\s*{n}\s*\+\s*1\s*\)");
                code = cmn.Replace(code, (Match m) => $"{cstate}.Matrix[{matrixnodes[n].Item1}, {matrixnodes[n].Item2}].Imag");
            }

            // Basic state logic
            code = Regex.Replace(code, $@"(?<not>\!)?\({ckt}\s*\-\>\s*CKTmode\s*&\s*(?<flag>\w+)\)", (Match m) =>
            {
                string result = "";

                bool invert = m.Groups["not"].Success;
                switch (m.Groups["flag"].Value)
                {
                case "MODETRAN":
                    result = $"({method} {(invert ? "!=" : "==")} null)";
                    break;

                case "MODETRANOP":
                    result = $"{(invert ? "!" : "")}({state}.Domain == CircuitState.DomainTypes.Time && {state}.UseDC)";
                    break;

                case "MODEINITTRAN":
                    result = (invert ? "!" : "") + $"({method} != null && {method}.SavedTime == 0.0)";
                    break;

                case "MODEDCOP":
                    result = (invert ? "!" : "") + $"{state}.UseDC";
                    break;

                case "MODEINITSMSIG":
                    result = (invert ? "!" : "") + $"{state}.UseSmallSignal";
                    break;

                case "MODEDCTRANCURVE":
                    result = $"({state}.Domain {(invert ? "!=" : "==")} CircuitState.DomainTypes.None";
                    break;

                case "MODEUIC":
                    result = (invert ? "!" : "") + $"{state}.UseIC";
                    break;

                case "MODEAC":     // Never reached...
                    result = "true";
                    break;

                case "MODEINITJCT":
                    result = $"({state}.Init {(invert ? "!=" : "==")} CircuitState.InitFlags.InitJct)";
                    break;

                case "INITFLOAT":
                    result = $"({state}.Init {(invert ? "!=" : "==")} CircuitState.InitFlags.InitFloat)";
                    break;

                case "MODEINITFIX":
                    result = $"({state}.Init {(invert ? "!=" : "==")} CircuitState.InitFlags.InitFix)";
                    break;

                default:
                    result = m.Value;
                    break;
                }

                return(result);
            });
            code = Regex.Replace(code, $@"(?<not>\!)?\({ckt}\s*\-\>\s*CKTmode\s*&\s*\(\s*(?<flag>\w+)(\s*\|\s*(?<flag>\w+))*\)", (Match m) =>
            {
                // This is an OR for all the flags...
                string result               = "";
                HashSet <string> flags      = new HashSet <string>();
                HashSet <string> conditions = new HashSet <string>();
                foreach (Capture c in m.Groups["flag"].Captures)
                {
                    flags.Add(c.Value);
                }

                // MODEDC = MODEDCOP | MODETRANOP | MODEDCTRANCURVE
                if (flags.Contains("MODEDC"))
                {
                    flags.Remove("MODEDC");
                    flags.Add("MODEDCOP");
                    flags.Add("MODETRANOP");
                    flags.Add("MODEDCTRANCURVE");
                }

                // INITF = MODEINITFLOAT | MODEINITJCT | MODEINITFIX | MODEINITSMSIG | MODEINITTRAN | MODEINITPRED
                if (flags.Contains("INITF"))
                {
                    flags.Remove("INITF");
                    flags.Add("MODEINITFLOAT");
                    flags.Add("MODEINITJCT");
                    flags.Add("MODEINITFIX");
                    flags.Add("MODEINITSMSIG");
                    flags.Add("MODEINITTRAN");
                }

                // MODETRAN | MODETRANOP = (Domain == Time)
                if (flags.Contains("MODETRAN") && flags.Contains("MODETRANOP"))
                {
                    flags.Remove("MODETRAN");
                    flags.Remove("MODETRANOP");
                    flags.Add("TIMEDOMAIN");
                }

                // MODETRAN | MODEINITTRAN = MODEINITTRAN
                if (flags.Contains("MODEINITTRAN") && flags.Contains("MODETRAN"))
                {
                    flags.Remove("MODETRAN");
                }

                // MODEUIC = UseIC, but SpiceSharp will prioritize this variable in the following way:
                // - MODETRANOP + MODEUIC = MODEUIC
                // - MODETRAN + MODEUIC = MODEUIC
                if (flags.Contains("MODEUIC"))
                {
                    if (flags.Contains("MODETRANOP"))
                    {
                        flags.Remove("MODETRANOP");
                    }
                    if (flags.Contains("MODETRAN"))
                    {
                        flags.Remove("MODETRAN");
                    }
                }

                // Ignored flags
                if (flags.Contains("MODEAC"))
                {
                    flags.Remove("MODEAC");
                }
                if (flags.Contains("MODEINITPRED"))
                {
                    flags.Remove("MODEINITPRED");
                }

                // Build the conditions
                foreach (var flag in flags)
                {
                    switch (flag)
                    {
                    case "MODEUIC": conditions.Add($"{state}.UseIC"); break;

                    case "MODETRAN": conditions.Add($"{method} != null"); break;

                    case "MODETRANOP": conditions.Add($"({state}.Domain == CircuitState.DomainTypes.Time && {state}.UseDC)"); break;

                    case "MODEINITTRAN": conditions.Add($"({method} != null && {method}.SavedTime == 0.0)"); break;

                    case "MODEDCOP": conditions.Add($"{state}.UseDC"); break;

                    case "MODEINITSMSIG": conditions.Add($"{state}.UseSmallSignal"); break;

                    case "MODEDCTRANCURVE": conditions.Add($"{state}.Domain == CircuitState.DomainTypes.None"); break;

                    case "MODEINITJCT": conditions.Add($"{state}.Init == CircuitState.InitFlags.InitJct"); break;

                    case "MODEINITFLOAT": conditions.Add($"{state}.Init == CircuitState.InitFlags.InitFloat"); break;

                    case "MODEINITFIX": conditions.Add($"{state}.Init == CircuitState.InitFlags.InitFix"); break;

                    default:
                        // Cannot convert!
                        return(m.Value);
                    }
                }

                // Construct the conditions
                if (m.Groups["not"].Success)
                {
                    result = "!(" + string.Join(" || ", conditions);
                }
                else
                {
                    result = "(" + string.Join(" || ", conditions);
                }
                return(result);
            });

            // -> Is never possible, so let's go for dots
            code = Regex.Replace(code, @"\s*\-\>\s*", ".");

            return(code);
        }