/** * FIXME this code is an ugly piece of shit, fix it! */ void sim_settings_show (GtkWidget *widget, SchematicView *sv) { int i; gboolean found; gint rc, active, index; GtkWidget *toplevel, *w, *w1, *pbox, *combo_box; GtkTreeView *opt_list; GtkCellRenderer *cell_option, *cell_value; GtkTreeViewColumn *column_option, *column_value; GtkListStore *opt_model; GtkTreeIter treeiter; GtkBuilder *builder; GError *e = NULL; SimSettings *s; GList *iter; GList *voltmeters = NULL; GList *voltmeters_with_type = NULL; GList *sources = NULL; GList *sources_ac = NULL; GtkComboBox *node_box; GtkListStore *node_list_store; gchar *text, *text2; gchar **node_ids; GSList *slist = NULL; g_return_if_fail (sv != NULL); Schematic *sm = schematic_view_get_schematic (sv); SimSettingsGui *s_gui = schematic_get_sim_settings_gui (sm); s = s_gui->sim_settings; // Only allow one instance of the property box per schematic. if (s_gui->pbox != NULL) { if (gtk_widget_get_visible (s_gui->pbox) == FALSE) { gtk_widget_set_visible (s_gui->pbox, TRUE); } GdkWindow *window = gtk_widget_get_window (s_gui->pbox); g_assert (window != NULL); gdk_window_raise (window); return; } if ((builder = gtk_builder_new ()) == NULL) { log_append (schematic_get_log_store (sm), _ ("SimulationSettings"), _ ("Could not create simulation settings dialog")); return; } gtk_builder_set_translation_domain (builder, NULL); gtk_builder_add_from_file (builder, OREGANO_UIDIR "/sim-settings.ui", &e); if (e) { log_append_error (schematic_get_log_store (sm), _ ("SimulationSettings"), _ ("Could not create simulation settings dialog due to " "missing " OREGANO_UIDIR "/sim-settings.ui file"), e); g_clear_error (&e); return; } toplevel = GTK_WIDGET (gtk_builder_get_object (builder, "toplevel")); if (toplevel == NULL) { log_append (schematic_get_log_store (sm), _ ("SimulationSettings"), _ ("Could not create simulation settings dialog due to missing " "\"toplevel\" widget in " OREGANO_UIDIR "/sim-settings.ui file")); return; } pbox = toplevel; s_gui->pbox = pbox; s_gui->notebook = GTK_NOTEBOOK (gtk_builder_get_object (builder, "notebook")); g_signal_connect (G_OBJECT (pbox), "delete_event", G_CALLBACK (delete_event_cb), s_gui); // Prepare options list s_gui->w_opt_value = GTK_ENTRY (gtk_builder_get_object (builder, "opt_value")); opt_list = GTK_TREE_VIEW (gtk_builder_get_object (builder, "option_list")); s_gui->w_opt_list = opt_list; // Grab the frames s_gui->w_trans_frame = GTK_WIDGET (gtk_builder_get_object (builder, "trans_frame")); s_gui->w_ac_frame = GTK_WIDGET (gtk_builder_get_object (builder, "ac_frame")); s_gui->w_dcsweep_frame = GTK_WIDGET (gtk_builder_get_object (builder, "dcsweep_frame")); s_gui->w_fourier_frame = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_frame")); s_gui->w_noise_frame = GTK_WIDGET (gtk_builder_get_object (builder, "noise_frame")); // Create the Columns cell_option = gtk_cell_renderer_text_new (); cell_value = gtk_cell_renderer_text_new (); column_option = gtk_tree_view_column_new_with_attributes (N_ ("Option"), cell_option, "text", 0, NULL); column_value = gtk_tree_view_column_new_with_attributes (N_ ("Value"), cell_value, "text", 1, NULL); // Create the model opt_model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model (opt_list, GTK_TREE_MODEL (opt_model)); gtk_tree_view_append_column (opt_list, column_option); gtk_tree_view_append_column (opt_list, column_value); if (s->options == NULL) { // Load defaults for (i = 0; default_options[i].name; i++) { gtk_list_store_append (opt_model, &treeiter); gtk_list_store_set (opt_model, &treeiter, 0, default_options[i].name, -1); } } else { // Load schematic options for (iter = s->options; iter; iter = iter->next) { SimOption *so = iter->data; if (so) { gtk_list_store_append (opt_model, &treeiter); gtk_list_store_set (opt_model, &treeiter, 0, so->name, -1); } } } // Set the options already stored for (iter = s->options; iter; iter = iter->next) { SimOption *so = iter->data; if (so) set_options_in_list (so->name, so->value, opt_list); } g_signal_connect (G_OBJECT (opt_list), "button_release_event", G_CALLBACK (select_opt_callback), s); w = GTK_WIDGET (gtk_builder_get_object (builder, "opt_accept")); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (option_setvalue), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "opt_remove")); w = GTK_WIDGET (gtk_builder_get_object (builder, "add_option")); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (option_remove), s_gui); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (add_option), s_gui); // Creation of Close Button w = GTK_WIDGET (gtk_builder_get_object (builder, "button1")); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (response_callback), sv); // Get the list of voltmeters (normal mode) rc = get_voltmeters_list(&voltmeters, sm, e, FALSE); if (rc) { sim_settings_set_dc(s, FALSE); sim_settings_set_fourier(s, FALSE); } // Get the list of voltmeters (AC mode, i.e. with measurement type) rc = get_voltmeters_list(&voltmeters_with_type, sm, e, TRUE); if (rc) { sim_settings_set_ac(s, FALSE); } // Get the list of sources (all types) rc = get_voltage_sources_list(&sources, sm, e, FALSE); if (rc) { sim_settings_set_dc(s, FALSE); } // Get the list of AC sources rc = get_voltage_sources_list(&sources_ac, sm, e, TRUE); if (rc) { sim_settings_set_noise(s, FALSE); } // Transient // // ********* // w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_start")); s_gui->w_trans_start = w; if (s->trans_start) gtk_entry_set_text (GTK_ENTRY (w), s->trans_start); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_stop")); s_gui->w_trans_stop = w; if (s->trans_stop) gtk_entry_set_text (GTK_ENTRY (w), s->trans_stop); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_step")); s_gui->w_trans_step = w; if (s->trans_step) gtk_entry_set_text (GTK_ENTRY (w), s->trans_step); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_enable")); s_gui->w_trans_enable = w; g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (trans_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_enable); w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_step_enable")); s_gui->w_trans_step_enable = w; g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (trans_step_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_step_enable); // get the gui element w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_init_cond")); // save the gui element to struct s_gui->w_trans_init_cond = w; // Set checkbox enabled, if trans_init_cond equal true. // trans_init_cond could be set to true because // - user opened the settings dialog some seconds ago and has set the checkbox // - user opened old file in which there was set the checkbox state to true gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_init_cond); // get the gui element w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_analyze_all")); // save the gui element to struct s_gui->w_trans_analyze_all = w; // Set checkbox enabled, if trans_analyze_all equal true. // trans_init_cond could be set to true because // - user opened the settings dialog some seconds ago and has set the checkbox // - user opened old file in which there was set the checkbox state to true gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_analyze_all); // AC // // *** // w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_enable")); s_gui->w_ac_enable = w; g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (ac_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->ac_enable); w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid14")); // FIXME: Should enable more than just one output as in the Fourier analysis w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_vout")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1); s_gui->w_ac_vout = combo_box; if (voltmeters_with_type) { index = 0; active = 0; for (iter = voltmeters_with_type; iter; iter = iter->next) { if (g_strcmp0 (iter->data, "VM(0)")) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data); if (!g_strcmp0(s->ac_vout, iter->data)) active = index; index++; } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s); // Initialisation of the various scale types w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_type")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1); s_gui->w_ac_type = combo_box; { index = 0; active = 0; for (; scale_types_list[index] != NULL; index++) { gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), scale_types_list[index]); if (!g_strcmp0(s->ac_type, scale_types_list[index])) active = index; } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_assert (GTK_IS_COMBO_BOX (combo_box)); g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_npoints")); s_gui->w_ac_npoints = w; gtk_entry_set_text (GTK_ENTRY (w), s->ac_npoints); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_start")); s_gui->w_ac_start = w; gtk_entry_set_text (GTK_ENTRY (w), s->ac_start); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_stop")); s_gui->w_ac_stop = w; gtk_entry_set_text (GTK_ENTRY (w), s->ac_stop); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); // DC // // ***** // w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_enable")); s_gui->w_dc_enable = w; g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (dc_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->dc_enable); w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid13")); w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_vin")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1); s_gui->w_dc_vin = combo_box; if (sources) { index = 0; active = 0; for (iter = sources; iter; iter = iter->next) { gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data); if (!g_strcmp0(s->dc_vin, iter->data)) active = index; index++; } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s); // FIXME: Should enable more than just one output as in the Fourier analysis // FIXME: Should also allow to print currents through voltage sources w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_vout")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1); s_gui->w_dc_vout = combo_box; if (voltmeters) { index = 0; active = 0; text = g_strdup_printf("V(%s)", s->dc_vout); for (iter = voltmeters; iter; iter = iter->next) { if (g_strcmp0 (iter->data, "V(0)")) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data); if (!g_strcmp0(text, iter->data)) active = index; index++; } g_free (text); gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_start")); s_gui->w_dc_start = w; gtk_entry_set_text (GTK_ENTRY (w), s->dc_start); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_stop")); s_gui->w_dc_stop = w; gtk_entry_set_text (GTK_ENTRY (w), s->dc_stop); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_step")); s_gui->w_dc_step = w; gtk_entry_set_text (GTK_ENTRY (w), s->dc_step); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); // Fourier // // ******* // g_print ("XXXXXXXXXXXXXXXX\n"); w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_enable")); s_gui->w_four_enable = w; g_print ("XXXXXXXXXXXXXXXX %p %s\n", w, s->fourier_enable ? "TRUE" : "FALSE"); g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (fourier_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->fourier_enable); w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_freq")); s_gui->w_four_freq = w; g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); gtk_entry_set_text (GTK_ENTRY (w), s->fourier_frequency); w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_vout")); s_gui->w_four_vout = w; g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); // Get rid of inexistent output vectors text2 = NULL; if (voltmeters) { text = sim_settings_get_fourier_vout (s); node_ids = g_strsplit (text, " ", 0); g_free (text); for (i = 0; node_ids[i] != NULL; i++) { text = g_strdup_printf ("V(%s)", node_ids[i]); found = FALSE; for (iter = voltmeters; iter; iter = iter->next) { if (!g_strcmp0 (text, iter->data)) found = TRUE; } g_free (text); if (found) { if (text2) { text = text2; text2 = g_strdup_printf ("%s %s", text2, node_ids[i]); g_free (text); } else { text2 = g_strdup_printf ("%s", node_ids[i]); } } } if (!text2) text2 = g_strdup (""); sim_settings_set_fourier_vout (s, text2); g_free (text2); g_strfreev (node_ids); } text = NULL; slist = g_slist_copy (s->fourier_vout); if (slist) { if (slist->data && atoi (slist->data) > 0) text = g_strdup_printf ("V(%d)", atoi (slist->data)); slist = slist->next; } while (slist) { if (slist->data && atoi (slist->data) > 0) { if (text) { text2 = text; text = g_strdup_printf ("%s V(%d)", text, atoi (slist->data)); g_free (text2); } else { text = g_strdup_printf ("V(%d)", atoi (slist->data)); } } slist = slist->next; } if (text) gtk_entry_set_text (GTK_ENTRY (w), text); else gtk_entry_set_text (GTK_ENTRY (w), ""); g_slist_free_full (slist, g_free); // Present in the combo box the nodes of the schematic w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_select_out")); gtk_widget_destroy (w); // FIXME wtf??? w = GTK_WIDGET (gtk_builder_get_object (builder, "grid12")); combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w), combo_box, 2, 2, 1, 1); s_gui->w_four_combobox = combo_box; node_box = GTK_COMBO_BOX (combo_box); node_list_store = GTK_LIST_STORE (gtk_combo_box_get_model (node_box)); gtk_list_store_clear (node_list_store); if (voltmeters) { for (iter = voltmeters; iter; iter = iter->next) { if (g_strcmp0 (iter->data, "V(0)")) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (node_box), iter->data); } gtk_combo_box_set_active (GTK_COMBO_BOX (node_box), 0); } g_signal_connect (G_OBJECT (node_box), "changed", G_CALLBACK (entry_changed_cb), s); w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_add")); s_gui->w_four_add = w; g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (fourier_add_vout_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_rem")); s_gui->w_four_rem = w; g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (fourier_remove_vout_cb), s_gui); // Noise // // *** // w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_enable")); s_gui->w_noise_enable = w; g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (noise_enable_cb), s_gui); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->noise_enable); w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid1")); w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_vin")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1); s_gui->w_noise_vin = combo_box; if (sources_ac) { index = 0; active = 0; for (iter = sources_ac; iter; iter = iter->next) { gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data); if (!g_strcmp0(s->noise_vin, iter->data)) active = index; index++; } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s); // FIXME: Should enable more than just one output as in the Fourier analysis w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_vout")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1); s_gui->w_noise_vout = combo_box; if (voltmeters) { index = 0; active = 0; text = g_strdup_printf ("V(%s)", s->noise_vout); for (iter = voltmeters; iter; iter = iter->next) { if (g_strcmp0 (iter->data, "V(0)")) gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data); if (!g_strcmp0(text, iter->data)) active = index; index++; } g_free (text); gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s); // Initialisation of the various scale types w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_type")); gtk_widget_destroy (w); // FIXME wtf?? combo_box = gtk_combo_box_text_new (); gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 2, 1, 1); s_gui->w_noise_type = combo_box; { index = 0; active = 0; for (; scale_types_list[index] != NULL; index++) { gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), scale_types_list[index]); if (!g_strcmp0(s->noise_type, scale_types_list[index])) active = index; } gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active); } g_assert (GTK_IS_COMBO_BOX (combo_box)); g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_npoints")); s_gui->w_noise_npoints = w; gtk_entry_set_text (GTK_ENTRY (w), s->noise_npoints); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_start")); s_gui->w_noise_start = w; gtk_entry_set_text (GTK_ENTRY (w), s->noise_start); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_stop")); s_gui->w_noise_stop = w; gtk_entry_set_text (GTK_ENTRY (w), s->noise_stop); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui); gtk_widget_show_all (toplevel); trans_enable_cb (s_gui->w_trans_enable, s_gui); trans_step_enable_cb (s_gui->w_trans_step_enable, s_gui); ac_enable_cb (s_gui->w_ac_enable, s_gui); dc_enable_cb (s_gui->w_dc_enable, s_gui); fourier_enable_cb (s_gui->w_four_enable, s_gui); noise_enable_cb (s_gui->w_noise_enable, s_gui); g_list_free(sources); g_list_free(voltmeters); g_list_free(voltmeters_with_type); }
static void write_xml_sim_settings (xmlNodePtr cur, parseXmlContext *ctxt, Schematic *sm) { xmlNodePtr sim_settings_node, child,analysis,options; gchar *str; SimSettings *s; SimOption *so; GList *list; s = schematic_get_sim_settings (sm); sim_settings_node = xmlNewChild (cur, ctxt->ns, BAD_CAST"simulation-settings", NULL); if (!sim_settings_node) { g_warning ("Failed during save of simulation settings.\n"); return; } // Transient analysis analysis = xmlNewChild (sim_settings_node, ctxt->ns, BAD_CAST "transient", NULL); if (!analysis) { g_warning ("Failed during save of transient analysis settings.\n"); return; } if (sim_settings_get_trans (s)) str = "true"; else str = "false"; child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "enabled", BAD_CAST str); str = g_strdup_printf ("%g", sim_settings_get_trans_start (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "start", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_trans_stop (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "stop", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_trans_step (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "step", BAD_CAST str); g_free (str); if (sim_settings_get_trans_step_enable (s)) str = "true"; else str = "false"; child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "step-enabled", BAD_CAST str); if (sim_settings_get_trans_init_cond(s)) str = "true"; else str = "false"; child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "init-conditions", BAD_CAST str); // AC analysis analysis = xmlNewChild (sim_settings_node, ctxt->ns, BAD_CAST "ac", NULL); if (!analysis) { g_warning ("Failed during save of AC analysis settings.\n"); return; } child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "enabled", BAD_CAST (sim_settings_get_ac (s) ? "true" : "false") ); str = g_strdup_printf ("%d", sim_settings_get_ac_npoints (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "npoints", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_ac_start (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "start", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_ac_stop (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "stop", BAD_CAST str); g_free (str); // DC analysis analysis = xmlNewChild (sim_settings_node, ctxt->ns, BAD_CAST "dc-sweep", NULL); if (!analysis) { g_warning ("Failed during save of DC sweep analysis settings.\n"); return; } child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "enabled", BAD_CAST (sim_settings_get_dc (s) ? "true" : "false") ); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "vsrc1", BAD_CAST sim_settings_get_dc_vsrc(s)); str = g_strdup_printf ("%g", sim_settings_get_dc_start (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "start1", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_dc_stop (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "stop1", BAD_CAST str); g_free (str); str = g_strdup_printf ("%g", sim_settings_get_dc_step (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "step1", BAD_CAST str); g_free (str); // Fourier analysis analysis = xmlNewChild (sim_settings_node, ctxt->ns, BAD_CAST "fourier", NULL); if (!analysis) { g_warning ("Failed during save of Fourier analysis settings.\n"); return; } child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "enabled", BAD_CAST (sim_settings_get_fourier (s) ? "true" : "false") ); str = g_strdup_printf ("%d", sim_settings_get_fourier_frequency (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "freq", BAD_CAST str); g_free (str); str = g_strdup_printf ("%s", sim_settings_get_fourier_vout (s)); child = xmlNewChild (analysis, ctxt->ns, BAD_CAST "vout", BAD_CAST str); g_free (str); // Save the options list = sim_settings_get_options (s); if ( list ) { options = xmlNewChild (sim_settings_node, ctxt->ns, BAD_CAST "options", NULL); if (!options) { g_warning ("Failed during save of sim engine options.\n"); return; } while ( list ) { so = list->data; child=xmlNewChild (options, ctxt->ns, BAD_CAST "option", NULL); xmlNewChild (child , ctxt->ns, BAD_CAST "name", BAD_CAST so->name); xmlNewChild (child , ctxt->ns, BAD_CAST "value", BAD_CAST so->value); list = list->next; } } }