Beispiel #1
0
/**
 * Get the list of sources (indipendent voltage)
 */ 
gint get_voltage_sources_list(GList **sources, Schematic *sm, GError *e, gboolean ac_only)
{
	GSList *siter, *node_list = NULL;

	node_list = netlist_helper_get_voltage_sources_list (sm, &e, ac_only);
	if (e) {
		log_append_error (schematic_get_log_store (sm), _ ("SimulationSettings"),
		_ ("Failed to create netlist"), e);
		g_clear_error (&e);
		return -1;
	}
	if (node_list == NULL) {
		log_append (schematic_get_log_store (sm), _ ("SimulationSettings"),
			_ ("No node in the schematic!"));
		return -2;
	}

	*sources = NULL;
	for (siter = node_list; siter; siter = siter->next) {
		gchar *tmp;
		tmp = g_strdup_printf ("V%d", atoi (siter->data));
		*sources = g_list_prepend (*sources, tmp);
	}

	return 0;
}
Beispiel #2
0
/**
 * Get the list of voltmeters (test clamps).
 *
 * In normal mode, this does not include the
 * the type of measurement (normal, magnitude,
 * phase, real, imaginary or dB) and it is used
 * in DC and Fourier analysis.
 *
 * In AC mode, each element includes the type
 * of measurement (normal, magnitude, phase,
 * real, imaginary or dB) and it is used in
 * AC analysis.
*/ 
gint get_voltmeters_list(GList **voltmeters, Schematic *sm, GError *e, gboolean with_type)
{
	GSList *siter, *node_list = NULL;

	if (with_type)
		node_list = netlist_helper_get_voltmeters_list (sm, &e, TRUE);
	else
		node_list = netlist_helper_get_voltmeters_list (sm, &e, FALSE);
	if (e) {
		log_append_error (schematic_get_log_store (sm), _ ("SimulationSettings"),
		_ ("Failed to create netlist"), e);
		g_clear_error (&e);
		return -1;
	}
	if (node_list == NULL) {
		log_append (schematic_get_log_store (sm), _ ("SimulationSettings"),
			_ ("No node in the schematic!"));
		return -2;
	}

	*voltmeters = NULL;
	for (siter = node_list; siter; siter = siter->next) {
		gchar *tmp;
		if (with_type)
			tmp = g_strdup (siter->data);
		else
			tmp = g_strdup_printf ("V(%d)", atoi (siter->data));
		*voltmeters = g_list_prepend (*voltmeters, tmp);
	}

	return 0;
}
Beispiel #3
0
void simulation_show (GtkWidget *widget, SchematicView *sv)
{
	GtkWidget *w;
	GtkBuilder *gui;
	GError *e = NULL;
	Simulation *s;
	Schematic *sm;

	g_return_if_fail (sv != NULL);

	sm = schematic_view_get_schematic (sv);
	s = schematic_get_simulation (sm);

	if ((gui = gtk_builder_new ()) == NULL) {
		log_append (s->logstore, _ ("Simulation"),
		            _ ("Could not create simulation dialog - Builder creation failed."));
		return;
	}
	gtk_builder_set_translation_domain (gui, NULL);

	// Only allow one instance of the dialog box per schematic.
	if (s->dialog) {
		gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (s->dialog)));
		return;
	}

	if (gtk_builder_add_from_file (gui, OREGANO_UIDIR "/simulation.ui", &e) <= 0) {
		log_append_error (s->logstore, _ ("Simulation"), _ ("Could not create simulation dialog"),
		                  e);
		g_clear_error (&e);
		return;
	}

	w = GTK_WIDGET (gtk_builder_get_object (gui, "toplevel"));
	if (!w) {
		log_append (s->logstore, _ ("Simulation"),
		            _ ("Could not create simulation dialog - .ui file lacks widget "
		               "called \"toplevel\"."));
		return;
	}

	s->dialog = GTK_DIALOG (w);
	g_signal_connect (G_OBJECT (w), "delete_event", G_CALLBACK (delete_event_cb), s);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "progressbar"));
	s->progress = GTK_PROGRESS_BAR (w);
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (s->progress), 0.0);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "progress_label"));
	s->progress_label = GTK_LABEL (w);

	g_signal_connect (G_OBJECT (s->dialog), "response", G_CALLBACK (cancel_cb), s);

	gtk_widget_show_all (GTK_WIDGET (s->dialog));

	s->sv = sv;
	simulate_cmd (s);
}
Beispiel #4
0
/**
 * 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);
}